Home null과 동일성
Post
Cancel

null과 동일성

Null과 동일성

Nullable 변수

  • var sample: String ?= null
    • sample은 nullable 변수이다.
  • null 상태로 함수나 속성을 사용하면 null pointer exception이 발생하기 때문에 nullable 변수를 사용할 때는 null check 가 필요하다.
    • if문 사용: if(sample!=null) println(“~”)
  • if문 대신 3가지 연산자로 null check를 편리하게 할 수 있다. 밑에서 알아보자.

Null Check 연산자

  1. ?.
    • null safe 연산자
      • 참조연산자를 실행하기 전에 먼저 객체가 null 인지 확인부터하고 객체가 null이라면 뒤의 구문을 실행하지 않는 연산자
  2. ?:
    • elvis 연산자
      • 객체가 null이 아니라면 그대로 사용하지만 null 이라면 연산자 우측의 객체로 대체되는 연산자
  3. !!.
    • non-null assertion 연산자
    • 참조연산자를 사용할 때 null 여부를 컴파일시 확인하지 않도록 하여 런타임시 null pointer exception이 나도록 의도적으로 방치하는 연산자 (입력과 출력 부분에서 다루었던 내용)
1
2
3
4
5
6
7
8
9
10
11
fun main(){
    var a: String? = null
    
    println(a?.toUpperCase()) // null
    
    println(a?:"defualt".toUpperCase()) //DEFAULT
    
    println(a!!.toUpperCase()) //NullPointerException 발생 (에러)
    
}

Null check 연산자 활용

  • Scope 함수와 활용하면 편리하게 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fun main(){
   var a: String? = null
   a?.run{
       println(toUpperCase()) //참조연산자 필요없음
       println(toLowerCase())
   } //실행X, 오류는 아님, null도 출력X, 아무것도 출력X
   
   var b: String? = "Kotlin"
    b?.run{
       println(toUpperCase()) 
       println(toLowerCase())
   } // KOLIN kotlin
    
}

동일성

  1. 내용의 동일성
    • a == b
    • 메모리 상의 서로 다른 곳에 할당된 객체라 해도 그 내용이 같다면 동일하다고 판단
      • 내용의 동일성은 자동으로 판단되는 것이 아닌 코틀린의 모든 클래스가 내부적으로 상속받는 Any라는 최상위 클래스의 equals() 함수가 반환하는 Boolean 값으로 판단
      • 기본 자료형에는 자료형의 특징에 따라 equals() 함수가 이미 구현되어 있지만, 커스터마이징한 Class를 만들 때는 open fun equals(other: Any?): Boolean 이러한 equals를 상속받아 동일성을 확인해주는 구문을 별도로 구현해야 한다.
  2. 객체의 동일성
    • a === b
    • 서로 다른 변수가 메모리 상의 같은 객체를 가리키고 있을 때만 동일하다고 판단
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Product(val name: String, val price: Int){
    override fun equals(other: Any?): Boolean{
        if(other is Product){ // parameter로 넘어온 객체가 product라면 
            return other.name == name && other.price == price //이름과 가격 모두 같은지 비교
        }
        else return false
    }
}

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) //true
  
  println(a==d) //false
  println(a===d) //false
}