본문 바로가기

Study/Kotlin Study

[Kotlin] == VS ===

코틀린에서 이중 등호(==)는 값만을 비교하고, 삼중 등호(===)는 값과 참조 주소를 모두 비교한다.

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