본문 바로가기
Java & Kotlin/Kotlin

[Kotlin] null을 다루는 방법

by heekng 2022. 7. 5.
반응형

null을 다루는 방법

null 체크

Java

public boolean startsWithA1(String str) {
    if (str == null) {
        throw new IllegalArgumentException("null이 들어왔습니다.");
    }
    return str.startsWith("A");
}

public Boolean startsWithA2(String str) {
    if (str == null) {
        return null;
    }
    return str.startsWith("A");
}

public boolean startsWithA3(String str) {
    if (str == null) {
        return false;
    }
    return str.startsWith("A");
}

Kotlin

fun startsWithA1(str: String?): Boolean {
    if (str == null) {
        throw IllegalArgumentException("null이 들어왔습니다.")
    }
    return str.startsWith("A")
}

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

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

fun startsWithA4(str: String): Boolean {
    return str.startsWith("A")
}
  • 코틀린에서 null이 들어갈 수 있는 타입은 완전히 다르게 간주된다.
  • 한번 null 검사를 하면 non-null임을 컴파일러가 알 수 있다.

SafeCall과 Elvis 연산자

Kotlin

fun startsWithA1(str: String?): Boolean {
    return str?.startsWith("A")
            ?: throw IllegalArgumentException("null이 들어왔습니다.")
}

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

fun startsWithA3(str: String?): Boolean {
    return str?.startsWith("A") ?: false
}
  • Safe Call: str?.length 형태로 사용한다.
    • null이 아니면 실행하고, null이면 실행하지 않고 null을 반환한다.
  • Elvis 연산자: str?.length ?: 0 형태로 사용한다.
    • 앞의 연산 결과가 null이면 뒤의 값을 사용한다.
    • Elvis연산은 early return에도 사용할 수 있다.

null 아님 단언

Kotlin

fun startsWith(str: String?): Boolean {
    return str!!.startsWith("A")
}
  • str!!.length 형태로 사용한다.
  • nullable type이지만, 아무리 생각해도 null이 될 수 없는 경우에 사용한다.
  • 혹시나 null이 들엉오면 NullPointException이 발생하기 때문에 정말 null이 아닌게 확실한 경우에만 널 아님 단언을 사용해야 한다.

널 아님 단언을 사용했지만 null이 사용된 경우

fun main() {
    println(startsWith(null))
}

플랫폼 타입

Java

public class Person {

    private final String name;

    public Person(String name) {
        this.name = name;
    }

    @NotNull
    public String getName() {
        return name;
    }
}

Kotlin

fun main() {

    var person = Person("heekng")

    // @Nullable 일 때에는 가능
    // @NotNull 일 때에는 불가능
    startsWithA(person.name)

}

fun startsWithA(str: String): Boolean {
    return str.startsWith("A")
}
  • 플랫폼 타입: 코틀린이 null 관련 정보를 알 수 없는 타입
  • 코틀린에서 자바 코드를 가져와 사용할 때 어떻게 처리되는가?
  • 만약 Java 코드에 @Nullable 어노테이션이 붙어있을 경우에는 불가능하다.

  • 하지만 @NotNull 어노테이션이 붙어있을 경우에는 가능하다.

  • Java코드를 통해 null 가능성을 확인하지 못할 때에는?
    • 사용은 가능하지만 null이 입력되었을 때 에러가 발생한다.

  • 결국 Kotlin에서 Java코드를 가져다 사용할 때에는 Java코드를 읽으며 null 가능성을 확인하거나, Kotlin으로 wrapping 해야 한다.
반응형