아이템 3 - 최대한 플랫폼 타입을 사용하지 말라

ds_chanin

·

2022. 2. 27. 02:16


코틀린의 주요 기능 중 하나인 널 안정성 덕분에 자바를 사용하면서 자주 보던 NullPointerException을 덜 볼 수 있게 되었다.

하지만 널 안정성 기능이 없는 타 언어(Java, C) 등과 코틀린을 같이 사용하고 코틀린이 다른 언어를 이용하여 사용하는 경우 널 안정성이 보장되지 않아 NullPointerException을 만나게 될 수 있다.

자바의 경우 String 반환 타입에 어노테이션으로 @NotNull 혹은 @Nullable 의 존재 유무로 코틀린에서 String으로 사용할지 String? 으로 사용할지 구분지을수 있다. 하지만 어노테이션이 붙어있지 않다면 기본적으로 nullable 할수 있기 때문에 String? 으로 가정하고 다루어야 한다.

그러니 자바와 코틀린을 함께 사용하는 상황이고 자바 코드를 직접 조작할 수 있다면 어노테이션을 적극적으로 활용하도록 하자.

public class JavaString {
    // @NotNull -> String
    // @Nullable -> String?
    // 없다면 -> String?
    public String getValue() {
        return null;
    }
}

코틀린은 다른 프로그래밍 언어에서 넘어온 타입들을 플랫폼 타입이라고 부른다. 당장 위 예시에서 자바의 String도 코틀린의 입장에서는 플랫폼 타입이다.

플랫폼 타입은 타입 이름뒤에 ! 기호를 붙여 표기하는데 코드에는 직접적으로 나타나지 않는다.

보다시피 플랫폼 타입을 사용하는 경우 nullable 한 값을 다루기 때문에 안전하지 않다는 것을 알 수 있다. 따라서 가능하다면 최대한 빨리 플랫폼 타입을 활용하는 부분을 제거하는것 좋다.

이러한 nullable한 값을 다루게 되면서 발생할 수 있는 위험성을 책에서 예제로 보여주고있다.

fun statedType() {
    val value: String = JavaString().value // 플랫폼 타입을 Kotlin의 String으로 받아들이는 시점에서 

    println(value.length)
}

fun platformType() {
    val value = JavaString().value

    println(value.length) // 플랫폼 타입을 직접 활용하는 시점에서
}

위 예제와 같이 플랫폼 타입을 직접 코틀린의 타입으로 예측하고 사용하지 않으면 컴파일러는 문제가 있는지 알려주지 않고 런타임에서 NullPointerException을 만나게 될 수 있다.

결론

플랫폼 타입은 최대한 사용하지 않도록 하는 것이 좋고 있다면 빠르게 제거할 수 있도록 하라. 정말 사용해야한다면 자바에서 제공하는 어노테이션과 같은 도구를 활용하는 것이 좋다.