Search

Enum classes

열거형 클래스

열거형 클래스의 가장 기본적인 사용 사례는 타입 안전 열거형을 구현하는 것이다.
각 열거형 상수는 객체이고 쉼표로 구분된다.
enum class Direction { NORTH, SOUTH, WEST, EAST }
Kotlin
복사
각 열거형은 열거형 클래스의 인스턴스이므로 다음과 같이 초기화할 수 있다.
enum class Color(val rgb: Int) { RED(0xFF0000), GREEN(0x00FF00), BLUE(0x0000FF) }
Kotlin
복사

익명의 클래스

열거형 상수는 해당 메서드와 함께 자체 익명 클래스를 선언할 수 있을 뿐만 아니라 기본 메서드를 재정의할 수도 있다.
열거형 클래스가 멤버를 정의하는 경우 세미콜론 ; 을 사용하여 상수 정의와 멤버 정의를 구분한다.
enum class ProtocolState { WAITING { override fun signal() = TALKING }, TALKING { override fun signal() = WAITING }; abstract fun signal(): ProtocolState }
Kotlin
복사

enum 클래스에서 인터페이스 구현

열거형 클래스는 인터페이스를 구현할 수 있지만 클래스는 상속할 수 없다.
인터페이스를 구현하기 위해선 모든 상수가 인터페이스 멤버들을 공통으로 구현하거나 각 상수별로 별도의 익명 클래스를 사용해 개별적으로 구현해야 한다.
모든 열거형 클래스는 기본적으로 Comparable 인터페이스를 구현하여 자연스러운 순서로 상수가 정의된다.
// 각 상수별로 익명 클래스를 사용해 인터페이스를 구현 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 }; } // 모든 상수가 공통으로 인터페이스를 구현 enum class IntArithmetics : BinaryOperator<Int>, IntBinaryOperator { PLUS, TIMES; override fun apply(t: Int, u: Int): Int { return when (this) { PLUS -> t + u TIMES -> t * u } } }
Kotlin
복사

열거형 상수로 작업하기

Kotlin에서 Enum 클래스를 사용할 때 상수와 관련된 기능을 제공한다.

valueOf() 메서드와 entries 프로퍼티

EnumClass.valueOf(value: String): EnumClass EnumClass.entries: EnumEntries<EnumClass> // specialized List<EnumClass>
Kotlin
복사
valueOf(value: String)
주어진 이름과 일치하는 상수를 반환한다.
이름이 상수와 일치하지 않으면 IllegalArgumentException이 발생한다.
entries
상수들을 리스트로 반환한다.
EnumEntries<EnumClass> 타입의 값을 반환하며 List<EnumClass>의 특수화된 형태이다.
enum class RGB { RED, GREEN, BLUE } fun main() { for (color in RGB.entries) println(color.toString()) // RED, GREEN, BLUE 출력 println("The first color is: ${RGB.valueOf("RED")}") // "The first color is: RED" 출력 }
Kotlin
복사

name과 ordinal 프로퍼티

println(RGB.RED.name) // prints RED println(RGB.RED.ordinal) // prints 0
Kotlin
복사
name
상수의 이름을 반환한다.
ordinal
상수의 선언 순서를 반환한다.
인덱스는 0부터 시작한다.

enumEntries<T>() 메서드

Kotlin 2.0.0 이전엔 enumValues<T>(), enumValueOf<T>() 를 통해 상수에 접근
Kotlin 2.0.0 이후엔 enumEntries<T>() 를 통해 상수에 접근
enumValues<T>()는 매번 새로운 배열을 생성하는데에 비해 enumEntries<T>()가 더 효율적
enum class RGB { RED, GREEN, BLUE } inline fun <reified T : Enum<T>> printAllValues() { println(enumEntries<T>().joinToString { it.name }) } printAllValues<RGB>() // RED, GREEN, BLUE
Kotlin
복사