Kotlin (코틀린)

[Kotlin] 코틀린의 String 저장 방식은 다르다?

Oscar:) 2024. 5. 20. 09:00

 

 

코틀린에서의 String 자료형 저장 방식에 대해 알아보자.

 

 


String

 

 

다들 알고 있는 문자열 자료형 String이다.

 

대부분의 자료형은 기본형 자료형(원시 타입)에 속하지만,

String만은 참조형 자료형이라는 것도 알고 있을 것이다.

 

그리고 참조형 자료형의 실제 데이터는 Heap 영역에 저장되고,

Stack 영역에는 Heap 영역의 주소를 가리키는 값이 저장된다는 것도 많이 언급했었다.

 

 

하지만 코틀린에서의 String은 위의 기존 방식대로 데이터를 저장하지 않는다..!

 

이것이 이번 포스팅의 주 내용이다.

 

 

 


String도 클래스잖아..!

 

 

그렇다. 당연히 String은 클래스이기에 참조형 자료형으로 구분된다.

 

 

일단, 지난 포스팅에서의 예제를 재탕해보자.

// 간단한 데이터 클래스 생성
data class Student(
    val name: String,
    val age: Int
)


// 객체 비교 후 출력
fun main() {
    val studentA = Student("Oscar", 29)
    val studentB = Student("Oscar", 29)

    println(studentA == studentB)  // 출력 : true
    println(studentA === studentB) // 출력 : false
}

 

임의로 생성해준 Student 클래스 역시 참조형 객체이므로

이중 등호 비교 결과는 true를, 삼중 등호 비교 결과는 false를 출력했었다.

 

 

 

메모리 구조를 보면 다음과 같다.

 

설명을 위해 지난 포스팅에서 사용한 이미지도 재탕한다.

 

모든 참조형 객체의 Stack · Heap 구조는 위와 비슷한 형식을 띈다.

 

 


 

 

그리고, 포스팅의 핵심인 String 예제다.

val str1 = "Oscar"
val str2 = "Oscar"

println(str1 == str2)
println(str1 === str2)

 

일반적인 상식대로면 String 객체 역시 아래와 같은 구조로 저장되어야 한다.

 

 

 

하지만 출력 결과는 다음과 같다.

 

 

..?!

 

2개의 String 객체가 참조 주소값도 동일하다고 출력된다.

그렇다면 내가 생각한 위 Heap 메모리 구조가 틀리다는 것이다..!

 

 

 


String Pool

 

 

위와 같은 결과는 코틀린은 String Pool 방식을 지원하기 때문이다.

 

 

Heap 메모리에 값이 저장되기 전에 동일한 값의 존재 여부를 확인해서

굳이 새로운 Heap 영역을 할당하지 않고 기존 주소를 참조하게 만드는 방식이다.

 

 

결과적으로 str1과 str2의 참조 주소는 동일하므로

삼중 등호를 사용해도 true를 반환하는 것이다.

 

 

String Pool 방식은 곧 메모리를 재활용하는 방식이라고 볼 수 있다.

 

 

 

 


 

 

 

 

코틀린은 편의성 · 성능적으로 확실히 월등하지만..

그래서인지 뭔가..뭔가 공부할게 더 많아지고 있는 것 같다..