Java 든 Kotlin 이든 문자열(String)은 reference 타입이다.
Summary
구분 | Java | Kotlin |
== (Structural Equality) |
primitive: 값 비교 reference: (주소) 값 비교 |
primitive: 값 비교 reference: 참조하여 값 비교 |
.equals() | reference 를 참조하여 값 비교 | == 과 동일 |
=== (Referential Eqaulity) |
X | primitive: 값 비교 reference: (주소) 값 비교 |
주의할 점
1. 코틀린은 사실 primitive type 이 없다.
간단한 정수값을 할당한 변수에도 .toInt, toBoolean() 등 메소드 사용할 수 있는 이유가 여기있다.
In Kotlin, everything is an object in the sense that you can call member functions and properties on any variable.
val num = 5
// 일반 변수였다면 다음과 같은 메소드를 가질 수 없었을 것이다.
num.toChar()
num.toString()
2. String 은 primitive type 이 아닌데 왜 (===) 에서도 값이 같다고 나오는가?
val str1 : String = "Vladimir"
val str2 : String = "Vladimir"
assertEquals(true, str1 == str2)
assertEquals(true, str1.equals(str2))
// ⚠️ ??? 왜지?
assertEquals(true, str1 === str2)
Java, Kotlin 에서 문자열이 어디에 어떻게 저장되는지 알 필요가 있다.
public class Main {
public static void main(String[] args) {
// String Literal declaration => stored in String Pool
var str1 = "Hello";
var str2 = "Hello";
System.out.println(str1 == str2); // true
System.out.println(str1.equals(str2)); // true
// `new` key word (object creation) => stored in heap
var str3 = new String("Hello");
var str4 = new String("Hello");
System.out.println(str3 == str4); // false
System.out.println(str4.equals(str3)); // true
}
}
Java 의 String Pool
문자열을 "" (String lteral) 로 선언하면 특이한 메커니즘이 동작하는데
- String Pool 에 해당 리터럴 문자열이 존재하는지 확인한다.
- 존재하지 않으면 새로 문자열을 String Pool에 생성한다.
- 존재하면 생성하지 않고 문자열 리터럴의 주소값만 반환한다.
반면에 `new` 키워드 (오브젝트 생성)를 사용할 경우
- Heap 에 곧바로 새로운 오브젝트를 생성한다.
- 오브젝트의 주소값을 반환한다.
String 은 immutable 이다.
(한 번 값이 정해지면, 변하지 않는다)
🔗 Reference
'JVM > Kotlin' 카테고리의 다른 글
[Kotlin] SortedSet, NavigableSet, TreeSet (0) | 2022.09.16 |
---|---|
[Kotlin] Comparator, Comparable (0) | 2022.09.16 |
[Kotlin] Array SumOf, minOf, maxOf (0) | 2020.10.13 |
[Kotlin] Companion Object (static in Java) (0) | 2020.06.28 |
[Kotlin] Null-Safe (0) | 2020.06.28 |