코틀린 강좌 #21 null 값을 처리하는 방법? 동일한지를 확인하는 방법?

Kotlin/기본 문법 · 2020. 12. 24. 12:27

테크과학! DiMo

 

테크과학! DiMo

개발자가 얘기하는 생활 속 IT기술에 대한 과학! 여러분이 몰랐던, 혹은 정확히 알지 못했던 IT 테크놀러지를 파드립니다! 좋은 영상을 위한 채널 후원, 투네이션을 통해서 해주세요! 후원링크 htt

www.youtube.com

 

 

개발 환경: play.kotlinlang.org


 


?.

null safe operator

 

참조 연산자를 실행하기 전에 먼저 객체가 null인지 확인부터하고

 

객체가 null이라면 뒤따라 오는 구문을 실행하지 않음

 

ex) sample?.toUpperCase() 

 

sample이 null이면 toUpperCase()를 실행하지 않음

 

?:

 

elvis operator

 

객체가 null이 아니라면 그대로 사용하지만 null이면

 

연산자 우측의 객체를 사용한다.

 

ex) sample?:"default"

 

sample이 null 이니까 대신 "default"를 사용

 

!!.


non-null assertion operator


참조 연산자를 사용할 때 null 여부를 컴파일 시 확인하지 않도록 하여

 

runtime시 NPE가 나도록 의도적으로 방치하는 연산자

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



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

fun main() { 
    var a: String? = null 
    a?.run { 
        println(toUpperCase()) 
        println(toLowerCase()) 
    } 
} 
Output: 
scope 함수 전체가 수행되지 않음 

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


null을 체크하기 위해 if문 대신 사용하면 편리한 기능


변수의 동일성

1. 내용의 동일성

 

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

 

== 연산자를 사용

 

2. 객체의 동일성

 

서로 다른 변수가 메모리 상의 같은 객체를 가리킬 때만 동일하다고 판단하는 것

 

===연산자


내용의 동일성은 자동으로 판단되는 것이 아닌 코틀린의 모든 클래스가 내부적으로 상속받는


Any라는 최상위 클래스에 equals() 함수가 반환하는 boolean 값으로 판단하게 된다.

기본 자료형에는 자료형의 특징에 따라 equals() 함수가 이미 구현되어 있지만 커스텀 class를 만들 때는

 

equals를 상속받아 동일성을 확인해주는 구문을 별도로 구현해야 한다.


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

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

Output:
a == b : true
a === b : false
a == c : true
a === c : true
a == d : false
a === d : false