Map에 각괄호를 사용해 값을 가져오면 널이 될 수 있는 결과를 얻을 수 있다. 각괄호에 해당하는 연산의 기저 구현인 자바 코드가 null을 돌려주기 때문이다.
NullableTypes/NullableInMap.kt
import atomictest.eq
fun main() {
val map = mapOf(0 to "yes", 1 to "no")
val first: String? = map[0]
val second: String? = map[2]
first eq "yes"
second eq null
}
어떤 값이 null이 될 수 있는지를 아는 것이 왜 중요할까? 많은 연산은 암시적으로 null이 아닌 결과를 가정한다. 예를 들어 멤버 함수는 수신 객체가 null이면 예외를 발생시키면서 실패한다. 자바에서 이런 멤버 함수 호출은 NullPointerException(줄여서 NPE라고 함)을 발생시키며 실패한다. 자바에서는 거의 대부분의 값이 null이 될 수 있기 때문에 함수 호출이 언제든 이런 식으로 끝날 가능성이 있다. 이 경우에는 결과가 null인지 검사하는 코드를 작성하거나, null 가능성을 차단해주는 코드의 다른 부분에 의존해야 한다.