본문 바로가기

프로그래밍 언어/Kotlin

Kotlin : NPE에서 자유로운가?

안녕하세요. 지난번 코틀린 5분정복 포스트를 마치고 JAVA언어와의 큰 차이점이라 볼 수 있는 Null처리에 대하여 다루어보려고 합니다.

 

NullPointerException(NPE)

자바 개발자분들 이시면 로그에 이게 찍혀있으면 보기만해도 아찔한 오류인데요.

인텔리제이가 개발을 할때 어느정도 잡아주고는 있지만, (null 체크가 필요한다고 Warn 해준다 던지..)

실제 개발에서는 모든 코드에

 if (varList == null){}

와 같은 널체크 코드를 넣어서 체크를 하기가 까다로운것이 현실입니다. 

그러면 코틀린은 이와 같은 null 완전히 해결해주고 있을까요?

Null safety | Kotlin (kotlinlang.org)

 

코틀린에서는 변수에 null을 허용하지 않습니다. 

그렇지만 null의 사용이 필요한 경우도 많습니다. 그럴때는 

var nullableString : String? = "만두"
nullableString = null

이렇게 자료형 뒤에 ?를 붙여주면 됩니다.

 

sava call

null 처리 방법중 하나로 

예를들어 painter 객체에 있는 paint를 호출해본다고 해보겠습니다.

painter이 null이면 NPE가 뜨겠죠

Painter?.paint()

와 같이 ?를 붙여서 호출해주면 null 이 아닐때 paint() 함수를 호출하는 동작을 합니다.

if (painter != null) painter.paint()

이 코드랑 똑같이 동작한다고 생각하시면 됩니다.

 

개발관점에서도 아주 편리하며 안전한 방법입니다.

이 방법을 가장 많이 활용한다고 합니다.

Elvis 연산자

var firstPaint = Painter?.paint()?:"NullPaint"

엘비스 연산자는 ?:오른쪽에 return 또는 throw를 포함한 모든 포현식이 허용됩니다.

위 처럼 단순히 paint를 보여줄때 null paint 라는 기본값을 넣어주어도 좋지만,

throw를 던져주는것도 좋은 방법입니다.

 

!! not null assertion

번역기 조금 까다롭긴하지만

Print!!.print()

Print 객체가 null 이면  그대로 print()메서드의 반환값을 리턴하지만 null 이면 NPE를 리턴한다고 합니다.

보통 이렇게 단독으로 사용하지는 않고, .difference와 함께 사용하는 경우가 많다고 합니다.

하지만 일반적으로는 자바의 NPE처리와 같은 문제가 발생 할 수 있으므로 !!연산자를 피하는것이 좋다고 합니다. (일부 정적 분석 도구는 오류를 발생하도록 설정되어있음)

 

그래도.. 의미없는 nullability 는 피해야 한다.

많이 돌아왔지만 결국은 코틀린은 마법처럼 null을 해결해주지 않습니다.

자바에서 그랬던 것 처럼 보기에 의미가 없으면 null을 뱉지 않도록 하는것이 좋습니다.

그렇다고 동일한 방법으로 nullable을 피하면 자바와 차이가 없겠죠

코틀린에서 제공하는 lateinit과 notNull 델리게이트가 있습니다. 클래스의 생성이후 값이 notNull 보장이 있으면 두 방법을 사용합시다.

 

'프로그래밍 언어 > Kotlin' 카테고리의 다른 글

Kotlin이란 ? 5분 정복  (0) 2022.05.22