이 글은 인프런의 자바 개발자를 위한 코틀린 입문의 영상을 보고 공부하면서 정리하는 글입니다.
자바의 코드 먼저 확인해보겠습니다. 아래의 코드는 안전한 코드일까요?
java
public boolean startWithA(String str){
return str.startsWith("A");
}
String 변수에 null이 들어올 수도 있기 때문에 안전하지 않습니다.
만약 위의 코드의 str변수에 null이 들어오게 된다면 NPE가 발생하게 됩니다.
위의 문제를 해결하기 위해서 자바에서는 다음과 같이 고칠 수 있을 것 입니다.
java
public boolean startWithA1(String str){
if (str == null){
throw new IllegalArgumentException("null이 들어왔습니다.")
}
return str.startsWith("A");
}
public Boolean startWithA2(String str){
if (str == null){
return null;
}
return str.startsWith("A");
}
public boolean startWithA3(String str){
if (str == null){
return false;
}
return str.startsWith("A");
}
위의 3가지 방법을 코틀린으로 변경해보겠습니다.
Kotlin
fun startsWithA1(str: String?): Boolean{
if(str == null){
throw IllegalArgumentException("null이 들어왔습니다")
}
return str.startsWith("A")
}
Kotlin
fun startsWithA2(str: String?): Boolean?{
if(str == null){
return null
}
return str.startsWith("A")
}
Kotlin
fun startsWithA3(str: String?): Boolean{
if(str == null){
return false
}
return str.startsWith("A")
}
코틀린에서는 null이 가능한 타입을 완전히 다르게 취급합니다!
위에서 언급 드린 것처럼 코틀린에서는 null이 가능한 타입을 완전히 다르게 취급합니다.
그렇다면 Null이 가능한 타입만을 위한 기능은 없을까요?
Kotlin
val str: String? = "ABC"
str.length // 불가능
str?.length // 가능!!
null이 아니면 실행하고, null이면 실행하지 않습니다.(그대로 null)
Kotlin
val str: String? = "ABC"
str?.length ?: 0
앞의 연산결과가 null이면 뒤의 값을 사용합니다.(그대로 null)
nullable type이지만, 아무리 생각해도 null이 될 수 없는 경우들이 있습니다.
Kotlin
fun startsWithA1(str: String?): Boolean {
return str!!.startsWith("A")
}
그래도 혹시나 null이 들어오게 되면 NPE가 발생하기 때문에 정말 null이 아닌게 확실한 경우에만 null아님 단언 !!을 사용해야합니다.(그대로 null)
플랫폼 타입이란 코틀린이 Null 관련 정보를 알 수 없는 타입입니다.
Runtime시 Exception이 발생할 수 있습니다.