코틀린 (Kotlin) 조건문과 enum, when, 캐스팅 정리

코틀린 enum

코틀린 enum 은 자바의 enum 처럼 사용 가능합니다.
코틀린 enum 은 enum class 입니다.
그리고 프로퍼티와 함수를 선언할 수 있습니다.

enum class Color(val r: Int, val g: Int, val b: Int) { //상수 프로퍼티 정의

    RED(255,0,0),         //상수 생성시 프로퍼티 값 지정
    ORANGE(111,111,111),
    GREEN(222,222,222),
    BLUE(333,333,333); //<- 세미콜린 필수. 구분 역할

    fun rgb() = (r * 256 + g) * 256 + b //함수 정의
}

Color.BLUE.rgb() //rgb 함수호출


위 코드처럼 상수 프로퍼티를 선언하고 함수를 호출할 수 있습니다.
기억해야될 점은 상수와 함수 사이에 세미콜론(;)이 꼭 들어가야된다는 것입니다.

코틀린 when 조건문

자바의 switch 문을 코틀린에서는 when 이 대신할 수 있습니다.

fun getColorStr(color: Color) =  when (color) {
    Color.RED -> "red"
    Color.ORANGE -> "orange"
    Color.BLUE, Color.GREEN -> "blue and green" // or 임
    else -> "unknown"
}

when 은 switch 처럼 break 가 필요없습니다.
여러 조건을 매칭하고 싶은경우 콤마(,)으로 구분할 수 있습니다.
else 로 조건에 맞지 않을때 행동을 정의할 수 있습니다.

fun getColorMixStr(color1: Color, color2 : Color) =
    when (setOf(color1, color2)) {
        setOf(Color.ORANGE, Color.GREEN) -> "blue and green" //and 임
        else -> "unknown"
}

when 식에 setOf() 를 사용해서 그룹을 정의할 수 있습니다.
color1, color2 를 Set 으로 묶어 when 조건절의 setOf(Color.ORANGE, Color.GREEN))과 일치하는지 체크할 수 있습니다.
참고로 setOf() 는 순서에 관계없이 포함여부만 체크합니다.

인자없는 when

setOf() 인스턴스를 생성하는 것이 성능상 문제가되는 경우 아래 코드처럼 인자없이 when 을 사용할 수 있습니다.

fun getColorMixStr(color1: Color, color2 : Color) =
    when {
        (color1 == Color.ORANGE && color2 == Color.GREEN) ||
        (color1 == Color.GREEN && color2 == Color.ORANGE) ->
            Color.ORANGE
    else -> Color.GREEN
}

코틀린 캐스팅

코틀린에서는 스마트 캐스팅을 할 수 있습니다.
is 로 조건 검사를하고 as 로 캐스팅을 합니다.
이때 is 로 검사되면 as 로 캐스팅없이 바로 사용할 수 있습니다.
이것은 컴파일러가 캐스팅을 수행해 주기때문인데 이것을 스마트 캐스팅이라고 합니다.

if (e is String) {
    val str = e as String //캐스팅해서 사용
}
if (e is String) {
    val str = e.toString() //바로 사용
}

주의할 점은 스마트 캐스팅은 val 로 선언된 값이 바뀌지않는 경우에만 가능합니다.

코틀린 if 조건문

코틀린의 if 조건문은 식이기때문에 3항 연산자가 없습니다.
if 조건문에서 블럭안에 return 없이 마지막 식이 결과값이 됩니다.
또한 블럭없이 사용할 수도 있습니다.

if (e is Num) { //체크
    e.num //마지막 값이 결과값. 스마트 캐스팅
} else if (e is Sum) {
    e.sum  //마지막 값이 결과값. 스마트 캐스팅
} else {
    throw IllegalArgumentException("Unknown")
}

if 조건문 대신 when 조건문

when 조건문에 값을 넣어 is 로 체크한다음 스마트 캐스팅이 가능합니다.

when (e) {
    is Num -> e.num //스마트 캐스팅
    is Sum -> e.sum  //스마트 캐스팅
    else -> throw IllegalArgumentException("Unknown")

//블럭사용
when (e) {
    is Num -> {
        e.num
    }
    is Sum -> {
        e.sum
    }
    else -> throw IllegalArgumentException("Unknown")
}

댓글

이 블로그의 인기 게시물

코틀린 (Kotlin) filter, map, all, any, count, find, groupBy, flatMap 함수 정리

코틀린 (Kotlin) 인터페이스 정리

RecyclerView 에서 notifyItemChanged()의 payload 이해하기