-
Kotlin의 Null 처리Kotlin 2021. 5. 17. 00:55
개요
Kotlin의 가장 큰 장점 중 하나는 Null 처리를 비교적 안전하고, 간결하게 할 수 있다는 것인데요.
Null이 반드시 필요한 상황도 있겠지만, 함수에서 불필요하게 Null을 return 한다거나, 특정 데이터를 사용할 때 Null이 들어있으면 Runtime에서 NPE (Null Pointer Exception)이 발생할 수 있습니다. 이러한 문제는 프로그램이 거대해질수록 더 도드라지는 현상인데요. 많은 개발자들이 Null 처리에서 굉장히 신경을 씁니다. Kotlin은 이러한 Null 처리를 더 편하고 안전하게 하기 위해서 여러 장치들을 뒀는데, 오늘은 그 중 대표적인 몇가지에 대해서 알아보겠습니다.
Nullable type과 non-null type
Kotlin을 사용하다보면 아래와 같은 타입을 자주 볼 수 있습니다.
val a : String = "" val b : String? = null
동일한 String인데도 '?'가 붙은 형태가 있는데요. Kotlin에서는 ?를 데이터 타입에 붙이면 Nullable type, 붙이지 않으면 non-null type이라고 말합니다. 즉, ?가 붙지 않은 String 타입인 a에는 null이 절대로 들어갈 수 없습니다. 이것은 언어 자체에서 강제하는 것이기 때문에 컴파일 조차 되지 않습니다. 따라서, null을 할당하기 전부터 좀 더 예민하게 코드를 작성할 수 있고, 다른 개발자가 이러한 변수를 사용할 때도 조심할 수 있습니다.
Safe Call
그렇다면 Nullable type을 사용해야할 때, 이러한 변수에서 Null 처리를 어떻게 해야할까요?
위의 이미지와 같이, test는 null이 올 수 있기 때문에 null 처리를 따로 해주지 않으면 length 메소드를 사용할 수가 없습니다. 따라서 null 처리를 해줘야하는데, Kotlin에서는 if 문을 통한 null 체크 대신에 변수에 Null인 경우를 더 간결하게 표현할 수 있습니다.
변수 뒤에 '?'를 붙이는 것인데요. 이를 Safe Call이라고 합니다. 만약 test가 null이 들어오면 test?.length는 null로 변환되게 됩니다. 이러한 Safe Call은 연쇄적으로 호출할 때 아주 유용한데요.
println(korea?.seoul?.dongjak)
특정 데이터를 연쇄적으로 호출할 때, 이렇게 Safe Call을 데이터마다 붙일 수 있고, 하나라도 null이 발생한다면 결과는 null로 반환됩니다.
Elvis Operator
만약 위에서 Safe Call을 사용했을 때, 결과를 null이 아닌 다른 값으로 반환하려면 어떻게 해야할까요? 이런 경우 Elvis 연산자를 사용하면 아주 쉽게 처리할 수 있는데요.
var test: String? = "" val len = test?.length ?: 1
위의 코드에서 만약에 test가 null인 경우 len에는 1이 들어가게됩니다. Elvis 연산자가 없다면 If-else 조건문을 통해 처리를 따로 해줘야하겠죠. 이러한 처리가 많아질 경우 Elvis 연산자를 사용하는 것이 훨씬 간결하게 코드를 작성할 수 있습니다.
만약, null인 경우 특정한 Exception을 발생시키고 싶다면, throw를 통해 발생시킬 수 있습니다.
var test: String? = "" val len = test?.length ?: throw new Exception()
글을 마치며
Kotlin의 Null 처리를 아주 간략하게 알아봤는데요. Kotlin의 가장 큰 장점이 Null 처리에 대한 많은 기능을 제공해주므로, 이러한 장점을 제대로 활용하는 것이 유리하다고 볼 수 있습니다.
오늘 소개드린 기능들 외에 추가적인 기능은 추후에 또 정리하도록 하겠습니다.
참고 사이트
Kotlin 안전한 null 처리 - 꿈 많은 개발자가 되자
'Kotlin' 카테고리의 다른 글
Const val과 val의 차이 (0) 2021.09.03 Kotlin의 고차 함수 (0) 2021.05.23 코틀린 수신 객체 지정 람다 : with와 apply (0) 2020.08.07 [코틀린을 다루는 기술] Kotlin에서의 재귀 함수 사용 (0) 2020.08.07 [코틀린을 다루는 기술] 코틀린 함수 정리 (0) 2020.07.31