티스토리 뷰
[Kotlin] 코틀린 Null 처리, Nullable 연산자 (Null safe, Elvis, Non-Null)
쩨리쩨리 2022. 6. 16. 15:44코틀린은 자바와 다르게 Null 타입을 Nullable과 Non-Nullable 로 구분하며, 기본적으로 객체를 Non-Nullable 타입으로 보장하기 때문에 null을 사용해야하는 상황에는 null 체크를 포함하는 연산자를 사용해줘야 한다.
Nullable 변수로 속성이나 함수를 사용할때는 null 체크를 안 하면 NullPointerException이 발생하게 된다.
java에서는 null 체크를 할때 주로 if문이나 equals 구문을 사용했지만,
코틀린에서는 Nullable 연산자로 좀더 쉽게 Null 체크가 가능하다.
Nullable types
Null 객체를 선언할때 변수 타입 옆에 ? 를 붙이면 Null 사용이 가능하도록 할당할 수 있고, ?가 붙지 않으면 Non-Nullable로 Null 사용이 불가능하다.Non-Nullable 변수에 Null을 선언하면 컴파일 되지 않으므로 NullPointerException이 발생한다.
var nullable : String? = null
var nonNullable : String? = "Kotlin"
Null operator
자바에서는 Null 체크를 if (a == null) 이나 if (a.equls(null)) 를 써주거나 try ~ catch로 NullPointerException이 발생하지 않게 Null 체크를 해줘야 한다. if ~ else 구문을 계속 사용하면 가독성이 안 좋아지기도 하고 개발자가 의식적으로 Null을 체크하는 구문을 써줘야하기에 불편함이 따른다.
코틀린에서는 Null 체크를 좀더 쉽게 표현하기 위해 3가지 종류의 Null 연산자를 지원한다.
Null Safe Operator
?. 를 붙여서 참조 연산자를 실행하기 전에 먼저 객체가 Null인지 확인부터하고 객체가 null이라면 뒤의 구문(코드)를 실행하지 않는 연산자이다.
var a : String? = null
println(a?.toUpperCase())
//출력 결과 : null
?. 연산자를 사용하면, 변수가 Null이 아닐때만 오른쪽의 toUpperCase()가 실행되고, 변수가 Null이면 결과값으로 Null을 반환한다.
if ( a == null ) 구문을 ?. 하나로 표현이 가능해졌다.
Null Safe 연산자는 코틀린의 스코프 함수와 사용하면 더 편리하게 사용할 수 있다.
var a : String? = null
a?.run{
println(toUpperCase())
}
//출력 되지 않음
run은 인스턴스의 값을 람다함수를 사용해 변경할 수 있는 함수로써 변경된 결과값을 반환하는 기본 함수형 언어이다.
위 코드를 실행시켜보면 실행 되지 않는다. a 변수는 값이 없는 Null 이기에 toUpperCase()를 적용할 문자열이 없기 때문이다. 함수를 실행할때도 if 구문을 쓰지 않아도 되니 더 유용해 지는 것이다.
var b : String? = "Kotlin"
b?.run{
println(toUpperCase())
}
//출력 결과 : KOTLIN
Elvis Operator
?: 를 붙여서 객체가 Null 이 아니라면 그대로 실행되지만, Null 이라면 :(콜론) 연산자 우측의 객체로 대체되는 연산자이다. 다른 말로는 Null 복합 연산자(Null Coalescing Operator)라고도 한다.
var a : String? = null
println(a?:"default".toUpperCase())
//출력 결과 : DEFAULT
a가 Null 이라면 a값이 "default" 문자열로 대체된다. 위 코드는 a가 Null 이기 때문에 "default" 문자열로 대체된 뒤 .toUpperCase()가 적용되어 대문자로 출력값이 나오게 된다.
위 코드를 자바로는 삼항연산자로 사용할 수 있는데,
String a = null;
a = (a != null) ? a.toUpperCase() : "default".toUpperCase();
System.out.println(a);
확실히 코틀린을 사용하면 자바보다는 코드 양이 줄어드는 경험을 할 수 있다.
Non-Null Assertion Operator
!!. 를 붙여서 참조 연산자를 사용할때 Null 여부를 컴파일시 확인하지 않도록 런타임시 NullPointerException이 발생되도록 의도적으로 방치하는 연산자이다.
var a : String? = null
println(a!!.toUpperCase())
//출력 결과 : NullPointerException Error
!! 연산자는 객체가 Null 이 아닌 것을 보장한다. 위 코드는 !! 를 사용해 null을 가진 변수는 toUpperCase()를 실행할 수 없지만, a 변수의 값은 Null 이기 때문에 NullPointerException이 발생했다. Exception 없이 컴파일 성공하려면 !! 연산자는 Null 이 아닌 것을 보장할 수 있는 객체에 사용해야할 것이다.
코틀린에서 Null 처리 연산자를 사용하면 NullPointerException을 발생시키는 현상을 줄이고 안전하게 프로그램을 구현할 수 있을 것이다. 코틀린을 처음 사용해본다면 이 개념에 헷갈리기도 하겠지만 사용하다보면 익숙하고 편해질 것이다.
- Reference
https://www.youtube.com/watch?v=Ae_D4Wb8OhI&list=PLQdnHjXZyYadiw5aV3p6DwUdXV2bZuhlN&index=22
'Programming > Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린 Data Class란 (0) | 2022.06.22 |
---|---|
[Kotlin] 코틀린 IntelliJ 프로젝트 생성 + HelloWorld 출력 (0) | 2022.06.20 |
[Kotlin] 코틀린 lateinit, lazy로 늦은 초기화, 초기화 지연 (0) | 2022.06.20 |