프로그래밍 언어/Kotlin

Kotlin의 class(4) - Enum class

Julie825 2022. 10. 3. 21:29

enum은 enumerated 의 약자로, Enum class는 열거하는 값들의 클래스라고 볼 수 있다.

어떤 변수의 값이 여러개의 옵션 중의 하나로 결정될 때 사용하면 좋다. ex) 동서남북, 요일 등

기본 사용법

각 enum은 쉼표( , )로 구분한다. 내부적으로 Comparable interface를 구현하고 있어서, toString( )을 포함한 편리한 기능을 추가 구현 없이 사용할 수 있다.

enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

val directions: Array<Direction> = Direction.values() // 모든 타입 인스턴스를 배열로 받는다.

 

속성값과 메소드

enum class의 각 enum은 속성값과 abstract function을 가질 수 있다.

역시 쉼표( , )로 구분하며, 마지막 enum 끝에만 세미콜론을 붙이자.

enum class Color(val rgb: Int) {
    
    RED(0xFF0000){
        override fun draw() {
            println("red line")
        }
    },
    GREEN(0x00FF00){
        override fun draw() {
            println("green line")
        }
    },
    BLUE(0x0000FF){
        override fun draw() {
            println("blue line")
        }
    }; // <- 세미콜론

    abstract fun draw()
}

 

속성값이 될 수 없는 식별자(Inbuilt properties)

모든 enum class들은 생성과 동시에 아래 두 속성을 가지게 된다. 이 이름을 내가 사용하려고 들면 안된다.

val name: String // 각 enum을 선언할 때 결정됨. toString()으로 얻을 수 있다.
val ordinal: Int // [Ordering](<https://kotlinlang.org/docs/collection-ordering.html>) 규칙에 따라 0 ~ n-1 의 값을 갖는다.

 

name을 통해 Enum 객체를 받고싶을 때 valueOf() 메서드를 사용할 수 있다.

enum class Direction {
    NORTH, SOUTH, WEST, EAST
}

val north = try {
    Direction.valueOf("NORTH")
} catch (e: Exception) {
    e.printStackTrace() // 이름 틀리면 바로 exception 뜸
    Direction.NORTH
}

 

속성값으로 enum 타입 찾기

'속성값으로 enum 객체 얻기 (value to enum)' 참고

 

EnumMap

enum에 따라 다른 값을 저장하고 싶을 때 사용할 수 있다.

내부 Ordering 규칙에 따라 순서가 지정되고, 이후로 이 순서가 유지된다.

HashMap과 달리 Hash 충돌의 위험이 없다는 것도 장점이다.

 

EnumMap 초기화

// 각 성적의 점수 컷을 저장하는 enum map을 만든다.
enum class Type {A,B,C,D}

// 1. EnumMap(m: MutableMap<K, out V>!) 생성자 사용. 
val initmap = Type.values().associate { it -> it to 0 } // 모든 enum 객체와 Int 0을 페어링함.
val enumMap1 = EnumMap(initmap)

// 2. **EnumMap(keyType: Class<K>!)** 생성자 사용. 빈 맵이 생성됨.
val enumMap2 = EnumMap<Type, Int>(Type::class.java)

Getter / Setter

: 일반적인 map과 방법이 같다.

 


참고한 자료

Kotlin 공식문서 : https://kotlinlang.org/docs/enum-classes.html

Enum Map 공식문서 : https://developer.android.com/reference/kotlin/java/util/EnumMap

참고자료 : https://medium.com/lucky-sonnie/item-37-ordinal-인덱싱-대신-enummap을-사용하라-작성중-8889791bc7e1