최대한 플랫폼 타입을 사용하지 말라
플랫폼 타입: 다른 프로그래밍 언어에서 전달되어서 nullable인지 아닌지 알 수 없는 타입, String!
처럼 이름 뒤에 !을 붙여 표기한다.
public class UserRepo{
public User getUser() {
}
}
val repo = UserRepo()
val user1 = repo.user //User!
val user2: User = repo.user //User
val user3: User? = repo.user //User?
user를 가져올 수 있는 type은 위와 같이 3가지가 있다.
user1처럼 들고 온다면, 코틀린에서 null에 대해 처리(!!
, filterNotNull()
)를 해줘야하므로 타입을 지정해준 user2, user3이 이상적이다.
만약, 자바 코드를 건드릴 수 있다면 아래와 같이 어노테이션을 사용해 플랫폼타입을 사용하지 않도록 하는것이 좋다.
String?
public String getValue() {
return null;
}
// 코틀린
fun statedType() {
val value: String = JavaClass().value // NPE
// ...
println(value.length)
}
fun platformType() {
val value = JavaClass().value
// ...
println(value.lenghth) // 값을 사용할 때 NPE
}
값을 사용할 때 NPE가 터진다면 오류를 찾는데 상대적으로 오랜 시간이 걸릴 수 있다.
또한 interface에서 null에 대한 명시를 하지 않았다가 구체 클래스에서 nullable하게 구현한다면, runtime에서 예외가 터질 수도 있다.
잘봤습니다.