expression
이므로 다음과 같이 쓸 수 있다.break
를 넣지 않아도 된다.enum class Color(val r: Int, val g: Int, val b: Int) { // 상수의 프로퍼티를 정의한다.
RED(255, 0, 0),
GREEN(0, 255, 0),
BLUE(0, 0, 255); // 메소드 구분을 위해 세미콜론 사용
fun rgb() = (r * 256 + g) * 256 + b
}
fun getColor(color: Color) =
when (color) {
Color.RED -> "빨강"
Color.GREEN -> "초록"
Color.BLUE -> "파랑"
}
fun getColor(color: Color) =
when (color) {
Color.RED, Color.GREEN-> "빨초"
Color.BLUE -> "파랑"
}
임의의 객체
를 허용한다.fun getColor(c1: Color, c2: Color) =
when (setOf(c1, c2)) {
setOf(Color.RED, Color.BLUE) -> "PURPLE"
setOf(Color.RED, Color.GREEN) -> "YELLOW"
else -> "NOTHING"
}
fun mixOptimized(c1: Color, c2: Color) =
when {
(c1 == Color.RED && c2 == Color.BLUE) ||
(c1 == Color.BLUE && c1 == Color.RED) -> "PURPLE"
(c1 == Color.RED && c2 == Color.GREEN) ||
(c1 == Color.GREEN && c1 == Color.RED) -> "YELLOW"
else -> "NOTHING"
}
is
를 사용해 변수 타입을 검사한다. (Java의 instanceof
와 비슷하다)is
로 검사하고 나면 굳이 변수를 원하는 타입으로 캐스팅하지 않아도 컴파일러가 대신 캐스팅을 해주기 때문에 바로 사용 가능하다. 이를 스마트 캐스트
라고 한다.interface Expr
// 단지 여러 타입의 expression 객체를 아우르는 공통 타입 역할
class Num(val value: Int) : Expr
// value 라는 프로퍼티만 존재하는 단순한 클래스로 Expr 인터페이스를 구현한다.
class Sum(val left: Expr, val right: Expr) : Expr
// Expr 타입의 객체라면 어떤 것이나 Sum 연산의 인자가 될 수 있다.
fun eval(e: Expr): Int =
when (e) {
is Num -> e.value
is Sum -> eval(e.left) + eval(e.right)
else -> throw IllegalArgumentException("Unknown expression")
}
스마트 캐스트
는 is
로 변수에 든 값의 타입을 검사한 다음에 그 값이 바뀔 수 없는 경우에만 작동한다.
ex) 클래스의 프로퍼티에 대해 스마트 캐스트
를 사용한다면 그 프로퍼티는 반드시 val
이어야 하고 커스텀 접근자를 사용한 것이어도 안된다. 해당 프로퍼티를 다른 클래스가 상속하면서 커스텀 접근자를 정의함으로써 스마트 캐스트의 요구 사항을 깰 수 있기 때문이다.
원하는 타입으로 명시적으로 타입 캐스팅하려면 as
키워드를 사용한다.
val name = e as Num