[Kotlin] Enum class

코랑·2023년 4월 25일
0

android

목록 보기
5/16

정의

가장 기본적인 사용. 타입 안전성 구현시 사용하는~

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

근데 각 constant는 오브젝트임

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

그래서 각 이넘은 이넘 클래스의 인스턴스인거고 초기화가 됨.

Anonymous class

기본 함수 오버라이딩과 함께 익명 클래스에 대응되는 mothod들도 선언할 수 있음.

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

    TALKING {
        override fun signal() = WAITING
    };

    abstract fun signal(): ProtocolState
}

interface 구현

// 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의 모든 constant
  • valueOf(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 => index
enum class RGB { RED, GREEN, BLUE }

println(RGB.RED.name) // prints RED
println(RGB.RED.ordinal) // prints 0

0개의 댓글