티스토리 뷰

반응형

코틀린은 자바와 다르게 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

 

반응형
댓글
공지사항