[Kotlin] #코틀린에서의 Null 처리 - Null Safety

2022. 4. 13. 20:39
728x90
반응형

💡 개요


코드를 작성하다 보면 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

728x90
반응형

'Language > Kotlin' 카테고리의 다른 글

[Kotlin] #범위 지정 함수 - let, apply, run, with, also  (0) 2022.04.14
[Kotlin] #반복문 사용법  (0) 2022.04.05
[Kotlin] #var와 val의 차이점  (0) 2022.03.29

BELATED ARTICLES

more