🚨 널(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
}
감사합니당~:)
'📱 안드로이드 Android ~ Kotlin' 카테고리의 다른 글
[Android/Kotiln] 생체 인식 인증 방식 Biometric 사용하기 (3) | 2022.04.28 |
---|---|
[Kotlin/코틀린] 5 - 상속과 클래스 종류 (data 클래스, object 클래스, companion 클래스) (1) | 2022.02.04 |
[Kotlin/코틀린] 3 - 클래스와 생성자 (0) | 2022.02.04 |
[Kotlin/코틀린] 2 - 조건문과 반복문 (0) | 2022.02.04 |
[Kotlin/코틀린] 1 - 변수/상수, 데이터타입, 함수, 컬렉션 타입 (0) | 2022.02.04 |