티스토리 뷰

␀ null값을 처리하는 방법

코틀린의 언어 철학은 'null은 없다'로 자바 보다는 null 처리가 매우 간편한 편이다.

코틀린에서는 nullable 변수를 만들어 객체가 들어있지 않은 null상태의 변수를 만들 수 있는데, 하지만 null 상태로 속성이나 함수를 사용하려고 하면, null pointer exception이 발생하기 때문에 nullable 변수를 사용할 때는 null 체크를 해야 한다. 만약에 체크를 하지 않으면, 코드가 컴파일 되지 않는다. 그러면 if문으로 일일이 체크하지 않고 좀더 쉽게 null을 체크할 수 있는 방법은 없을까?

코틀린에서는 그런 방법이 존재한다.

  1. null safe operator: ?.

    null safe operator는 참조 연산자를 실행하기 전에 먼저 객체가 null인지부터 확인하고 만약에 객체가 null이라면 뒤에 오는 함수를 실행하지 않는다.

  2. elvis operator: ?:

    elvis operator는 객체가 null 아니라면, 그대로 사용하지만, null이라면, 연산자 오른쪽에 있는 "default" 값을 사용한다. ex) sample?:"default"

  3. non-null assertion operator: !!.

    non-null assertion operator는 참조연산자를 사용할 때, null 여부를 컴파일시 확인하지 않도록 하여 런타임 시 null pointer exception이 나도록 의도적으로 방치하는 연산자이다.

fun main(args: Array<String>) {
    var a: String? = null

    println(a?.uppercase())

    println(a?:"default".uppercase())

    println(a!!.uppercase())

}

또한 null safe 연산자는 스코프 함수와 사용하면, 더욱 편리하다.

다음과 같은 코드를 통해 확인할 수 있다.

// 1번
fun main(args: Array<String>) {
    var a: String? = null

    a?.run {
        println(uppercase())
        println(lowercase())
    }

}
// 2번
fun main(args: Array<String>) {
    var a: String? = null
    a = "kotlin Exam String"
    a?.run {
        println(uppercase())
        println(lowercase())
    }

}

다음과 같이 run을 통해 실행하면 1번 코드는 실행되지 않으며, 2번 코드는 실행된다.

= 동일성 확인 방법

동일성에는 2가지 개념이 있다.

  1. 내용의 동일성: 서로 다른 객체라도 같은 내용이면 동일이다.
  2. 객체의 동일성: 서로 같은 객체가 같은 내용을 담고 있는 때 동일하다.

내용의 동일성을 판단하는 연산자는 == 이며 객체의 동일성을 판단하는 연산자는 ===이다.

이때 내용의 동일성을 판단하는 == 연산자는 자동으로 판단하는 것이 아닌 코틀린의 모든 클래스가 내부적으로 상속받는 Any라는 최상위 클래스의 equals()함수가 반환하는 boolean값으로 판단하게 된다. 기본 자료형에는 자료형에 따라 equals() 함수가 이미 구현되어 있지만, 우리가 커스텀 클래스를 만들 때는

open fun equals(other: Any?) : Boolean을 상속받아 동일성을 확인해주는 구문을 별로 구현해야 한다.

아래의 예시를 보자

fun main(args: Array<String>) {

    var a = Product("콜라", 1000)
    var b = Product("콜라", 1000)
    var c = a
    var d = Product("사이다", 1000)

    println(a == b) // true 내용은 같으나 
    println(a === b) // false 객체가 다름

    println(a == c) // true 내용과 객체가 모두 같음
    println(a === c) // true

    println(a == d) // false 내용과 객체가 모두 다름
    println(a === d) // false

}

class Product(val name: String, val price: Int) {
    override fun equals(other: Any?): Boolean {
        if(other is Product) {
            return other.name == name && other.price == price
        }
        else {
            return false
        }
    }
}

위와 같이 코틀린에서는 객체와 내용이 같은지 확인할 수 있는 방법이 존재하므로 코드를 짤 때 이를 잘 고려하자.

'Android > Kotlin' 카테고리의 다른 글

[Kotlin] 중첩 클래스와 내부 클래스  (0) 2021.12.14
[Kotlin] 함수의 argument를 다루는 방법과 infix 함수  (0) 2021.12.08
[Kotlin] List  (0) 2021.12.08
[Kotlin] Generic  (0) 2021.12.07
[Kotlin] 클래스의 다형성  (0) 2021.12.07