Null Safety와 Nullable
Kotlin1분 읽기
Null Safety와 Nullable
자바에서 NullPointerException은 흔한 런타임 에러다.
코틀린은 이 에러를 컴파일 시점에서 방지할 수 있도록 설계했다.
코틀린에서는 기본적으로 모든 타입이 null을 허용하지 않는다. null 값을 사용해야 하는 경우, 반드시 nullable 타입으로 선언해야 한다.
nullable 타입은 타입 뒤에 ?를 붙여 선언할 수 있다.
// nullable 타입 선언
var name: String? = null
// String과 null 모두 사용 가능
name = "John"
name = null
Nullable 타입에 안전하게 접근하기
nullable 타입이어도 값이 null인 상태에서 접근하면 문제가 된다.
그래서 코틀린에서는 nullable 타입에 안전하게 접근할 수 있는 연산자들을 제공한다.
안전 호출 연산자 (Safe Call Operator)
nullable 객체의 속성이나 메서드에 접근할 때는 ?.를 사용한다.
객체가 null일 경우 표현식이 null이 된다.
```kotlin
val name: String? = null
// name == null : null 반환
// name != null : name.length 반환
val length: Int? = name?.length
엘비스 연산자 (Elvis Operator)
null 대신 기본값을 제공하고 싶을 때 사용한다.
val name: String? = null
// name == null : 0 반환
// name != null : name.length 반환
val length: Int = name?.length ?: 0
자바스크립트의
??와 같은 역할이다.
안전한 캐스팅 (Safe Cast)
캐스팅이 실패하면 null을 반환한다.
val data: Any = "Hello"
val text: String? = data as? String // 성공: text = "Hello"
val number: Int? = data as? Int // 실패: number = null
not-null 단언 연산자 (Not-null Assertion Operator)
값이 절대 null이 아님을 컴파일러에게 알린다.
혹시라도 값이 null일 수도 있으므로 위험성이 있다.
만일 런타임에서 실제로 null일 경우 NullPointerException이 발생한다.
val name: String? = null
val length: Int = name!!.length // NullPointerException 발생
스마트 캐스트 (Smart Cast)
코틀린은 조건문에서 null 체크를 할 경우, 해당 블럭 안에서는 자동으로 not-null로 취급한다.
val name: String? = null
if (name != null) {
// 이 블럭 안에서는 name은 String으로 취급한다
return name.length // .length로 바로 접근 가능 (name?.length를 사용하지 않아도 됨)
}