기록

[코틀린/Kotlin] null처리 연산자와 동일성 확인 본문

[Study]/Kotlin

[코틀린/Kotlin] null처리 연산자와 동일성 확인

Dannnnnn 2022. 5. 9. 19:18
반응형

nullable 변수에서 null을 처리하는 법과 변수 간에 동일성을 확인하는 법을 알아보자.

 

1.  Null 처리 연산자

코틀린에서 nullable 변수를 만들어 null 상태를 담을 수 있다.

하지만 null 상태로 속성이나 함수를 쓰려고 하면 *null pointer exception 이 발생하기 때문에 nullable 변수를 사용할 때에는 null check가 없이는 코드가 컴파일 되지 않는다.

(* null인 객체를 참조하면 발생하는 오류)

 

null체크를 위해 일일히 if문으로 조건을 체크하는 대신 더 편리한 방법을 제공한다.

 

?. (null safe operator)

참조연산자를 실행하기 전에, 먼저 객체가 null인지 확인하고 객체가 null이라면 뒤따라오는 구문을 실행하지 않는 연산자이다.

 

?: (elvis operator)

객체가 null이 아니라면 그대로 실행하지만 null이라면 연산자 우측의 객체로 대체해 실행하는 연산자이다.

 

!!. (non-null assertion operator)

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

fun main() {
    
    var a: String? = null
    
    println(a?.toUpperCase())
    
    println(a?:"default".toUpperCase())
    
    println(a!!.toUpperCase())
    
}

 

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

fun main() {
    
    var a: String? = "Kotlin Exam"
    
    a?.run {
        println(toUpperCase())
        println(toLowerCase())
    }
    
}

스코프 함수 run 전체가 실행되는 것을 볼 수 있다.

null을 체크하기 위해 if문 대신 사용하면 편리한 기능이므로 꼭 알아두자.

 

2. 변수의 동일성 확인

동일성에는 내용의 동일성, 객체의 동일성 두 가지가 있다.

내용의 동일성 : 메모리 상에 서로 다른 곳에 할당된 객체라 해도 그 내용이 같다면 동일하다고 판단하는 것

객체의 동일성 : 서로 다른 변수가 메모리상에 같은 객체를 가르키고 있을 때만 동일하다고 판단하는 것

 

내용의 동일성을 판단하는 연산자 : ==

객체의 동일성을 판단하는 연산자 : ===

 

내용의 동일성은 자동으로 판단되는 것이 아닌, 코틀린의 모든 클래스가 내부적으로 상속받는 Any라는 최상위 클래스의 equals() 함수가 반환하는 Boolean 값으로 판단하게 된다.

 

기본 자료형에는 자료형의 특징에 따라 equals()함수가 이미 구현되어 있지만, 커스텀 클래스를 만들 때는 equals를 상속받아 동일성을 확인하는 구문을 별도로 구현해야 한다.

 

equals함수를 override 하여 파라미터로 넘어온 객체가 Product라면 이름과 가격이 모두 같은지를 비교하여 boolean 값으로 반환하여 구현한다.

fun main() {
    
    var a = Product("콜라", 1000)
    var b = Product("콜라", 1000)
    var c = a
    var d = Product("사이다", 1000)
    
    println(a == b)
    println(a === b)
    
    println(a == c)
    println(a === c)
    
    println(a == d)
    println(a === d)
}

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
        }
    }
}

a와 b는 내용은 같지만 객체는 별개이다.

a와 c는 내용과 객체 모두 일치한다.

a와 d는 내용과 객체 모두 불일치한다.

 

null처리와 동일성의 확인은 프로그램 작성 도중 빈번하게 사용하는 기능이다.
그 동작 방식들을 잘 알고 사용하는 것이 좋다.

 

 

 

https://www.youtube.com/watch?v=q7GV68jKLVM&list=PLQdnHjXZyYadiw5aV3p6DwUdXV2bZuhlN&index=22

위 강의를 보면서 개인적으로 공부한 내용을 정리하였습니다.

반응형