enum & when

enum

java = enum
kotlin = enum class

  • kotlin에서 enum은 soft keyword로, 'class' 앞에 있을 때는 특별한 의미지만 그 외에는 이름에 사용할 수 있다.
  • enum 클래스 안에도 프로퍼티나 메소드를 정의할 수 있다.
// 일반 클래스와 마찬가지로 생성자, 프로퍼티 선언
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


when

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

  • Java와 달리 각 분기 끝에 break 필요 X
// 한 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")
}

가독성이 떨어지기는 하지만 메모리상으로는 더 효율적이다.

  • when에 인자가 없으려면 각 분기의 조건이 bool값을 계산하는 식이어야 한다.

좋은 웹페이지 즐겨찾기