코틀린은 NPE(NullPointerexception)가 발생하지 않을까?

Minsu Kang·2021년 4월 14일
0

Kotlin in action 1장을 읽다가 코틀린이 NPE에서 자유롭다고 소개하는 것을 보고
코틀린에서 NullPointerException이 발생하지 않는지 궁금증이 생겨 테스트 해보았습니다.

non-null type

non-null type의 변수에는 null 값을 할당할 수 없습니다.

null을 넣으려고 하면 아래와 같은 컴파일 에러가 발생합니다.
Null can not be a value of a non-null type String

객체를 초기화 할 때에도 null로 초기화 되는 것이 아니라, 컴파일 에러가 발생합니다.

즉, non-null type 을 사용하면 애초에 null값이 할당될 수 없으므로 NPE는 발생할 수 없습니다.

nullable type

nullable type의 변수에는 null 값을 할당할 수 있습니다.

null이 들어갈 수 있으니 NPE가 발생할 수 있는 상황을 만들어 보았습니다.
컴파일 에러가 발생합니다.
?. 또는 !!.를 사용하라는 로그를 찍어줍니다.

?.를 사용해 보았습니다.
컴파일 에러는 사라지고 변수 b에는 null이 들어가 있습니다.

검색을 해보니 ?.safe call operator 라고 부르고,
이 연산자를 사용하면 null이 아닐 때는 정상적으로 값이 할당되고 null 이라면 null을 반환하는 역할을 합니다.

다음으로 !!. 를 사용해 보았습니다.
NPE가 발생하네요?!

찾아보니 !!.elvis operator 라고 부르고,
이 연산자를 사용하면 null이 아니라는 것을 단언하는 역할을 합니다.
이건 null이 아니야! 라고 했지만 실제로는 null이 들어있었기 때문에 NPE가 발생하였습니다.

결론 : 코틀린도 NPE가 존재한다! 하지만, Java에 비하면 NPE의 발생 가능성을 컴파일 시점에서 엄청나게 줄일 수 있다는 장점이 있다.

그 외 null값을 다루는 또 다른 연산들이 존재합니다.
kotlin in action 6장 또는 해당 블로그를 참고하면 좋을 것 같습니다.

profile
백엔드 개발자

0개의 댓글