열거형 클래스
•
열거형 클래스의 가장 기본적인 사용 사례는 타입 안전 열거형을 구현하는 것이다.
•
각 열거형 상수는 객체이고 쉼표로 구분된다.
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
복사