[Kotlin] 5-9. Null 안전성

안전한 호출

b?.length

이 코드는 b가 null이 아니면 b.length를 리턴하고 그렇지 않으면 null을 리턴한다

엘비스 연산자

null 가능 레퍼런스인 r에 대해, “ r이 null이 아니면 그것을 사용하고 그렇지 않으면 다른 not-null 값인 x를 사용한다”는 코드를 다음과 같이 작성할 수 있다

val l: Int = if(b != null) b.length else -1

완전한 if식 외에, 엘비스 연산자인 ?:를 사용해서 다음과 같이 표현할 수도 있다

val l: Int = b?.length ?: -1

?:의 왼쪽 식이 null이 아니면, 엘비스 연산자는 그것을 리턴하고, 그렇지 않으면 오른쪽 식을 리턴한다. 오른쪽 식은 왼쪽이 null일 경우에만 평가한다

!!연산자

!!연산자는 NPE를 선호하는 개발자를 위한 옵션이다. b!!라고 작성하면 b가 bull이 아니면 b를 리턴하고(예를들어 String), null이면 NPE를 발생한다

val l = b!!.length

따라서 NPE를 원한다면 이 연산자를 사용하면 된다. 하지만, NPE는 명시적으로 사용해야 하며 뜻밖의 코드에서 나타나지 않도록 한다

안전한 타입 변환

일반 타입 변환은 객체가 지정한 타입이 아니면 ClassCastException을 발생한다. 타입 변환 방법을 위한 다른 방법은 타입 변환에 실패하면 null을 리턴하는 안전한 타입 변환을 사용하는 것이다

val aInt: Int? = a as? Int

null 가능 타입의 콜렉션

null 가능 타입의 요소를 갖는 콜렉션에서 null이 아닌 요소를 걸러내고 싶다면, filterNotNull 를 사용한다

val nullableList: List<Int?> = listOf(1, 2, null, 4)
val inList: List<Int> = nullableList.filterNotNull()