코틀린에서 이중 등호(==)는 값만을 비교하고, 삼중 등호(===)는 값과 참조 주소를 모두 비교한다.
fun main() {
val a: Int = 128
val b = a // Int형으로 자료형 추론
println(a == b) // true
println(a === b) // true
// 값과 참조가 모두 동일
val c: Int? = a
val d: Int? = a
val e: Int? = c
println(c == d) // true
println(c === d) // false
println(c === e) // true
// Int?는 기본형이 아니라 객체 (참조 값을 스택에 저장, 동적 공간에 존재)
}
코틀린에서 기본형 변수는 값 자체를 직접 저장하지만, Nullable 변수 (?가 붙은 자료형 변수)는 객체로서 값의 참조 주소를 저장한다.
따라서 참조 동등성 검사 (===) 결과가 달라진다.
1. a는 기본형 정수 변수이다. 따라서 값을 직접 저장한다.
2. b는 a 값으로 초기화되어 a와 같은 값을 직접 저장한다.
=> 값도 같고 참조도 같기 때문에 a == b, a === b 모두 true를 반환한다.
3. c는 Heap(동적 공간)에 a의 값을 갖는 객체를 생성하고 Stack에 그 객체를 가리키는 참조 주소 값을 저장한다.
4. d는 Heap(동적 공간)에 또다른 a의 값을 갖는 객체를 생성하고 Stack에 그 객체를 가리키는 참조 주소 값을 저장한다.
5. e는 Stack에 c가 가리키는 참조 주소를 그대로 저장한다.
=> c와 d는 같은 값을 갖지만 서로 다른 객체를 가리키므로 c == d는 true, c === d는 false를 반환한다.
=> c와 e는 같은 참조 주소를 갖고 같은 객체를 가리키므로 c == e, c === e 모두 true를 반환한다.
++ 코틀린에서는 참조형으로 선언한 변수 값이 -128 ~ 127이라면 객체를 생성하지 않고 캐시에 그 값을 저장한다.
'Study > Kotlin Study' 카테고리의 다른 글
| [Kotlin] 증가 감소 연산자 (1) | 2023.08.20 |
|---|---|
| [Kotlin] Smart Cast (0) | 2023.08.19 |
| [Kotlin] 자료형 변환 (0) | 2023.08.18 |
| [Kotlin] NULL: Safe - call, Non - null, 엘비스 연산자 (0) | 2023.08.18 |
| [Kotlin] 기본형 VS 참조형 (0) | 2023.08.18 |