코틀린에서의 null 체크
자바 코드를 코틀린으로 변환하면서 이해해보겠다
public boolean startsWithA1(String str)
{
if(str==null) throw Exception();
return str.startsWith("A");
}
fun startsWithA1(str: String?) : Boolean // String 자료형의 str이라는 변수로 null이 들어올 수 있음을 명시
// 반환형은 Boolean
{
if(str==null) throw Exception()
return str.startsWith("A")
}
public Boolean startsWithA1(String str)
{
if(str==null) return null;
return str.startsWith("A");
}
fun startsWithA1(str: String?) : Boolean? // 반환형은 Boolean에 ?추가
{
if(str==null) return null
return str.startsWith("A")
}
fun startsWithA1(str: String?) : Boolean? // 반환형은 Boolean에 ?추가
{
str.startsWith("A") // 컴파일 에러(빨간줄)가 난다.
// null이 가능한 str의 함수를 호출할 수 없게 막힌다.
// 위에서 if 로 null 체크를 하는 것을 추가하면 변수명이 초록색으로 바뀌는데,
// 코틀린은 null은 더이상 아니겠거니 하고 컴파일러가 추측해줘서 그렇다.
}
fun startsWithA(str : String): Boolean
{
return str.startsWith("A") // str은 null이 들어올 수 없기에 빨간줄이 안생긴다.
}
결론! 코틀린에서는 null이 가능한 타입을 완전히 다르게 취급한다!
null이 가능한 타입만을 위한 기능은 없나? 있다!
Safe Call과 Elvis 연산자
safe call ⇒ ?.
val str: String? = "ABC"
str.length // 불가능
str?.length // 가능!!
앞에 오는 변수가 null이 아니면 뒤에 오는 함수나 프로퍼티 등을 실행하고
아니면 전체 값이 null이 된다.
val str1: String? = null
println(str?.length)
=====
null
Elvis 연산자 ⇒ ?:
val str: String? = "ABC"
str?.length ?: 0
앞의 연산 결과가 null이면 뒤의 값을 사용
val str1: String? = "ABC"
println(str1?.length ?: 0)
val str2: String? = null
println(str2?.length ?: 0)
===
ABC
0
Elvis 라고 부르는 이유는…
?: 를 90도 회전하면 생긴 모양이 Elvis라는 가수의 헤어스타일과 닮았다고 해서란다.
여기까지 이해했으면 java를 kotlin으로 좀더 예쁘게 바꿔보자.
public boolean startsWithA1(String str)
{
if(str==null) throw Exception();
return str.startsWith("A");
}
fun startsWithA1(str: String?): Boolean
{
return str?.startsWith("A") ?: throw Exception()
}