15. 고급 Null 제어와 스마트 캐스트 (Smart Cast)
코틀린 컴파일러는 매우 똑똑합니다. 변수가 특정 타입인지 is 연산자로 검사하거나, null이 아님을 if문으로 체크했다면, 이후 블록에서는 자동으로 해당 타입(또는 Non-Null)으로 형변환을 적용해 줍니다. 이를 스마트 캐스트(Smart Cast)라고 합니다.
반면, !! 연산자(Not-null Assertion)는 "이건 절대 null이 아니니까 무조건 통과시켜!" 라고 컴파일러에게 강제하는 위험한 연산자입니다. 런타임 시 NPE가 터질 수 있어 사용을 지양해야 합니다.
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 폭발 (앱 크래시 발생)
}