1. 참조형
메모리상 객체가 존재하는 주소를 stack에 저장하며, 실제 값은 heap 영역에 저장된다.
ex. Int, Long, Float, Double
2. 기본형
변수에 값 자체를 저장하며, 실제 값은 stack에 저장된다.
ex. int, byte, short, long, float, double char, boolean
참조형으로 선언된 변수 모두 코틀린 컴파일러가 기본형으로 변환하여 저장한다.
val a : Int = 128
val b = a
println(a === b) //자료형이 기본형인 int형으로 자동 변환되어 값이 동일하므로 true
따라서 삼중 등호 (===) (: 참조 주소 비교) 가 비교하는 값도 저장된 값인 128 이다.
하지만 같은 값을 저장한 경우라도 삼중 등호로 비교한 값이 다른 경우가 있다.
val aa : Int = 128
val bb: Int? = 128
println(a == b) //true
println(a === b) //flase
null을 허용한 변수 bb는 (Int?로 표시) 참조형으로 저장되므로 bb에는 128이 저장된 heap의 저장주소가 저장된다. 따라서 aa와 bb를 삼중 등호( === ) 로 비교하면 false가 나온다.
이를 종합해서 아래 코드로 복습해보자.
val a: Int = 128
val b = a
println(a === b) //true
val c : Int? = a //참조형으로 저장 (주소 A1)
val d : Int? = a //참조형으로 저장 (주소 A2)
val e : Int? = c //참조형으로 저장 (주소 A1) -> c와 e는 같은 객체
println(c == d) //true
println(c === d) //false
println(c === e) //true
다만, 저장되는 값이 128보다 작으면 (정확히는 -128~127 범위 내에 있으면) 그 값은 캐시에 저장되고 변수는 캐시의 주소를 가리킨다. 이유는 더 좋은 성능의 프로그램을 만들 수 있기 때문이라고 한다. 따라서 위의 코드의 a의 값을 126로 바꾸면
val a: Int = 126 //a : 캐시의 주소 저장됨
val b = a
println(a === b) //true
val c : Int? = a //참조형으로 저장 (주소 B1)
val d : Int? = a //참조형으로 저장 (주소 B1)
val e : Int? = c //참조형으로 저장 (주소 B1) -> c와 e는 같은 객체 참조
println(c == d) //true
println(c === d) //true
println(c === e) //true
결과값이 달라진다.
'2023 여름방학 > Kotlin' 카테고리의 다른 글
[코틀린/kotlin] 주석처리 단축키 작동 안될때 (0) | 2023.07.16 |
---|---|
[코틀린/kotlin] 세이프 콜, non-null 단정 기호, 엘비스 연산자 (0) | 2023.07.16 |