
💡 개요
코드를 작성하다 보면 NullPointerException(NPE)를 자주 접할 수 있다.
이 예외는 Null 값을 참조하는 경우에 발생하는 예외이다.
생각보다 NPE는 자주 발생하며 코드가 길어질수록 그 원인을 파악하기 힘든 경우가 많다.
그래서 Kotlin에서는 Null에 대한 처리를 명확하게 하여 NPE의 발생빈도를 낮추고자 했다.
오늘은 Kotlin에서 Null을 어떻게 다루는지에 대해 알아보고자 한다.
💡 Type 1 : '?' 연산자
코틀린에서는 기본적으로 Null 값을 허용하지 않는다.
대신 '?'를 붙여 Null이 올 수도 있는 변수임을 명시적으로 표현할 수 있다.
아래와 같이 '?'연사자를 사용하지 않은 변수 a의 경우 Null 값을 넣으면 Error가 발생한다.
하지만 '?' 연산자를 사용한 변수 b의 경우 Null 값을 넣어도 Error가 발생하지 않는다.

하지만 주의해야 할 점은 변수 b의 경우 현재 Null 값이 올 수 있음을 명시했기 때문에
실제 변수 b를 사용할 때는 아래 예시와 같이 Null Check를 해줘야 한다.
var b: String? = null
if(b != null)
println(b)
💡 Type 2 : '?.' 연산자(= Safe Call)
'?.' 연사자는 '?'에 '.'을 함께 사용한다.
이 연산자의 의미는 만약 변수가 Null이 아니라면 우측을 실행하고, Null일 경우에는 Null을 반환한다는 의미이다.
아래 코드를 보면 변수 str1은 Null이 아니기 때문에 뒤에 "World"가 붙어 출력이 되는 것을 볼 수 있다.
반면에 변수 str2의 경우 Null이기 때문에 '?.' 연산자가 Null을 반환해 Null을 출력하고 있다.
var str1: String? = "Hello"
var str2: String? = null
println(str1?.plus("World"))
println(str2?.plus("World"))

Java와 비교한다면 '?.' 연산자는 '조건 ? 참 : 거짓'과 비슷하다고 할 수 있다.
💡 Type 3 : '?:' 연산자(= Elvis Operator)
이 연사자는 'Elvis Operator'라고 불리는데 엘비스 프레슬리의 머리를 닮았다고 해서 이름이 그렇게 붙었다고 한다.
'?:' 연산자는 앞선 '?.'와 유사한데, 조금 다른 부분이 있다.
'?.'의 경우 Null일 경우 무조건 Null을 반환하는데 반해 '?:'의 경우는 Null일 경우 Default값을 설정할 수 있다.
var str: String? = null
println(str ?: "Hello")// Null일 경우 "Hello"값을 반환한다는 의미

💡 Type 4 : '!!' 연산자
아까 '?' 연산자를 사용하면 변수에 Null 값을 암묵적으로 허용한다고 했다.
그리고 '?' 연산자를 사용한 변수는 사용하기 전 Null Check를 해야 한다고도 했다.
근데 '?' 연산자를 사용한 모든 변수에 대해 Null Check을 해주기는 상당히 귀찮은 일이다.
그래서 Kotlin에서는 Null을 허용한 변수지만, 절대 Null 값이 오지 않는다는 것을 선언할 수 있다.
그것이 바로 '!!' 연산자다.
Null을 허용하는 변수로 선언했지만 흐름상 Null이 올 수 없는 경우에는 '!!' 연산자를 사용해 Null Check를 피할 수 있다.
var str: String? = "Hello"
println(str!!)
하지만 '!!' 연산자를 사용했는데 Null 값이 온다면 NPE가 발생할 수 있기 때문에 주의하여 사용해야 한다.
var str: String? = null
println(str!!)

💡 참고
https://kotlinlang.org/docs/null-safety.html
Null safety | Kotlin
kotlinlang.org
'Language > Kotlin' 카테고리의 다른 글
[Kotlin] #범위 지정 함수 - let, apply, run, with, also (0) | 2022.04.14 |
---|---|
[Kotlin] #반복문 사용법 (0) | 2022.04.05 |
[Kotlin] #var와 val의 차이점 (0) | 2022.03.29 |