Null
Kotlin에서 Null 처리는 주요한 특징 중 하나로, 안전한 Null 처리를 통해 NPE 문제를 효과적으로 예방할 수 있습니다. 해당 특징에 대해 깊이 있게 설명해보겠습니다.
Nullable, Non-Nullable
- Kotlin은 모든 변수와 타입을 Nullable, Non-Nullable으로 명확히 구분하는 특성이 있습니다.
- Nullable는 null 값을 가질 수 있는 반면에 Non-Nullable은 null 값을 가질 수 없습니다.
//null 불가, null을 넣을 시 컴파일 에러
val name1: String = "name1"
//null 가능
val name2: String? = null
안전 호출 연산자 - ?.
?. 연산자는 Nullable 타입에서 안전하게 접근할 수 있도록 돕는 안전 호출 연산자입니다. 객체가 null이 아니면 프로퍼티나 메서드에 접근하고 null이면 null을 반환합니다.
//person이 null 이라면 "default name"이 반환되고 아니라면 name 값이 반환됩니다.
val name = perseon.name ?: "default name"
앨비스 연산자 - ?:
앨비스 연산자는 기본값을 제공하는 연산자입니다. 객체가 null이면 ?: 뒤의 값을 반환합니다. (Java 에서 삼항 연산자와 비슷합니다.)
//person이 null 이라면 "default name"이 반환되고 아니라면 name 값이 반환됩니다.
val name = perseon.name ?: "default name"
Not-Null 단언 연산자 - !!
!! 연산자는 Nullable 타입의 값이 절대 null이 아닐 때 사용하는 Not-Null 단언 연산자입니다. 이 연산자는 컴파일러에게 null이 아니라고 보장하므로, 이후 코드에서 Non-Nullable 타입으로 간주됩니다. 하지만 값이 null인 경우 NullPointerException이 발생할 수 있으므로 주의해서 사용해야 합니다.
//person이 Nullable 타입이지만 Non-Nullable 타입으로 간주되어서 처리, 만약 null 이라면 NPE
val name = person!!.name
Safe Cast 연산자 - as?
as?는 안전하게 타입을 변환하는 Safe Cast 연산자로, 변환에 실패할 경우 null을 반환합니다. 이는 타입이 일치하지 않는 경우 null을 반환하여 예외가 발생하는 것을 방지할 수 있습니다.
val name: String? = nickname as? String
Lateinit
lateinit 키워드는 변수의 지연 초기화를 지원하여 Non-Nullable 타입을 나중에 초기화할 수 있도록 합니다. var 변수에만 사용할 수 있고, Nullable을 피하고자 할 때 유용하게 사용됩니다.
//Non-Nullable 타입이지만 당장 초기화 하지 않아도 가능
lateint var name: String
...
...
...
name = "name"
만약 아직 초기화 되지 않은 상태에서 접근하게 된다면 UninitializedPropertyAccessException가 발생합니다. 이를 예방하기 위해 ::변수명.isInitialized를 사용하여 lateinit 변수의 초기화 여부를 확인할 수 있습니다.
lateint var name: String
if(::name.isInitialized) {
println(name)
}
else {
println("아직 초기화 되지 않았습니다")
}
'프로그래밍 언어 > Kotlin' 카테고리의 다른 글
Build (2) | 2025.04.25 |
---|---|
Companion Object (4) | 2025.04.24 |
Nested Class, Inner Class (0) | 2025.04.24 |