본문 바로가기
Kotlin

kotlin에서 null

by oncerun 2022. 11. 26.
반응형

코틀린은 null을 들어갈 수 있는 변수를 다르게 취급한다. 

 

그럼 null을 어떻게 다뤄야 할까?

 

1. null 체크

 

자바에서 다음과 같은 코드는 NullPointException 가능성을 내포하고 있다.

public boolean startsWith(String str) {
  return str.startsWith("A");
}

 

그렇기 때문에 다음과 같이 사용한다.

public boolean startsWith(String str) {
  if (str == null) {
    throw new IllegalArgumentException("String is null");
  }
  return str.startsWith("A");
}

 

혹은 Boolean 타입으로 null을 내포하여 사용한다. 

 

코틀린에서는 다음과 같이 사용할 수 있다.

fun startsWithA1(str: String?): Boolean {
    if (str == null) {
        throw IllegalArgumentException("is null")
    }
    return str.startsWith("A")

}

(타입 스크립트인가..?)

 

이 경우는 : Boolean을 통해 null을 포함하지 않는 리턴 값이라는 것을 명시했다. 

반면 null을 내포할 수 있다면 다음과 같이 : Boolean? 을 사용한다.

fun startsWithA2(str: String?) : Boolean? {
    if (str == null) {
        return str
    }

    return str.startsWith("A")
}

코틀린은 null이 들어갈 수 있는 변수를 구분함으로서 null 체크에 대해 컴파일러가 자동적으로 체크해주기 때문에 좀 더 안전한 null 처리를 할 수 있다.

fun startsWithA3(str: String?) : Boolean {
    if (str == null) {
        return false
    }
    return str.startsWith("A")
}

 

 

 

2. Safe Call과 Elvis 연산자

 

Safe Call은 null이 아니면 실행하고 null이면 실행하지 않는다. 

 

null이 가능한 경우 즉시 함수를 호출할 수 없게 한다.  이 경우?. 를 사용할 수 있는데

이를 safe call이라고 한다. 

 

Elvis 연산자는 마치 삼항 연산자를 연상시킨다.

fun main() {

    val str: String? = null
    println(str?.length ?: 0)
}

 

이를 합성해 코틀린스럽게 코드를 작성할 수 있다.

fun startsWithA1(str: String?): Boolean {
    return str?.startsWith("A") ?: throw IllegalArgumentException("is null")
}

fun startsWithA2(str: String?) : Boolean? {
    return str?.startsWith("A")
}

fun startsWithA3(str: String?) : Boolean {
    return str?.startsWith("A") ?: false
}

 

3. null 아님 단언

 

nullable type이지만, 아무리 생각해도 null이 될 수 없는 경우

fun startsWithA4(str: String?) : Boolean {
    return str!!.startsWith("A")
}

 

"!!"을 사용하여 처리한다. 만약 null이 발생하면 NPE가 발생한다. 

이는 확실한 경우에만 사용해야 한다.

 

4. 플랫폼 타입

 

코틀린에서 자바 코드를 가져다 쓸 때 null 처리를 어떻게 해야 할까?

 

코틀린은 자바 코드의 @Nullable, @NotNull 등에 대한 어노테이션을 통해 이해한다. 

 

만약 어노테이션이 없다면 코틀린이 null 관련 정보를 알 수 없는 타입으로 취급된다.

 

이를 플랫폼 타입이라 한다.

 

이런 경우 null이 들어오면 NPE가 런타임에서 발생하게 된다.

 

반응형

'Kotlin' 카테고리의 다른 글

조건문  (0) 2022.11.30
연산자  (0) 2022.11.27
Type  (0) 2022.11.27
변수를 다루는 방법  (0) 2022.11.26
kotlin 간단 소개  (0) 2022.11.26

댓글