when
의 패턴 매칭 (Pattern Matching in when
)Kotlin의 when
은 단순한 값 비교 외에도 타입, 범위, 조건을 이용한 분기 처리에 아주 강력하다.
이걸 통틀어 패턴 매칭이라고 부르기도 한다.
fun handleInput(input: Any): String {
return when (input) {
is Int -> "정수입니다: $input"
is String -> "문자열입니다: $input"
is List<*> -> "리스트입니다. 크기: ${input.size}"
else -> "알 수 없는 타입입니다"
}
}
특징
is
를 사용하면 타입 비교가 가능하고
그 분기 내부에서는 자동으로 타입이 변환됨 (→ 이게 바로 smart-cast, 아래 설명)
is
를 사용해서 타입을 체크한 이후, Kotlin은 자동으로 캐스팅해준다.
따로 (String)obj
같은 형변환이 필요 없다.
if (obj instanceof String) {
String str = (String) obj;
System.out.println(str.length());
}
if (obj is String) {
println(obj.length) // 자동으로 String으로 인식됨!
}
smart cast는 val 변수에서만 가능하고,
var
이거나, 멀티스레드에서 변경 가능성이 있는 경우엔 스마트 캐스트가 동작하지 않음에 주의해야 한다.
fun test(x: Any) {
if (x is String) {
// ok: x는 val이기 때문에 스마트 캐스트 됨
println(x.length)
}
}
fun test2(x: Any) {
var temp = x
if (temp is String) {
// error: temp는 var이라 스마트 캐스트 안 됨!
// println(temp.length) ❌
}
}