(널 아님 단언보다는 가능하면) 덜 무딘 도구를 사용하거나 코드 제어 흐름을 고쳐 써서 컴파일러가 스마트 캐스트를 적용할 수 있게 하는 편이 더 낫다.
"!! (non-null assertion)"보다 더 안전하고 세련된 방식으로 null을 처리하는 기법들을 지칭합니다.
즉, !!
는 컴파일러의 경고를 무시하고 null이 아님을 강제로 단언하는 **"무딘 도구"**이며, "덜 무딘 도구"는 다음과 같은 대안들을 의미합니다:
?.let { ... }
널이 아닐 때만 블록을 실행하게 하므로, 안전하게 null 처리를 할 수 있습니다.
fun sayHello() {
name?.let {
println(it.uppercase()) // name이 null이면 아무 일도 안 일어남
}
}
if (name != null)
+ 스마트 캐스트!!
없이 컴파일러가 자동으로 타입을 좁혀줍니다.
fun sayHello() {
if (name != null) {
println(name.uppercase()) // 스마트 캐스트로 name은 non-null String
}
}
?:
)를 통한 기본값 처리fun sayHello() {
println((name ?: "Anonymous").uppercase())
}
!!
는 왜 "무딘 도구"인가?!!
는 예외 발생을 감수하고 강제로 non-null을 선언하는 무식한 방법입니다.?.let
, if != null
, ?:
는 스마트 캐스트를 유도하여 타입 안정성과 코드 안정성까지 챙깁니다.