728x90
반응형

enum 클래스 정의

자바와 마찬가지로 enum은 단순히 값만 열거하는 존재가 아님

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);

    fun rgb() = (r * 256 + g) * 256 + b
}

enum 클래스 안에 메소드를 정의하는 경우 반드시 enum 상수 목록과 메소드 정의 사이에 세미콜론을 넣어야 함

 


 

when으로 enum 클래스 다루기

자바의 switch와 달리 when 절에서는 각 분기의 끝에 break를 넣지 않아도 됨
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"
}

when과 임의의 객체를 함께 사용

코틀린에서 when은 자바의 switch보다 훨씬 더 강력함
분기 조건에 상수만을 사용할 수 있는 자바 switch와 달리 코틀린 when의 분기 조건은 임의의 객체를 허용함
 
fun mix(c1: Color, c2: Color) =
		when (setOf(c1, c2)) {
		    setOf(RED, YELLOW) -> ORANGE
		    setOf(YELLOW, BLUE) -> GREEN
		    setOf(BLUE, VIOLET) -> INDIGO
		    else -> throw Exception("Dirty color")
		}

인자 없는 when 사용

이전의 함수는 비교대상을 Set 인스턴스를 통해 생성함
보통은 이런 비효율성이 크게 문제가 되지 않음
하지만 이 함수가 아주 자주 호출된다면 불필요한 가비지 객체가 늘어나기에 이를 방지하기 위해 함수를 고쳐 쓰는 편이 나음
fun mixOptimized(c1: Color, c2: Color) =
    when {
        (c1 == RED && c2 == YELLOW) ||
        (c1 == YELLOW && c2 == RED) ->
            ORANGE

        (c1 == YELLOW && c2 == BLUE) ||
        (c1 == BLUE && c2 == YELLOW) ->
            GREEN

        (c1 == BLUE && c2 == VIOLET) ||
        (c1 == VIOLET && c2 == BLUE) ->
            INDIGO

        else -> throw Exception("Dirty color")
    }

추가 객체를 만들지 않는다는 장점이 있지만 가독성은 더 떨어짐


스마트 캐스트: 타입 검사와 타입 캐스트를 조합

코틀린에서는 is를 사용해 변수 타입을 검사함
is 검사는 자바의 instanceof와 비슷
하지만 자바에서 어떤 변수의 타입을 instanceof로 확인한 다음에 그 타입에 속한 멤버에 접근하기 위해서는 명시적으로 변수 타입을 캐스팅해야 함
코틀린에서는 프로그래머 대신 컴파일러가 캐스팅을 해줌
이를 스마트캐스트라고 함
fun eval(e: Expr): Int {
    if (e is Num) {
        val n = e as Num
        return n.value
    }
    if (e is Sum) {
        return eval(e.right) + eval(e.left)
    }
    throw IllegalArgumentException("Unknown expression")
}

리팩토링: if를 when으로 변경

코틀린에서는 if가 값을 만들어내기 때문에 자바와 달리 3항 연산자가 따로 없음
fun eval(e: Expr): Int =
    if (e is Num) {
        e.value
    } else if (e is Sum) {
        eval(e.right) + eval(e.left)
    } else {
        throw IllegalArgumentException("Unknown expression")
    }

when 식을 앞에서 살펴본 값 동등성 검사가 아닌 다른 기능에도 쓸 수 있음

fun eval(e: Expr): Int =
    when (e) {
        is Num ->
            e.value
        is Sum ->
            eval(e.right) + eval(e.left)
        else ->
            throw IllegalArgumentException("Unknown expression")
    }
반응형

'프로그래밍 > Kotlin' 카테고리의 다른 글

코틀린의 예외 처리  (0) 2022.01.12
코틀린 기초(while과 for)  (0) 2022.01.11
코틀린 기초(클래스와 프로퍼티)  (0) 2022.01.06
코틀린 기초(함수와 변수)  (0) 2022.01.05
코틀린 응용  (0) 2022.01.04
복사했습니다!