minstudio

15. 고급 Null 제어와 스마트 캐스트 (Smart Cast)

코틀린 컴파일러는 매우 똑똑합니다. 변수가 특정 타입인지 is 연산자로 검사하거나, null이 아님을 if문으로 체크했다면, 이후 블록에서는 자동으로 해당 타입(또는 Non-Null)으로 형변환을 적용해 줍니다. 이를 스마트 캐스트(Smart Cast)라고 합니다.

반면, !! 연산자(Not-null Assertion)는 "이건 절대 null이 아니니까 무조건 통과시켜!" 라고 컴파일러에게 강제하는 위험한 연산자입니다. 런타임 시 NPE가 터질 수 있어 사용을 지양해야 합니다.

🧠 스마트 캐스트 원리 val obj: Any if (obj is String) 컴파일러: "아! 여긴 확실히 String이네!" obj.length (자동 String 캐스팅)
fun printLength(obj: Any) {
    // obj는 최상위 타입인 Any이므로 length 프로퍼티가 없습니다.
    
    // 1. 스마트 캐스트 (is 연산자)
    if (obj is String) {
        // 이 중괄호 안에서는 컴파일러가 obj를 String으로 자동 인식합니다. (캐스팅 문법 필요 없음)
        println("문자열 길이: " + obj.length) 
    } else {
        println("문자열이 아닙니다.")
    }
}

fun printNotNull(str: String?) {
    // str은 Nullable이므로 곧바로 length를 쓸 수 없음
    
    // null이 아님을 검사하면, 블록 내부에서는 자동으로 Non-Null (String)로 스마트 캐스트 됨
    if (str != null) {
        println("안전한 길이: " + str.length)
    }
}

fun main() {
    printLength("안녕하세요")
    printLength(12345)
    
    printNotNull("코틀린")

    // 2. 단언 연산자 (!!) - 극도로 주의!
    var danger: String? = "값"
    // "이건 null이 절대 아니니까 검사 없이 그냥 까!" 라고 강제합니다.
    println(danger!!.length) 
    
    // 만약 null이었다면? -> NullPointerException 폭발 (앱 크래시 발생)
}
15. 고급 Null 제어와 스마트 캐스트 (Smart Cast) | Minstudio