Rlog

Kotlin Null 처리 본문

Kotlin

Kotlin Null 처리

dev_roach 2021. 11. 18. 19:14
728x90

우리가 Java 로 프로그래밍을 하다보면 Null Pointer Exception 을 마주치고는 한다.

NullPointerException 은 정말 위험한 Runtime 에러이다. 

그래서 요즘 최신 언어들은 컴파일 타임에 Null 에 대한 처리를 관리하려고 하는데 코틀린 또한 그렇다.

어떻게 코틀린에서는 Null 처리를 컴파일에 강요한다는 것일까? 한번 알아보자.

Null 이 될 수 있는 타입

코틀린과 자바의 차이는 Null 이 될수 있는 타입을 명시적으로 지원한다는 것이다.

이 얘기가 무엇이냐면 프로퍼티나 변수에 Null 이 들어갈 수 있는 걸 명시할 수 있다는 것 이다.

말만 들으면 이게 무슨소리야? 라고 할 수 있으니 한번 코드로 살펴보기로 하자.

 

일단 이해를 위해서는 자바코드를 먼져 살펴보아야 한다.

자바 코드를 먼져 살펴보자.

자바에서는 이처럼 String 타입에도 Null 타입을 넣을 수 있다.

뭐 더 크게 얘기하면 Object Type 에는 보통 Null 을 넣을 수 있는데 이는 잘못된 것이다.

 

그 이유는, 타입의 의미에 대해 잘 생각해보아야 한다.

 

위키피디아에 나와있는 타입의 명세를 한번 살펴보자. 

"타입은 분류로, 어떤 값들이 가능한지와 그 타입에 대해 수행할 수 있는 연산의 종류를 결정한다"

여기서 하나 생각해봐야 하는점은 그렇다면 String Type 에 Null 이 들어갈수 있는게 맞는가?

 

즉, 우리가 NPE 를 마주하는 이유도 예상치 못하게 다른 타입이 들어와

예상했던 연산을 수행하지 못하기에 예외를 발생시키게 되는 것이다.

 

논외로 얘기하자면, Java 에도 Optional 이라는 개념이 생기긴했다. 궁금하면 공부해보길 바란다.

 

그렇다면 다시 아까의 얘기로 돌아와 코틀린에서는 이를 어떻게 컴파일 시점으로 가지고 왔는지 코틀린 코드로 한번보자.

동일한 코드인데 코틀린에서는 컴파일에러가 나는 코드이다.

즉 코틀린에서는 Null 이 될수 있는 타입을 명시적으로 지원하기에 이를 컴파일 시점에서 확인할 수 있는 것이다.

 

그렇다면 우리는 이코드를 실행시키기 위해서 어떻게 해줘야 할까?

코틀린 에서는 바로 '?' 로 이를 처리할 수 있다.

다시 코드를 한번 바꿔보자.

일단 이제 Null 이 될 수 있는 타입을 어떻게 명시하는지를 알게 되었다.

 

하지만 다시보니 이제 s.length 부분에 오류가 난다.

그 이유는 무엇일까?

바로 Null 이 들어올 수 있으므로 Null 처리를 반드시 해주어야 한다. (물론 안하는 방법도 있다.)

 

일단 Null 이 들어왔을때 "잘못된 입력값 입니다." 라는 예외를 발생시키도록 해보자.

일단 이렇게 해서 처리할 수 있게 됬다.

하지만 코틀린이라면 다른게 되지 않을까? 라는 기대를 가지고 다른 방법을 찾아보자.

 

코틀린에서는 안전한 호출 연산자인 '?.' 을 지원한다.

'?.' 은 'if ( s! == null) return s.length else null' 과 같다.

위의 코드를 한번 안전한 호출 연산자로 바꿔보자.

이제 이렇게 되면 Null 이 들어올때 어떻게 될까?

아까 위에서 기술한 대로 아마도 Null 을 리턴하게 될 것이다. 

한번 실행시켜보자.

우리의 예상대로 null 이 리턴된다.

즉 그래서 리턴타입 또한 Int -> Int? 로 변경되었다.

자바 코드로는 어떻게 되어 있을까?

우리의 예상코드와 같다. 삼항연산자로 되어있다.

되게 편한 Sugar Syntax 처럼 느껴진다.

하지만 Null 처리를 해야할때와 구분을 잘 하도록 하자. 

 

여하튼 또 다른 방법은 없을까?

코틀린에는 재미있는 엘비스 연산자가 존재한다. 

바로 ?: 을 이용하는 것이다.

어떻게 이용하는지 한번 살펴보자.

앨비스 연산자는 바로 디폴트 값을 우항으로 지정해두는 것이다.

Null 값이 들어오면 기도하는 이모티콘이 string 의 값이 된다.

자바 코드로 한번 보자.

삼항연산자를 통해서 기본값으로 초기화 시켜주는 모습이다.

앨비스 연산자 또한 유용한 상황에서 상당히 편하게 쓸수 있는 Sugar Syntax 라고 생각된다.

 

다른 방법으로  !! 이 존재하는데, 이는 음 그렇게 좋은 방법이라고 생각하진 않는다.

굳이 사용해야 되는 상황이 아니라면 다른 방법으로 Null 에 대한 해소를 하는게 좋다고 생각해서 따로 적지는 않겠다.

코틀린에서 현대 언어처럼 Null 처리를 하는건 상당히 좋은 방법이니 많이들 사용해보길 바란다~!

'Kotlin' 카테고리의 다른 글

[Kotlin Spring] Logger 를 간편하게  (0) 2021.12.14
[Mac] Kotlin 설치 및 CLI 에서 사용하기  (0) 2021.12.06
Kotlin JPA - 상속 관계 맵핑  (0) 2021.11.17
Kotlin JPA  (0) 2021.11.16
Kotlin object  (0) 2021.11.15