Programming Language/Kotlin

[Kotlin] Enum class란

Tenacity_Dev 2022. 12. 31. 18:18
728x90

Enum class

열거형 클래스는 형식이 안전한 열거형을 구현하는 것입니다.

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

내부의 각각의 상수들은 오브젝트이다.

각 열거형 상수는 개체이다. 열거형 상수는 쉼표로 구분된다.

 

열거형 클래스는 다음과 같이 초기화할 수 있다.

enum class Color(val rgb: Int) {
    RED(0xFF0000),
    GREEN(0x00FF00),
    BLUE(0x0000FF)
}

 

Anonymous classes

열거형 상수는 해당 메서드와 재정의 기본 메서드를 사용하여 고유한 익명 클래스를 선언할 수 있습니다.

enum class ProtocolState {
    WAITING {
        override fun signal() = TALKING
    },

    TALKING {
        override fun signal() = WAITING
    };

    abstract fun signal(): ProtocolState
}

enum 클래스가 멤버를 정의하는 경우 세미콜론으로 멤버 정의에서 상수 정의를 구분합니다.

 

enum class에서 interface 구현

enum class는 interface를 구현할 수 있지만(클래스에서 파생될 수는 없다.) 모든 항목에 대한 인터페이스 멤범의 공통 구현 또는 익명클래스 내의 각 항목에 대한 개별 구현을 제공한다. 구하려는 interface를 다음과 같이 enum class 선언에 추가하면 된다.

enum class IntArithmetics : BinaryOperator<Int>, IntBinaryOperator {
    PLUS {
        override fun apply(t: Int, u: Int): Int = t + u
    },
    TIMES {
        override fun apply(t: Int, u: Int): Int = t * u
    };

    override fun applyAsInt(t: Int, u: Int) = apply(t, u)
}

 

Working with enum constants

kotlin의 열거형 클래스에는 정의된 열거형 상수를 나열하고 이름으로 열거형 상수를 가져오는 합성 방법이 있습니다. 이러한 메서드의 서명은 다음과 같다. (enum 클래스의 이름을 EnumClass라고 가정)

EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>

valueOf() 메서드는 지정된 IllegalArgumentException 이름이 클래스에 정의된 열거형 상수와 일치하지 않는 경우 오류를 발생시킵니다.

 

enumValues<T>() 및 enumValueOf<T>() 함수를 사용하여 일반적인 방식으로 enum 클래스의 상수에 액세스 할 수 있습니다.

enum class RGB { RED, GREEN, BLUE }

inline fun <reified T : Enum<T>> printAllValues() {
    print(enumValues<T>().joinToString { it.name })
}

printAllValues<RGB>() // prints RED, GREEN, BLUE

모든 enum 상수에는 enum 클래스 선언에서 이름과 위치(0부터 시작)를 얻기 위한 속성이 있습니다.

val name: String
val ordinal: Int

 

 

참고 

https://kotlinlang.org/docs/enum-classes.html#anonymous-classes

 

코틀린 공식 문서를 참고하였습니다.

728x90