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 연산자
- ?.
- null safe 연산자
- 참조연산자를 실행하기 전에 먼저 객체가 null 인지 확인부터하고 객체가 null이라면 뒤의 구문을 실행하지 않는 연산자
- null safe 연산자
- ?:
- elvis 연산자
- 객체가 null이 아니라면 그대로 사용하지만 null 이라면 연산자 우측의 객체로 대체되는 연산자
- elvis 연산자
- !!.
- 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
}
동일성
- 내용의 동일성
- a == b
- 메모리 상의 서로 다른 곳에 할당된 객체라 해도 그 내용이 같다면 동일하다고 판단
- 내용의 동일성은 자동으로 판단되는 것이 아닌 코틀린의 모든 클래스가 내부적으로 상속받는 Any라는 최상위 클래스의 equals() 함수가 반환하는 Boolean 값으로 판단
- 기본 자료형에는 자료형의 특징에 따라 equals() 함수가 이미 구현되어 있지만, 커스터마이징한 Class를 만들 때는 open fun equals(other: Any?): Boolean 이러한 equals를 상속받아 동일성을 확인해주는 구문을 별도로 구현해야 한다.
- 객체의 동일성
- 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
}