본문 바로가기
코틀린

코틀린(19) - null 처리와 동일성의 확인

by 왈레 2022. 3. 23.

Null 처리 by ?. ?: !!.

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

 

변수에 null 저장되어있는 상태로 속성이나 함수를 쓰려고 하면 null pointer exception 발생하기 때문에(null 객체를 참조하면 발생하는 오류) nullable변수를 사용할 때는 null 체크가 없이는 코드가 컴파일 되지않는다.

var sample:String? = null
if(sameple!=null)
println(smaple.toUpperCase())

 

그렇다면 null체크를 하기위해 일일이 if문으로 조건을 체크하는 대신 편리한 방법은 없을까? 물론 있다

 

null safe연산자, elvis 연산자 non-null assertion 연산자

  • ?. (null safe) : 조연산자를 실행하기 전에 먼저 객체가 null 인지 확인부터하고 객체가 null이라면 뒤따라오는 구문을 실행하지 않는다. println(a?.toUpperCase( )) x (a null이라면 null값을 반환한다)
  • ?: (elvis) : 객체가 null 아니라면 그대로 사용하지만 null이라면 오른쪽의 객체로 대체되어 사용된다. println(a?:"default".toUpperCase()) x (객체는 내가 정의, default라는 문자열 객체임) (null 대신 "default"라는 문자열로 대체된 대문자로 바뀌어 출력된다)
  • !!. (non-null assertion) :참조연산자를 사용할 null 여부를 컴파일시 확인하지 않도록 하여 런타임시 null pointer exception 나도록 의도적으로 방치한다. (구문이 실행되는 도중 null임을 확인하고 exception 발생하여 에러가 나고 프로그램이 중단된다)

 

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

fun main(){
    var a: String? = "Kotlin Exam"

    a?.run{
        println(toUpperCase())
        println(toLowerCase())
    }
}

이는 null 체크하기 위해 if 대신 사용하면 상당히 편리한 기능이므로 기억하세요

 

변수의 동일성 체크

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

 

1. 내용의 동일성(a==b): 메모리상에 서로 다른곳에 할당된 객체라고 해도 내용이 같다면 동일 하다고 판단하는

 

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

 

기본 자료형에는 자료형 특징에 따라 equals( )함수가 이미 구현되어 있지만 우리가 커스텀 class를 만들때는 open fun equals(other: Any?): Boolean 이러한 equals를 상속받아 동일성을 확인해주는 구문을 별도로 구현해야한다.

class smaplet(val name:String, val price: Int){

    override fun equals(other: Any?) : Boolean

 

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

fun main(){
    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) // 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
        }
    }
}

댓글