본문 바로가기

Kotlin

Kotlin 의 널 (Null) 을 다루는 방법

코틀린은 많은 장점을 가지고 있지만,

자바를 사용하던 개발자들이 가장 피부로 와닿는 장점을 뽑으라고 한다면 Null 타입 시스템이 꼽히지 않을까 생각합니다.

코틀린에서는 강력한 Null Safety 한 문법을 제공함으로서 NPE의 발생을 획기적으로 사전에 차단합니다.

 

Nullable 타입

코틀린은 모든 객체타입이 Nullable 한 타입과 NonNull 타입으로 나뉩니다. 

 

class Person(
    val name: String,
    val nickName: String?,
    val age: Int
)

타입 뒤에 ? 가 붙은 타입은 Nullable 한 타입이 됩니다.

?가 붙지 않은 타입의 변수에는 null 을 할당할 수 없습니다.

NonNull 타입에 null 을 넣으려고 할 시

 

하지만 개발을 하다보면 어떤 Nullable 한 값을 리턴하는 함수를 통하여 얻어낸 값을 NonNull 타입에 할당하고 싶은 경우가 있을 것입니다. 그럴때는 !! 연산자를 사용하면 얻어낸 Nullable 한 타입이 해당 연산에서는 NonNull 하다고 컴파일러에게 알릴 수 있습니다.

!! 으로 명시적으로 NonNull 임을 알린 값이 Null 인 경우 NPE 가 발생합니다.

!! 으로 표시한 값이 Null 일시 NPE

 

Nullable 한 타입 핸들링

Nullable 한 타입을 명시적으로 사용함으로서,

코틀린은 Nullable 한 타입의 Null 값을 핸들링하는 많은 문법을 지원합니다.

 

안전한 호출 연산자 ?.

?. 는 null 체크와 연산 수행을 간결한 문법으로 한번에 제공합니다.

?. 은 해당 값이 null 이 아닐 경우 뒤에 명시한 해당 타입이 지닌 연산이 수행되고, null 일 경우 null 을 리턴합니다.

 

 

위의 간결한 코드는 아래의 자바 코드로 컴파일됩니다.

이처럼 코틀린의 ?. 연산은 복잡한 null 체크 코드를 간결하고 이해하기 쉬운 코드로 표현할 수 있습니다.

 

 

엘비스 연산자 ?:

엘비스 연산자 ?: 는 Nullable 한 값의 기본값을 지정할때 유용하게 사용할 수 있습니다.

엘비스 연산자는 값이 null 이 아닐경우 값을, null 일 경우 지정한 값을 리턴합니다. 우변에서는 익셉션을 던질 수도 있습니다.

자바의 Optional 의 orElseGet(), orElseThrow 와 유사한 동작을 합니다. (orElse() 와는 메소드 수행 여부의 차이가 있습니다.)

 

 

타입파라미터

타입파라미터 T 는 물음표가 없더라도 Nullable 한 타입으로 해석됩니다.

Nullalble 타입으로 해석되므로, 위에서 소개한 Null Safety 문법들을 사용하여 안전한 코드를 작성할 수 있습니다

 

이처럼 코틀린은 강력한 Null Safety 한 문법을 제공함으로서 Null Pointer Exception 을 획기적으로 줄임과 동시에

복잡하고 읽기힘든 Null 체크 문법을 간결하게 표현할 수 있도록 개선했습니다. 

 

소개한 내용 이외에도 let, as 함수를 안전한 캐스팅, 엘비스 와 함께 사용하여 처리하는 패턴 등이 Kotlin In Action 이나

기타 기본서에 소개되지만, Null 을 핸들링 하는 직접적인 방법은 아니므로 소개만 하고 글 작성을 마치겠습니다.