Kotlin Null 처리

null 처리

NullPointerException

Java 언어로 소프트웨어를 개발하다 보면 NullPointerException 에러를 자주 만나게된다. 이는 객체의 주소값이 담겨져 있지 않는(null 값이 들어있는) 참조 변수를 통해 객체 접근을 시도하면 발생되는 오류이다.

null safe

 Kotlin 은 개발자가 null 이 담겨 있는 참조변수를 통해 객체 접근을 시도할때 오류가 발생되는 것을 방지하고자 다양한 방법을 제공하고 있다.
 이를 통해 null 값에 대한 안정성을 확보 (null safe) 할 수 있다.

?: 연산자

  • ?: 연산자는 참조변수에 null 이 들어있으면 지정된 기본값을 반환한다.
  • ?: 연산자는 nullable 타입 변수가 null인 경우 대체(default) 값을 지정하는 데 사용됩니다. 이 연산자를 사용하여 null인 경우 대체 값을 제공할 수 있습니다.
fun main() {
testFun1("문자열")
testFun1(null)
}

fun testFun1(str:String?) {
val value1:String = str ?: "기본문자열"
println(value1)
}

// 결과
문자열
기본문자열

?. 연산자

  •  참조 변수를 통해 메서드를 호출하거나 멤버 변수를 사용할 떄 참조 변수에 객체의 주소값이 들어있다면 객체에 접근해서 메서드나 변수를 사용한다.
  • 만약 참조 변수에 null 이 들어 있다면 오류가 발생하지 않고 null 을 반환한다.
  • ?. 연산자는 nullable 타입 변수 또는 객체에 접근할 때 사용됩니다. 해당 변수가 null이 아닌 경우에만 프로퍼티나 메소드에 접근하며, null인 경우에는 접근 대상을 null로 반환합니다.

fun main() {
testFun1("문자열")
testFun1(null)
}

fun testFun1(str:String?) {
println(str)
println(str.length) // Error
}
Kotlin: Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?

fun main() {
testFun1("문자열")
testFun1(null)
}

fun testFun1(str:String?) {
println(str)
println(str?.length)
}

// 결과
문자열
3
null
null
 ?. 연산자를 통해 변수가 null 일 경우, null.length 면 nullpointexception 이 발생할거 같지만, ?. 연산자를 사용하면 그 전체가 null 이 된다.

!! 연산자

  • !! 연산자는 null 을 허용하는 변수에 담긴 객체의 주소값을 null 을 허용하지 않는 형태의 값으로 변환하는 연산자이다.
  • null을 허용하는 변수에 담긴 값을 null을 허용하지 않는 형태의 변수에 담을 경우 사용한다.
  • 변환 과정에서 null 값이 들어 있을 경우 오류가 발생한다.
  • 이 연산자의 사용은 권장하지 않는다.
 Kotlin에서 !! 연산자는 null safety를 무시하고 강제로 nullable 타입을 non-null 타입으로 캐스팅하는 역할을 합니다. 이 연산자는 nullable 변수 또는 표현식 뒤에 사용되며, 해당 값이 null일 경우 NullPointerException을 발생시킵니다.
fun testFun1(str:String?) {
val value1:String = str // Error
}
Kotlin: Type mismatch: inferred type is String? but String was expected

str은 null 을 허용하는 변수이고, value1 은 null을 허용하지 않는 변수이기 때문에 에러가 발생한다.

댓글

이 블로그의 인기 게시물

Intel® HAXM installation failed 해결하기

Kotlin Interface

Kotlin this, super