public boolean startWithA(String str) {
return str.startWith("A");
}
위 코드는 안전할까?
정답은 No 이다.
str 은 nullable 하기에 NPE (이하 NullPointException)가 발생할 수 있기때문이다.
public boolean startWithA(String str) {
if (str == null) {
throw new IllegalArgumentException();
}
return str.startWith("A");
}
null safe 하게 고친다면 위와 같을 것이다.
fun startWithA(str: String?): Boolean {
if (str == null) {
throw IllegalArgumentException()
}
return str.startWith("A")
}
자바와 별 다를 것 없어보이지만 파라미터 타입을 보면 str
이 nullable 하다는 것을 정확히 명시해주고 있으며
if (str == null)
을 체크하였기에 str.startWith("A")
에서 str
이 not null 임을 알려준다.
또한, 위에서 null 체크가 없었다면 str
에 startWith()
함수를 호출할 수 없다.
return 값 또한 동일하게 처리된다.
코틀린에서는 null 이 가능한 타입을 완전히 다르게 취급한다. 그렇기에 null 이 가능한 타입만을 위한 기능 또한 존재한다.
val str: String? = "ABC"
str.length // 불가
str?.length // 가능
str.length 는 null 일 수 있기에 사용이 불가능하다.
하지만 ?
를 붙여준다면 str 이 null 일 경우 에러를 뱉지않고 null 을 리턴하고 null 이 아닐경우 length 를 리턴한다.
val str: String? = null
println(str?.length ?: 0)
앞의 str 값이 null 이기에 0을 return 한다.
// java
if (number == null) {
return 0;
}
// kotlin
number ?: return 0
나아가 자바의 코드를 위와 같이 더 간단히 할 수 있다.
nullable type 이지만, 아무리 생각해도 null 이 될 수 없는 경우가 존재한다.
fun startWithA(str: String?) {
str!!.length
}
이 경우 위와 같이 str 이 nullable 하지만 !!
를 통해 not null 임을 설정해줄 수 있다.
👏 TIP : 코틀린에서 자바를 사용할 경우 return type 이 nullable 하다면 메서드에 @Nullable 을 꼭 붙여주도록 하자.
붙이지 않는다면 코틀린에서는 자동으로 not null 로 인식하게 된다.