java = enum
kotlin = enum class
// 일반 클래스와 마찬가지로 생성자, 프로퍼티 선언
enum class Color(val r: Int, val g: Int, val b: Int) {
    RED(255, 0, 0), ORANGE(255, 165, 0), YELLOW(255, 255, 0),
    GREEN(0, 255, 0), BLUE(0, 0, 255), INDIGO(75, 0, 130),
    VIOLET(238, 130, 238);
    // enum class 안에 메소드를 정의하는 경우 
    // 반드시 상수와 메소드 사이에 세미콜론으로 구분하여야 한다.
    fun rgb() = (r * 256 + g) * 256 + b
}
    println(Color.BLUE.rgb())
-> 255
java의 switch에 해당
// 함수의 반환값으로 when 식을 직접 사용
fun getMnemonic(color: Color) =
    when (color) {
        Color.RED -> "Richard"
        Color.ORANGE -> "of"
        Color.YELLOW -> "York"
        Color.GREEN -> "Gave"
        Color.BLUE -> "Battle"
        Color.INDIGO -> "In"
        Color.VIOLET -> "Vain"
    }
println(getMnemonic(Color.BLUE))
-> Battle
// 한 when 분기 안에 복수의 값 사용 가능
fun getWarmth(color: Color) = when(color) {
    Color.RED, Color.ORANGE, Color.YELLOW -> "warm"
    Color.GREEN -> "natural"
    Color.BLUE, Color.INDIGO, Color.VIOLET -> "cold"
}
인자가 없는 when
-> 인자가 없는 when 식을 사용하면 when식 호출 때마다 불필요한 객체 생성을 막을 수 있다.
fun mixOptimized(c1: Color, c2: Color) = when{
    (c1 == Color.RED && c2 == Color.YELLOW) || (c1 == Color.YELLOW && c2 == Color.RED) -> Color.ORANGE
    (c1 == Color.YELLOW && c2 == Color.BLUE) || (c1 == Color.BLUE && c2 == Color.YELLOW) -> Color.GREEN
    (c1 == Color.BLUE && c2 == Color.VIOLET) || (c1 == Color.VIOLET && c2 == Color.BLUE) -> Color.INDIGO
    else -> throw Exception("Dirty Color")
}
가독성이 떨어지기는 하지만 메모리상으로는 더 효율적이다.