Enum클래스
type-Safe(타입을 판벼할 수 있어서 Runtime 오류가 일어나지 않고 compile 시 문제를 잡을 수 있다.)한 열거 값을 구현하는 데 사용한다.
enum class Direction{
NORTH, SOUTH, WEST, EAST
}
각 Enum 상수는 객체이다. 그리고 Enum 상수는 콤마(,)를 통해 나눠진다.
초기화
각 enum값은 enum클래스의 인스턴스로 초기화할 수 있다.
enum class Color(val rgb: Int){
RED(0XFF0000),
GREEN(0X00FF00),
BLUE(0x0000FF)
}
익명 클래스
enum상수는 자신만의 익명 클래스를 사용할 수 있다.
fun main() {
println(ProtocolState.WAITING.signal())
println(ProtocolState.WAITING)
}
enum class ProtocolState {
WAITING {
override fun signal() = TALKING
},
TALKING {
override fun signal() = WAITING
};
abstract fun signal(): ProtocolState
}
-결과-
TALKING
WAITING
enum 상수는 자기자신을 추상화해서 각 상수에서 재정의 할 수 있습니다.
Enum클래스 에서 인터페이스 상속
enum클래스는 인터페이스 상속이 가능하다 (그러나 클래스에서 파생할 순 없다). enum클래스에서 인터페이스 멤버에 대해 공통구현하면 모든 Enum 상수에서 사용할 수 있으며, 각 enum 상수에서 개별구현을 통해 서로 다른 기능을 구현할 수 있다.
import java.util.function.*
import IntArithmetics.*
fun main() {
println(PLUS.apply(1, 2))
println(TIMES.apply(3, 4))
println(PLUS.applyAsInt(5, 5))
}
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)
}
-결과-
3
12
10
enum상수 사용
enum 클래스는 enum 상수를 배열로 반환하거나 이름으로 상수를 가져올 수 있는 합성(synthetic) 메서드를 제공한다. 두 메서드의 시그니처는 다음과 같다.
EnumClass.valueOf(value: String): EnumClass
EnumClass.values(): Array<EnumClass>
실 사용 예제는 다음과 같다.
enum class RGB { RED, GREEN, BLUE }
fun main(){
val rgbList = RGB.values()
println("MyColor is ${RGB.valueOf("RED")}")
for(i in rgbList){
println("RGB element is $i")
}
}
-결과-
MyColor is RED
RGB element is RED
RGB element is GREEN
RGB element is BLUE
만약 valueOf 메서드에 존재하지않는 Enum 상수를 넣게되면 IllegalArgumentException 이 발생할 수 있으니 주의해야한다.
enum class RGB{ RED, GREEN, BLUE}
inline fun <reified T : Enum<T>> printAllValues() {
print(enumValue<T>().jointoString { it.name })
}
printAllValues<RGB>()
-결과-
RED, GREEN, BLUE
모든 enum상수에는 enum클래스에 선언한 상수의 이름과 위치를 제공하는 프로퍼티가 존재한다.
1.9.0
코틀린 1.9.0버전에서 entries 프로퍼티는 values() 의 대체 함수로써 소개되었다. entries 프로퍼티는 enum 상수의 불변 리스트를 반환한다.
enum class RGB { RED, GREEN, BLUE }
fun main() {
for (color in RGB.entries) println(color.toString())
}
-결과-
RED
GREEN
BLUE
또한 모든 enum 상수는 이름을 반환하는 name 속성과 위치를 반환하는 ordinal 속성을 가지고 있다.
println(RGB.RED.name)
println(RGB.RED.ordinal)
-결과-
RED
0
'코틀린' 카테고리의 다른 글
중첩 클래스와 내부 클래스 (0) | 2023.09.18 |
---|---|
제네릭 ( in & out) (0) | 2023.09.14 |
봉인된 클래스 및 인터페이스(Seald Class & Interface) (0) | 2023.04.10 |
데이터 클래스(Data Class) (0) | 2023.03.20 |
확장(Extensions) (0) | 2023.03.07 |