← 질문 목록
#82깊이 0
널 검사를 했는데도 안전 호출이 필요한 때는?
검사와 사용 사이에 값이 바뀔 수 있거나 getter 결과가 달라질 수 있으면 컴파일러가 스마트 캐스트를 보장하지 않는다. 지역 val로 고정하거나 ?.로 접근해야 한다.
| 기준 | 스마트 캐스트 가능 | 안전 호출 필요 |
|---|---|---|
| 값 안정성 | 지역 val·안정된 var | 변경 가능 프로퍼티 |
| 재조회 결과 | 같다고 증명 | 달라질 수 있음 |
Kotlin은 String과 String?를 다른 타입으로 취급한다. 안전 호출과 Elvis 연산자는 null 경로를 명시한다. !!는 null이면 런타임 예외를 던져 컴파일 시 안전성을 포기한다.
Java에서 온 플랫폼 타입은 널 가능성이 타입에 확정되지 않는다. 경계에서 어노테이션과 검증으로 불확실성을 좁혀야 내부의 널 안전성이 유지된다.
안전 호출을 길게 잇는 방식은 실패 원인을 숨길 수 있다. 반드시 있어야 하는 값은 초기에 검사하고 의미 있는 오류로 바꾸는 편이 낫다.