604 단어
3 분
Kotlin nullable
2025-03-24

nullable#

kotlin에서 null 체크는 재미있는 방식으로 한다.

public static int countStr(String str) {
    return str.length();
}

위의 자바 코드에서 str이 null일 경우를 체크하려면 아래와 같은 코드가 될 것이다.

public static int countStr(String str) {
    if (str == null) {
      return 0;
    }
    return str.length();
  }

그럼 이제 이 코드를 kotlin으로 나타내면 어떻게 될까?

fun countStr(str: String): Int {
    return str.length
}

위와 같이 작성하고 아래 main 함수에서 실행을 해보자

fun main() {
    countStr(null);
}

이 코드는 제대로 작동할까?

![2025-03-24 22 12 19](../assets/img/2025-03-24 22 12 19.png)

정답은 컴파일 자체가 되지 않는다. 이러한 결과가 나타나는 이유는 kotlin에서는 null인 타입과 아닌 타입을 구분하기 때문이다. 따라서 자바 코드처럼 null을 받고 따로 처리하고 싶으면 아래와 같이 작성해야 한다.

fun countStr(str: String?): Int {
    if(str == null) {
        return 0
    }
    
    return str.length
}

이때 String?에 주목하면 된다. 뒤에 붙은 ?은 nullable 변수임을 컴파일러에게 알려주는 것이다.

Safe Call#

val str: String? = "hello"

위와 같이 str 변수가 선언 되었을 때 str.length가 가능할까? 정답은 가능하지 않다. 왜냐하면 str 변수는 nullable이기 때문이다. 이런 nullable 변수를 호출하기 위해서는 Safe Call을 이용해야 한다.

str?.length // 이렇게 호출해야함

이때 만약 str이 null이라면 해당 식을 실행조차 하지 않는다.

fun main() {
    val str: String? = "hello"
    println("str?.length = ${str?.length}") // 실행결과 5

    val str2: String? = null
    println("str?.length = ${str2?.length}") // 실행결과 null
}

Elvis 연산자#

Safe Call을 하면서 값이 null일 때, 다른 값을 지정할 수 있는데 이것은 Elvis 연산자를 통해 할 수 있다.

val str:String? = null

str?.length ?: 0

여기서 ?: 연산자가 바로 Elvis 연산자이다. 이 결과 str의 출력물로 0이 나온다. 즉 str이 null이 아니라면 str.length의 결과가 나타나고 null 이라면 0을 반환하는 것이다.

!!

fun countStr(str:String?): Int {
    ...
}

위의 파라미터와 같이 str이 nullable이지만, str은 null일 수 없을 경우 !! 연산자를 통해 null이 아님을 선언할 수 있다.

fun countStr(str:String?): Int {
    return str!!.length;
}

만약 str에 null이 들어오게 되면 NullPointException이 발생하므로 주의해서 사용해야한다.

Kotlin nullable
https://realits.me/posts/kotlin-nullable/
저자
realitsyourman
게시일
2025-03-24
라이선스
CC BY-NC-SA 4.0