nullable
kotlin에서 null 체크는 재미있는 방식으로 한다.
public static int countStr(String str) {
return str.length();
}위의 자바 코드에서 str이 null일 경우를 체크하려면 아래와 같은 코드가 될 것이다.
public static int countStr(String str) {
if (str == null) {
return 0;
}
return str.length();
}그럼 이제 이 코드를 kotlin으로 나타내면 어떻게 될까?
fun countStr(str: String): Int {
return str.length
}위와 같이 작성하고 아래 main 함수에서 실행을 해보자
fun main() {
countStr(null);
}이 코드는 제대로 작동할까?

정답은 컴파일 자체가 되지 않는다. 이러한 결과가 나타나는 이유는 kotlin에서는 null인 타입과 아닌 타입을 구분하기 때문이다. 따라서 자바 코드처럼 null을 받고 따로 처리하고 싶으면 아래와 같이 작성해야 한다.
fun countStr(str: String?): Int {
if(str == null) {
return 0
}
return str.length
}이때 String?에 주목하면 된다. 뒤에 붙은 ?은 nullable 변수임을 컴파일러에게 알려주는 것이다.
Safe Call
val str: String? = "hello"위와 같이 str 변수가 선언 되었을 때 str.length가 가능할까? 정답은 가능하지 않다. 왜냐하면 str 변수는 nullable이기 때문이다. 이런 nullable 변수를 호출하기 위해서는 Safe Call을 이용해야 한다.
str?.length // 이렇게 호출해야함이때 만약 str이 null이라면 해당 식을 실행조차 하지 않는다.
fun main() {
val str: String? = "hello"
println("str?.length = ${str?.length}") // 실행결과 5
val str2: String? = null
println("str?.length = ${str2?.length}") // 실행결과 null
}Elvis 연산자
Safe Call을 하면서 값이 null일 때, 다른 값을 지정할 수 있는데 이것은 Elvis 연산자를 통해 할 수 있다.
val str:String? = null
str?.length ?: 0여기서 ?: 연산자가 바로 Elvis 연산자이다. 이 결과 str의 출력물로 0이 나온다. 즉 str이 null이 아니라면 str.length의 결과가 나타나고 null 이라면 0을 반환하는 것이다.
!!
fun countStr(str:String?): Int {
...
}위의 파라미터와 같이 str이 nullable이지만, str은 null일 수 없을 경우 !! 연산자를 통해 null이 아님을 선언할 수 있다.
fun countStr(str:String?): Int {
return str!!.length;
}만약 str에 null이 들어오게 되면 NullPointException이 발생하므로 주의해서 사용해야한다.