코틀린에서는 자바보다 null 처리를 좀 더 명확하게 한다.
코틀린은 기본적으로 값이 notNull로 nullable 표현에만 ?가 사용된다.
따라서 NPE(NullPointerException)가 발생하는 빈도를 현저히 낮출 수 있다.
Nullable types
변수 타입 옆에 물음표(?)를 붙임으로서 null이 가능한 변수임을 명시적으로 표현할 수 있다.
val str: String? = null
Safe call operator
null을 안전하게 처리하기 위해 코틀린은 ?. 연산자를 지원한다.
val str: String? = null
val upperCase = str?.toUpperCase() // null
?. 연산자를 사용하면, 앞의 변수가 null이 아닐때만 오른쪽 함수가 수행되고 null이면 null을 반환한다.
즉, if(str != null) str.toUpperCase() else null 과 같다.
이렇게 긴 문장을 ?. 하나로 표현 가능하다.
var name: String? = null
println("name length: ${name?.length}") // name length: null
물음표를 사용하여 name?.length를 호출해 보면, null이 아닌 경우에만 .length가 실행됨으로 null값을 리턴한다.
반대로 값이 존재하지 않을 수 있지만 특정 구역에서는 값이 절대 null일 수 없다고 확신할 수도 있다.
이때 우리는 non-null 단정 기호 !! 를 사용할 수 있다.
var name: String? = null
println("name length: ${name!!.length}") // NullPointerException 오류
위의 코드에서 만약 non-null 단정 기호(!!)를 사용한다면?
null값을 가질 수 없음으로 NullPointerException 오류가 발생한다.
Elvis operator
?. 연산자는 좌항이 null이면 null을 반환한다. 코드를 작성하다 보면 null인 경우 null이 아닌 default 값을 주고 싶은 경우가 발생한다.
이때 ?: 를 사용할 수 있다.
엘비스 프레슬리 헤어를 닮아서 엘비스 연산자라고 한다.
좀 더 진지한 이름으로는 널 복합(null coalescing) 연산자라는 이름도 있다.
val str: String? = null
val strLength = str?.length ?: "Unknown" // Unknown
위 코드는 if (str != null) str.length else "Unknown" 과 같은 코드다.
?: 연산자는 이항 연산자다. 좌항을 계산한 값이 null인 지 검사하고, null이 아니면 좌항 값을, null이면 우항 값을 반환한다. 엘비스 연산자는 우항으로 return이나 throw도 넣을 수 있다.
val name = student.getName() ?: throw IllegalArgumentException("name expected")
위 코드처럼 throw 를 활용하여 Exception이 발생되도록 구현할 수도 있다.
따라서 간결한 코드로 원하는 형태의 null 처리가 가능하다.
'Android > Kotlin' 카테고리의 다른 글
[Kotlin] Collections(List, Set, Map) (0) | 2021.10.24 |
---|---|
[Kotlin] Extension Function(확장 함수) (0) | 2021.09.07 |
[Kotlin] Higher-Order Function, Lambda(고차 함수와 람다) (0) | 2021.09.07 |
댓글