📱 안드로이드 Android ~ Kotlin

[Kotlin/코틀린] 4 - 널(null) 안전성

핑크빛연어 2022. 2. 4. 15:41

 

🚨 널(null) 안전성

 

널 안전성

널(null) : 객체가 선언되었지만 초기화되지 않은 상태
- 객체는 데이터가 지장된 주소를 참조하므로 흔히 참조 변수라고 한다
  데이터가 메모리에 저장되는 위치를 식별하는 값을 주소라고 한다
  객체는 주소가 저장되며 이 주소로 메모리에 접근해서 데이터를 이용한다
- 널(null) 은 객체가 주소를 가지지 못한 상태
- 널(null) 인 상태의 객체를 이용하면 널 포인트 예외(NullPointException) 발생
  -> 널(null) 인 상태의 객체를 이용할 수 없다는 오류
널 안정성 이란 널 포인트 예외(NullPointException) 가 발생하지 않도록 코드를 작성하는 것

 

널 허용 - ? 연산자

- kotlin 변수 타입을 널 허용(nullable) / 널 불허(not null) 로 구분한다
- data 를 String 타입으로 선언했지만 타입 뒤에 ? 연산자를 추가했으므로 널 허용 변수가 되어 
  널(null) 을 대입할 수 있다

var data: String? = null
var length = data?.length ?: 0   // data 가 null 이면 0 을 반환하고 null 이 아니면 data?.length 을 반환
println("data length : $length ")  // => data length : 0
println("data : $data")  // => null

 

널 안전성 호출 - ?. 연산자

?. 연산자 : 널 허용 변수에 널(null) 이 대입되더라도 멤버에 접근하지 않고 널(null) 을 반환 
  -> 널 포인트 예외(NullPointException) 발생안함

var data: String? = "eeeee"
var length = data.length  //오류!
var length = data?.length  //성공!

var data1: String? = null
var length1 = data1?.length
println("data1 length1 : $length1")  // => data1 length1 : null

 

엘비스 - ?: 연산자

?: 연산자 : 엘비스 연산자
- 변수가 널(null) 일 때 반환하는 값을 대입하여 실행하는 구문에 사용

var data: String? = "eeeee"
println("data = $data, length : ${data?.length ?: -1} ")  // => data = eeeee, length : 5
data = null
println("data = $data, length : ${data?.length ?: -1} ")  // => data = null, length : -1

 

예외 발생!! 연산자

!! 연산자 : 널(null) 일 때 예외를 일으키는 연산자
- 객체가 널(null) 일 때 ?. 또는 ?: 연산자를 이용해 
  널 포인트 예외(NullPointException) 가 발생하지 않게 작성할 수도 있지만, 
  또 어떤 경우에는 널 포인트 예외(NullPointException) 를 발생시켜야 할 때도 있으므로 그때 사용

fun some(data: String?): Int {
    return data!!.length
}

fun main() {
    println(some("eeeee"))  // => 5
    println(some(null))  // => Exception in thread "main" java.lang.NullPointerException
}

 

 

감사합니당~:)

더보기
Kotlin/코틀린
728x90
반응형