본문 바로가기
Android/Kotlin

[Kotlin] 코틀린 null 처리 - Safe call, non-null, Elvis operator

by Dani K 2021. 10. 24.

코틀린에서는 자바보다 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 처리가 가능하다.

 

 

댓글