코틀린은 null을 들어갈 수 있는 변수를 다르게 취급한다.
그럼 null을 어떻게 다뤄야 할까?
1. null 체크
자바에서 다음과 같은 코드는 NullPointException 가능성을 내포하고 있다.
public boolean startsWith(String str) {
return str.startsWith("A");
}
그렇기 때문에 다음과 같이 사용한다.
public boolean startsWith(String str) {
if (str == null) {
throw new IllegalArgumentException("String is null");
}
return str.startsWith("A");
}
혹은 Boolean 타입으로 null을 내포하여 사용한다.
코틀린에서는 다음과 같이 사용할 수 있다.
fun startsWithA1(str: String?): Boolean {
if (str == null) {
throw IllegalArgumentException("is null")
}
return str.startsWith("A")
}
(타입 스크립트인가..?)
이 경우는 : Boolean을 통해 null을 포함하지 않는 리턴 값이라는 것을 명시했다.
반면 null을 내포할 수 있다면 다음과 같이 : Boolean? 을 사용한다.
fun startsWithA2(str: String?) : Boolean? {
if (str == null) {
return str
}
return str.startsWith("A")
}
코틀린은 null이 들어갈 수 있는 변수를 구분함으로서 null 체크에 대해 컴파일러가 자동적으로 체크해주기 때문에 좀 더 안전한 null 처리를 할 수 있다.
fun startsWithA3(str: String?) : Boolean {
if (str == null) {
return false
}
return str.startsWith("A")
}
2. Safe Call과 Elvis 연산자
Safe Call은 null이 아니면 실행하고 null이면 실행하지 않는다.
null이 가능한 경우 즉시 함수를 호출할 수 없게 한다. 이 경우?. 를 사용할 수 있는데
이를 safe call이라고 한다.
Elvis 연산자는 마치 삼항 연산자를 연상시킨다.
fun main() {
val str: String? = null
println(str?.length ?: 0)
}
이를 합성해 코틀린스럽게 코드를 작성할 수 있다.
fun startsWithA1(str: String?): Boolean {
return str?.startsWith("A") ?: throw IllegalArgumentException("is null")
}
fun startsWithA2(str: String?) : Boolean? {
return str?.startsWith("A")
}
fun startsWithA3(str: String?) : Boolean {
return str?.startsWith("A") ?: false
}
3. null 아님 단언
nullable type이지만, 아무리 생각해도 null이 될 수 없는 경우
fun startsWithA4(str: String?) : Boolean {
return str!!.startsWith("A")
}
"!!"을 사용하여 처리한다. 만약 null이 발생하면 NPE가 발생한다.
이는 확실한 경우에만 사용해야 한다.
4. 플랫폼 타입
코틀린에서 자바 코드를 가져다 쓸 때 null 처리를 어떻게 해야 할까?
코틀린은 자바 코드의 @Nullable, @NotNull 등에 대한 어노테이션을 통해 이해한다.
만약 어노테이션이 없다면 코틀린이 null 관련 정보를 알 수 없는 타입으로 취급된다.
이를 플랫폼 타입이라 한다.
이런 경우 null이 들어오면 NPE가 런타임에서 발생하게 된다.
'Kotlin' 카테고리의 다른 글
조건문 (0) | 2022.11.30 |
---|---|
연산자 (0) | 2022.11.27 |
Type (0) | 2022.11.27 |
변수를 다루는 방법 (0) | 2022.11.26 |
kotlin 간단 소개 (0) | 2022.11.26 |
댓글