코틀린의 when은 자바의 switch를 대체할 수 있으면서 더 강력하고 자주 사용되는 코틀린의 요소이다. when에 대해 설명하는 과정에서 enum을 선언하는 방법 또한 체크한다.
package kotlinBasic
enum class Color {
RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
}
위 예시 코드는 간단한 enum클래스를 정의한 것이다.
enum은 자바 선언 보다 코틀린 선언에 더 많은 키워드를 써야 하는 흔치 않은 예라고 한다. 자바와 코틀린의 enum의 차이점을 간단히 체크하면 코틀린에서는 enum class를 사용하고 자바에서는 enum을 사용하는 부분이다.
코틀린에서는 enum을 Soft Keyword라고 부른다. 자바와 마찬가지로 단순 값만 열거하는 게 아닌 enum 클래스 안에 Property나 Method를 정의할 수 있다.
예를 들어 책에서 제공하는 예시를 통해 Property가 있는 enum 클래스를 만들어보면 아래와 같다.
package kotlinBasic
enum class Color(val r: Int, val g: Int, val b: Int) {
RED(255, 0, 0), ORANGE(255, 165, 0),
YELLOW(225, 225, 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 class안에 메서드를 정의해야 하는 경우 반드시 enum 상수 목록과 메서드 정의 사이에 세미콜론;을 넣어야 한다.
자바의 switch문에 해당하는 코틀린의 구성 요소가 when식이다. 문이 아닌 식이기 때문에 식이 본문인 함수에 when을 바로 사용 가능하다는 점을 체크해야 한다.
fun getMnemonic(color: Color) = when (color) {
Color.RED -> "빨강"
Color.BLUE -> "파랑"
Color.GREEN -> "초록"
Color.INDIGO -> 3
Color.ORANGE -> 2
Color.VIOLET -> "Violet"
Color.YELLOW -> 1
}
when을 통해 Color로 전달된 값과 같은 분기를 찾는다. 특징을 체크해 보면 각 분기의 끝에서 자바와 같이 break를 넣지 않아도 된다는 점이다.
또, 분기 안에서 여러 값을 매치 패턴으로 사용이 가능하다. 이런 경우 값 사이에 ,를 넣어 분리해준다. 간단히 예시 코드만 보면 Color.YELLOW, Color.RED -> 1 이렇다.
fun getMnemonic(color: Color) = when (color) {
BLUE -> "파랑"
GREEN -> "초록"
INDIGO -> 3
ORANGE -> 2
VIOLET -> "Violet"
YELLOW, Color.RED -> 1
}
코드를 보면 위와 달리 앞에 Color.이 빠지게 된다. 이렇게 사용할 수 있는 이유는 enum 상수를 모두 임포트했기 떄문이다. 함수를 사용하는 클래스 위에서 import kotlinBasic.Color.*와 같이 스타 임포트를 넣어 enum 상수를 모두 임포트해 짧은 이름으로 사용할 수 있다.
코드만 보더라도 짧아진 것을 확인할 수 있다.