
Effective Kotlin을 읽고 정리하는 글이다.
가끔 어떤 타입인지 볼 때 예를 들어
String이라고 하면 2가지 정도에 타입으로 나눌 수 있다.
String은 notNull타입으로 볼 수 있고, String?은 nullable타입으로 볼 수 있다.
하지만 그것 이외에 String!을 봤던 적이 있었을 것이다.
이 타입이 플랫폼 타입이다.
보통은 코틀린에서 자바 함수를 사용 할 때
public class UserRepo {
public class UserRepo {
public @NotNull User getUser1() {
//...
}
public @Nullable User getUser2() {
//...
}
}
}
public class JavaClass {
public String getValue() {
return null;
}
}
fun statedType() {
val value : String = JavaClass().value // 여기서 NPE 발생 !!
//...
println(value.length)
}
fun platformType() {
val value = JavaClass().value
//...
println(value.length) // 여기서 NPE 발생 !!
}
두가지 모두 NPE가 발생하지만 위치에 차이가 있다.
statedType에서는 자바에서 값을 가져올 때 NPE가 발생한다. 그래서 이 위치에서 오류가 발생하면 nullable 타입이라는 걸 쉽게 알 수 있다.
하지만 platformType에서는 값을 활용할 때 NPE가 발생한다. 예시에서는 간단한 표현식이지만
복잡한 표현식에서는 현재 변수가 nullable인지 파악하기 힘들 것 이다. 현재 변수를 안전하게 한두 번 사용했더라도, 이후에 다른 개발자가 사용할 때 nullable인지 인지를 못하면 또 NPE가 발새될 것이기 때문이다.
플랫폼 타입을 사용하는 코드가 있다면 제거하는게 좋아보인다.
현재에는 인지하더라도 추후 유지보수하는 개발자가 인지하기가 어려워보이기 때문이다.
그리고 자바 코드에 @NotNull, @Nullable 같은 어노테이션을 활용하는 것도 좋아보인다.