Kotlin에서의 null체크
- 코틀린에서는
null
이 가능한 타입을 완전히 다르게 취급한다.
fun startWithA(str: String): Boolean{ // null이 불가능하므로 바로 startsWith 바로 호출
return str.startsWith("A");
}
fun startWithA(str: String?): Boolean{ //?표기로 Null 기능성이 있으므로 오류
return str.startsWith("A");
}
- 이미 Null 체크가 된 변수는 녹색으로 표기해준다.
Safe Call 과 Elvis 연산자
- null이 가능한 타입만을 위한 기능 제공
Safe Call
:.?
로 null이 아닐경우만 실행, null일 경우 실행하지 않고 null반환
/** safe call */
var str : String? = "ABC"
str?.length // str이 null이 아닐때만 실행
//str.length ERROR!! - str이 null일 수도 있어 오류 발생
//Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
Elvis 연산자
: 앞의 연산 결과가 null이면 뒤의 값을 사용- early return validation에도 사용할 수 있다.
/** Elvis 연산자 */
val str : String? = dnull
str?.length?:0 // 앞의 연산 결과가 null이면 뒤의 값(0) 사용
/** earyly return 활용 */
number?: return 0 //if(number == null) return 0; java
널 아님!! 단언
!!
를 사용하여 null이 아님!!을 컴파일러에게 알려줄 수 있다.- nullable type이지만, Null이 될 수 없는 필드들 일 경우 사용
- 만약 null이 들어오면 컴파일 에러는 안나지만 RunTime시점에 NPE가 날수는 있음.
/** nuLl아님! 단언 */
fun startWithA(str: String?): Boolean{
return str!!.startsWith("A"); // !!단언 사용
}
println(startWithA("AB")) // 정상처리
println(startWithA(null)) // NPE 발생
플랫폼 타입
- 코틀린에서 null 관련 정보를 알 수 없는 경우 Runtime시 Exception이 날 수 있는데 이를
플랫폼타입
이라고 함 - Kotlin 코드에서 Java 코드를 사용할 경우 Null에 대한 정보를 명시해 줘야함
@NotNull
@Nullable
org.jetbrains.annotations
- Java 라이브러리 등을 사용할 경우 Null 가능성을 확인하고 코틀린으로 랩핑해서 사용하는 것을 권장한다.
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
@Nullable //@NotNull
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
fun startWithA(str: String?): Boolean{
return str!!.startsWith("B");
}
val person = Person("지훈")
startWithA(person.name) // @Nullable 필드이므로 컴파일 오류 발생
Reference