@Nullable
어노테이션을 표시해서 이를 코틀린에선 nullable 타입으로 다루면 되긴 하지만 어노테이션이 없는 경우가 문제다.public class JavaTest {
// @Nullable
public String giveName() {
// ...
}
}
null
일 수 있기에 최대한 안전하게 접근한다면 모두 nullable로 다루어야 한다.String!
처럼 타입 뒤에 !
기호를 붙여 포기하는데 물론 이러한 노테이션이 코드에 나타나지는 않는다.val repo = UserRepo() // null을 뱉을 수 있는 자바 객체
val user1 = repo.user // User! (플랫폼 타입)
val user2: User = repo.user // User 타입
val user3: User? = repo.user // User? 타입
null
이 아니라고 생각되는 것이 null
일 가능성이 있기에 플랫폼 타입을 사용할 땐 항상 주의를 기울여야 한다.
@Nullable
과 @NotNull
어노테이션을 붙여야 한다.statedType
과 platformType
예제 코드를 보자.statedType
에선 값을 꺼낼 때 npe가 발생하지만 platformType
에선 값을 사용할 때 npe가 발생한다.fun statedType() {
val value: String = JavaClass().value // NPE
println(value.length)
}
fun platformType() {
val value = JavaClass().value
println(value.length) // NPE
}
null
이 아니라고 받아들인다면 문제가 된다.interface UserRepo {
fun getUserName() = JavaClass().value
}
class RepoImp: UserRepo {
override fun getUserName(): String? {
return null
}
}
fun main() {
val repo: UserRepo = RepoUmpl()
val text: String = repo.getUserName() // 런타임에 NPE
print("${text.length}")
}