새소식

카테고리 없음

널 안전성

  • -

널 안전성

널 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

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.