널이란 객체가 선언되었지만 초기화되지 않은 상태이다. 만약 주솟값을 가지지 못하고 널인 상태의 객체를 이용하면 널 포인트 예외가 발생한다. 널 포인트 예외는 널인 객체를 이용할 수 없다는 오류이다. 이때 널 안정성이란 널 포인트 예외가 발생하지 않도록 코드를 작성하는 것을 말한다.
fun main{
var data : String? = null
println("data length : ${data?.length ?: 0}")
}
data가 null이면 0을 반환하고 null이 아니면 length를 이용해 문자열의 개수를 얻는 소스이다.
이렇게 함으로써 널일 경우 안정성을 보장받을 수 있다.
널 안정성 호출 - ?. 연산자
널 불허로 선언한 변수는 null을 대입할 수 없으므로 널 포인트 예외를 신경 쓸 필요는 없지만 널 허용으로 선언한 변수는 null을 대입할 경우 얼마든지 널 포인트 예외가 발생할 수 있다. null이 대입될 수 있는 변수를 널 안전성을 고려하지 않고 작성하면 오류가 발생한다.
따라서 널 허용으로 선언한 변수의 멤버에 접근 할 때는 반드시 ?.연산자를 이용해야 한다.
?.연산자는 변수가 null이 아니면 멤버에 접근하지만 null이면 멤버에 접근하지 않고 null반환
val data : String? = "kkang"
val length = data?.length
엘비스 ㅡ ?: 연산자
?: 연산자는 변수가 널이면 널을 반환한다. but 변수가 널일 때 대입해야 하는 값이나 실행 할 구문이 있을수도 있는데 이때 사용한다.
fun main(){
var data : String? = "kkang"
println("data : $data : ${data?.length ?: -1}")
data = null
println("data : $data : ${data?.length ?: -1}")
}
예외 발생 ㅡ !! 연산자
!!는 객체가 널일 때 예외를 일으키는 연산자로 널 포인트 예외를 발생시켜야 할 때 사용한다
fun some(data : String?) : Int{
return data!!.length
}
fun main(){
println(some("kkang"))
println(some(null))
}
출력 : 5
Exception in thread "main" java.lang.NullPointerException