본문 바로가기
코틀린

Kotlin의 null 안전 기능에 대한 개요와 null 포인터 예외를 방지하는 법

by 플라퉁 2023. 4. 13.
728x90
반응형

Kotlin에서 null은 1급 시민입니다. 즉, 모든 유형의 변수에 할당할 수 있는 적법한 값입니다. 그러나 이로 인해 코드가 null 값에 액세스하려고 시도할 때 null 포인터 예외가 발생할 수 있습니다.

 

 

1. Null 허용 유형: Kotlin에서는 유형에 '?'를 추가하여 변수를 null 허용으로 표시할 수 있습니다. 이는 변수가 null일 수 있음을 컴파일러에 알리고 null 값을 명시적으로 처리하도록 합니다.

 

ex).

val name: String? = null // variable 'name' can be null
if (name != null) {
    println("Hello, $name")
} else {
    println("Name is null")
}

 

 

 

 

 

2. 안전한 호출 연산자: 안전한 호출 연산자인 ?.를 사용하면 null이 아닌 경우에만 메서드를 호출하거나 개체의 속성에 액세스할 수 있습니다. 객체가 null이면 표현식은 null로 평가되고 나머지 체인은 건너뜁니다.

 

ex).

val str: String? = "Hello"
val length: Int? = str?.length // 'length' is null if 'str' is null

 

 

 

 

3. Elvis 연산자: Elvis 연산자 ?:를 사용하면 표현식이 null인 경우 사용할 기본값을 제공할 수 있습니다. 표현식이 null이 아닌 경우 해당 값이 사용됩니다. 그렇지 않으면 기본값이 사용됩니다.

 

ex). 

val name: String? = null
val length = name?.length ?: -1 // if 'name' is null, use -1 as the length

 

 

 

 

4. 널이 아닌 어설션 연산자: 널이 아닌 어설션 연산자 !!를 사용하면 컴파일러가 널이라고 생각하더라도 표현식이 널이 아님을 어설션할 수 있습니다. 이는 변수가 null이 아님을 확실히 알고 있지만 컴파일러가 이 정보를 유추할 수 없는 경우에 유용합니다.

 

ex).

val str: String? = "Hello"
val length: Int = str!!.length // 'length' is guaranteed to be non-null

 

 

 

 

5. 안전한 캐스트: 안전한 캐스트 'as?'를 사용하면 객체를 특정 유형으로 캐스트할 수 있지만 객체가 해당 유형이 아닌 경우 null을 반환합니다. 이는 특정 유형일 수도 있고 아닐 수도 있는 객체로 작업할 때 유용할 수 있습니다.

 

ex).

val obj: Any? = "Hello"
val str: String? = obj as? String // 'str' is null if 'obj' is not a String

 

728x90
반응형

댓글