계발자 블로그

[Kotlin] Null 처리 본문

Kotlin

[Kotlin] Null 처리

더구더구 2023. 3. 14. 16:44

NullPointException

Java 언어로 개발을 하다 보면 NullPointException이라는 오류를 자주 만나게 됩니다.

이는 객체의 주소 값이 담겨져 있지 않는(null 값이 들어있는)

참조 변수를 통해 객체 접은을 시도하면 발생되는 오류입니다.

자바에서는 컴파일 단계에서 null을 체크할 수 없습니다.

그래서 런타임 시에 null 값이 들어가 있다면 Exception이 발생하는 것을 볼수 있습니다.

이런 점들은 에러를 찾기 더 어렵고 많은 이슈들을 만들수 있습니다.

그래서 코틀린은 null이 될수 있는 값과 될수 없는 값을 분류하면서 null에 대한 안정성을 가질수 있습니다.

 

Null Safe

Kotlin은 개발자가 null이 담겨 있는 참조변수를 통해 객체 접근을 시도할 때 오류가 발생되는 것을

방지하고 다양한 방법을 제공합니다.

이를 통해 null에 대한 안정성을 확보(null safe)할 수 있습니다.

 

!! 연산자

  • !! 연산자는 null을 허용하는 변수에 담긴 객체의 주소 값을 null을 허용하지 않는 형태의 값을 변환하는 연산자입니다.
  • null을 허용하는 변수에 담긴 값을 null을 허용하지 않는 형태의 변수에 담을 경우 사용합니다.
  • 변환 과정에서 null 값이 들어 있을 경우 오류가 발생합니다.
  • 권장하지 않는 연산자입니다.
fun main() {
   
    testFun1("문자열")
    testFun1(null)
}

fun testFun1(str: String?) {
    val value:String = str!!
    println("value : $value")
}

testFun1에서 str은 null을 허용하는 변수로 선언했습니다.

그 다음줄에는 !!을 붙여 null을 허용하지 않도록 했습니다.

그리고 main 함수에서 "문자열", null 값을 넣어 봤습니다.

결과는 "문자열"이 들어갔을 때는 제대로 출력이 되지만 null일 때는 NPE가 나는 것을 볼수 있습니다.

null 값을 허용하지 않는 형태로 변경 했기 때문이죠.

위와 같이 !! 연산자는 null의 안정성을 보장받지 못하기 때문에 권장하지 않는 것입니다.

 

?: 연산자 (Elvis Operation)

  • ?: 연산자는 참조변수에 null이 들어있으면 지정된 기본값을 반환합니다.
  • 엘비스 연산자라고도 불립니다. 모양이 엘비스 프레슬리님의 머리 모양과 비슷한 면이 있습니다ㅎㅎ
fun main() {
   
    testFun2("문자열")
    testFun2(null)
}

fun testFun2(str: String?) {
    
    val value:String = str ?: "기본 문자열"
    println("value : $value")
}

null이 아닌 값이 들어가 있으면 str 값이 그래도 들어가고 null이 들어가 있으면 오른쪽 값이 들어가게 됩니다.

값이 null일 경우 기본값을 정의하기 위해 사용하는 연산자입니다.

null이 아닐 경우 null일 경우 둘 다 에러가 나지 않고 사용할 수 있기 때문에 안정성을 보장 받을 수 있습니다.

 

?. 연산자

  • 참조변수를 통해 메서드를 호출하거나 멤버 변수를 사용할 때 참조변수에 객체의 주소값이 들어 있다면 객체에 접근해서 메서드나 변수를 사용합니다.
  • 참조변수에 null이 들어 있다면 오류가 발생하지 않고 null을 반환합니다.
fun main() {
   
    testFun3("문자열")
    testFun3(null)
}

fun testFun3(str: String?) {
    
    println("str length : ${str?.length}")
}

null이 아닐때는 length를 실행시키고 null일 때는 그냥 null을 반환하는 것을 확인할 수 있습니다.

?. 연산자도 에러를 발생 시키지 않기 때문에 null에 대한 안정성을 보장합니다.

'Kotlin' 카테고리의 다른 글

[Kotlin] 추상 클래스 와 인터페이스  (0) 2023.07.16
[Kotlin] inline 함수, reified  (0) 2023.06.05
[Kotlin] 코틀린 Companion Object  (0) 2023.03.01
[Kotlin] Kotlin Property (코틀린 프로퍼티)  (0) 2023.03.01
Coroutine  (0) 2022.09.27