가장 기본적인 사용. 타입 안전성 구현시 사용하는~
enum class Direction {
NORTH, SOUTH, WEST, EAST
}
근데 각 constant는 오브젝트임
enum class Color(val rgb: Int) {
RED(0xFF0000),
GREEN(0x00FF00),
BLUE(0x0000FF)
}
그래서 각 이넘은 이넘 클래스의 인스턴스인거고 초기화가 됨.
기본 함수 오버라이딩과 함께 익명 클래스에 대응되는 mothod들도 선언할 수 있음.
enum class ProtocolState {
WAITING {
override fun signal() = TALKING
},
TALKING {
override fun signal() = WAITING
};
abstract fun signal(): ProtocolState
}
// interface implement
enum class IntArithmetics : BinaryOperator<Int>, IntBinaryOperator {
PLUS {
override fun apply(t: Int, u: Int): Int = t + u // BinaryOperator implement
},
TIMES {
override fun apply(t: Int, u: Int): Int = t * u // BinaryOperator implement
};
override fun applyAsInt(t: Int, u: Int) = apply(t, u) // IntBinaryOperator implement
}
// 실행
val a = 13
val b = 31
for (f in IntArithmetics.values()) {
println("$f($a, $b) = ${f.apply(a, b)}")
}
// 결과
PLUS(13, 31) = 44
TIMES(13, 31) = 403
제공하는 것들
Enum class
values()
: enum class의 모든 constantvalueOf(value)
value라는 name을 가진 constant를 찾음. 얘는 이름 잘못되면 IllegalArgumentException 발생하니까 주의해야함enum class RGB { RED, GREEN, BLUE }
fun main() {
for (color in RGB.values()) println(color.toString()) // prints RED, GREEN, BLUE
println("The first color is: ${RGB.valueOf("RED")}") // prints "The first color is: RED"
}
enumValues<T>
: values 인데 제네릭 사용할 수 있는~enumValuesOf<T>
: valueOf 인데 제네릭 사용할 수 있는~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
entries
: values대신 쓸수있음 1.8.20버전부터 추가됨. immutable list여서 collections를 사용할 수 있음. 실험적 요소라 사용하려면 @OptIn(ExperimentalStdlibApi)
요거 붙여주고 버전 1.9로 맞춰줘야함.enum class RGB { RED, GREEN, BLUE }
@OptIn(ExperimentalStdlibApi::class)
fun main() {
for (color in RGB.entries) println(color.toString())
// prints RED, GREEN, BLUE
}
Enum의 각 constant
name
=> string 형태의 이름ordinal
=> indexenum class RGB { RED, GREEN, BLUE }
println(RGB.RED.name) // prints RED
println(RGB.RED.ordinal) // prints 0