이미 20년 내외로 개발자들에게 포인터나 참조에 대한 null은 악몽이라고 했다. 사람은 정확하게 작동하는 기계가 아니므로, 그날의 컨디션이나 스트레스 따위로 실수는 언제든 할 수 있다는 점에서 null에 대한 참조는 분명 악몽의 작은 불씨임에는 틀림이 없다.
Kotlin은 참조에 대한 null 값을 최대한 방지하고자 값에 대해 null 값을 가질 수 있는 경우와 null 값을 가지지 못하는 경우로 분명하게 분리를 했으며, 각각에 대해 Nullable과 Non-Null이라는 타입이며 기본적이 Kotlin에서의 값들은 Non-Null 타입이다.
var a:Int = null
위의 코드는 Null can not be a value of a non-null type Int라는 에러가 발생한다. 이를 방지하려면 다음처럼 추가적인 작은 코드가 필요하다.
var a:Int? = null
Null 검사에 대한 Kotlin의 문법에는 ?., ?:, !!, ?.let{} 등이 있다. 하나씩 간략하게 정리한다.
?. 연산자
?.는 값이 null이면 null을 반환하고 구문을 종료하고 null이 아니면 계속 구문을 실행한다는 것이다.
var a:Int? = 10 println(a?.toString()) a = null println(a?.toString())
실행 결과는 다음과 같다.
10 null
>?: 연산자
엘비스 프레슬리의 헤어 스타일을 닮았다고해서 엘비스 연산자랜다. 장난하냐? 여튼, 이 연산자는 값이 null일 경우에 대한 대체값을 지정하기 위한 연산자이다.
var a:Int? = 10 println(a?:"NULL") a = null println(a?:"NULL")
결과는 다음과 같다.
10 NULL
!! 연산자
이 연산자는 값이 null일 수 없으니 걱정말고 실행하라는 의미이다.
var a:Int? = 10 println(a!!.toString()) a = null println(a!!.toString())
첫번째 출력은 10이고, 두번째에서는 값이 null인데 toString() 함수를 호출하고 있어 NullPointerException이 똭! 악몽의 작은 불씨~ 퍽!
?.let{} 구문
이 구문은 값이 null이 아닐 경우 여러 문장을 실행할 수 있는 구문을 제공한다.
var a:Int? = 10 a?.let { println("The world is good place to live.") println("are you kidding me?") } a = null a?.let { println("The world is good place to live.") println("I agree with you.") }
실행 결과는 다음과 같다.
The world is good place to live. are you kidding me?