어 나 갱수.

[Kotlin] Kotlin에서 null처리는 어떻게 하나요? 🐶 본문

Java

[Kotlin] Kotlin에서 null처리는 어떻게 하나요? 🐶

김경수 2023. 8. 5. 17:48
728x90

자바와 코틀린을 비교했을 때 장점 하나를 꼽아보라면 빠지지 않고 나오는 것이 null처리에 관한 내용이다.

자바에서는 주로 if와 &&, || 등의 연산자들을 통해 null이 아닌 경우에 처리할 로직을 작성했다.

이에 비에서 코틀린에서는 null를 아주 간단하게 처리할 수 있다.

 

코틀린은 null이 될 수 있는 타입을 지원해 NullPointException 오류를 컴파일 시점에 감지할 수 있습니다.

자바에서는 null 체크를 할때 주로 if문이나 equals 구문을 사용했지만,

코틀린에서는 Nullable 연산자로 좀더 쉽게 null 체크가 가능합니다.

 

Nullable types 선언

Null 객체를 선언할 때 변수 타입 옆에? 를 붙이면 Null 사용이 가능하도록 할당할 수 있고,? 가 붙지 않으면 Non-Nullable로 Null 사용이 불가능하다. Non-Nullable변수에 Null을 선언하게 된다면 컴파일되지 않으므로 NullPointException이 발생한다.

 

아래의 코드처럼 ?를 붙이지 않고 null값을 선언하게 된다면 컴파일에러가 발생한다.

var a: String = "abc" // Regular initialization means non-null by default
a = null // compilation error

타입뒤에?를 명시하면 null값을 선언해도 컴파일에러가 발생하지 않고 null값이 b라는 변수에 잘 들어가진다.

var b: String? = "abc" // can be set null
b = null // ok
print(b)

Null check

1.  조건문으로 null check

  • Java와 같이 null 체크를 수행   
val l = if (b != null) b.length else -1
val b: String? = "Kotlin"
if (b != null && b.length > 0) {
    print("String of length ${b.length}")
} else {
    print("Empty string")
}

2.  Safe Calls 연산자

?.를 붙여서 참조 연산자를 실행하기 전에 먼저 객체가 Null인지 확인부터하고 객체가 null이라면 코드를 실행하지 않고 null을 반환하는 연산자 입니다.

 

자바에서는 if(a == null) 이렇게 null에 대한 검사를 했다면, 코틀린에서는 ?. 하나로 null에 대한 검사를 할 수 있습니다.

val a = "Kotlin"
val b: String? = null
println(b?.length) 
println(a?.length) // Unnecessary safe call
  • 위에서는 b가 null이 아니면 b.length를 반환하고, 그렇지 않으면 null를 반환한다.
  • null이 아닌 값에 대해서만 특정 작업을 수행하려면 다음과 같이 safe call 연산자를 사용할 수 있다.

3. Elvis(엘비스) 연산자 :?

  • ?:의 왼쪽에 있는 식이 null이 아니면 엘비스 연산자가 반환하고, 그렇지 않으면 오른쪽 결과를 반환한다. 왼쪽이 null인 경우에만 오른쪽 식으로 반환된다.
// if 조건문으로 처리한 경우
val l: Int = if (b != null) b.length else -1

// 동일한 코드를 ?: 연산자 사용 시
val l = b?.length ?: -1

4.!! 연산자

  • 어떤 값이든 널이 될 수 없는 타입으로 (강제로) 변경
  • 아래와 같이!! 연산자를 사용하면 값이 null인 경우 예외를 발생시킨다.
val l = b!!.length

Reference

728x90