널 안전성
널 null 이란 객체가 선언되었지만 초기화되지 않은 상태를 의미합니다.
val data1: String = "hello"
val data2: String? = null
data2 변수는 아직 주솟값을 가지지 못한다. 즉, 변수가 선언되었지만 이용할 수 없는 상태입니다.ㅇ
널인 상태의 객체를 이용하면 널 포인트 예외Null Point Exception가 발생합니다.
fun main() {
var data: String? = null
val length = if (data == null) {
0
} else {
data.length
}
println("data length : $length")
}
위 소스를 보면 String 타입의 data 변수를 null로 선언했습니다.
if문으로 data가 null인지 확인한 뒤 null이면 0을 반환하고 null이 아니면 data.length를 반환하게 작성하면
data가 null이어도 널 포인트 예외가 발생하지 않습니다.
- 코틀린이 제공하는 널 안전성 연산자를 이용한 코드
fun main() {
var data: String? = null
println("data length : ${data?.length ?: 0}")
}
data가 null이면 0을 반환하고 null이 아니면 length를 이용해 문자열의 개수를 얻는 소스
널 안전성 연산자
널 허용 - ? 연산자
var data1: String = "google"
data1 = null //오류!
var data2: String? = "google"
data2 = null //성공!
널 안전성 호출 -?. 연산자
var data: String? = "google"
var length = data.length //오류!
data 변수에 데이터를 저장했더라도 변수를 널 허용으로 선언했으므로 언제든지 null이 대입될 수 있습니다.
var data: String? = "google"
var lenght = data?.length //성공!
?. 연산자는 변수가 null이 아니면 멤버에 접근하지만 null이면 멤버에 접근하지 않고 null을 반환합니다.
엘비스 -?: 연산자
엘비스 연산자란 ?: 기호를 말한다.
이 연산자는 변수가 널이면 널을 반환합니다.
fun main() {
var data: String? = "google"
println("data = $data : ${data?.length ?: -1}")
data = null
println("data = $data : ${data?.length ?: -1}")
}
변수가 널일 때 대입해야 하는 값이나 실행해야 하는 구문이 있는 코드 이다
예외발생 -!! 연산자
!!는 객체가 널일 때 예외exception를 일으키는 연산자 입니다.
널 포인트 예외를 발생시켜야 할 때
fun some(data: String?): Int {
return data!!. length
}
fun main() {
println(some("google"))
println(some(null))
}
실행결과
6
Exception in thread "main" java.lang.NullPointerException