Kotlin - when의 패턴 매칭과 smart-cast

박경희·2025년 3월 21일
0

강의 복습 및 정리

목록 보기
36/40

1. 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, 아래 설명)


2. 스마트 캐스트 (Smart Cast)

is를 사용해서 타입을 체크한 이후, Kotlin은 자동으로 캐스팅해준다.
따로 (String)obj 같은 형변환이 필요 없다.

예: Java 스타일과 Kotlin 스타일 비교

if (obj instanceof String) {
    String str = (String) obj;
    System.out.println(str.length());
}
if (obj is String) {
    println(obj.length) // 자동으로 String으로 인식됨!
}
  • Kotlin에서는 타입 검사 이후, 안전하다고 판단되면 해당 블록 안에서 obj가 자동으로 그 타입으로 캐스팅 된다.

Smart Cast가 안 되는 경우도 있음

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) ❌
    }
}

0개의 댓글