728x90
두 가지 측면에서 이야기할 수 있다.
동일성 → heap 영역에 할당된 객체의 주소값이 서로 같다.
동등성 → 각 객체가 갖고 있는 데이터가 서로 같다.
꼬리질문 1:
그렇다면 아래 코드의 결과를 예상해 보시오.
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2);
System.out.println(str1 == str3);
System.out.println(str1.equals(str3));
꼬리답변1:
true true true로 예상하였으나 결과는 true false true가 나왔음
틀린 이유:
“무엇을 비교하는지”에 대한 이해가 없었음. c++에서는 연산자 오버로딩을 통해 str1 == str2 와 같은 경우 “Hello”라는 문자열 자체를 비교함. 하지만 java에서는 str1과 str2 안에 들어있는 메모리 주소 그 자체를 비교함.
그렇다면, str1 == str2는 false가 나와야 되는데 왜 true가 나오는가?
“String pool”의 존재를 몰랐음. java에서는 메모리 효율성을 위해 동일한 문자열 리터럴의 경우 기존 객체를 재사용함. 즉, str1과 str2는 결국 같은 메모리 주소에 있는 동일한 객체를 가리킴. 따라서 str1과 str2에 들어있는 메모리 주소는 같을 수밖에 없음.
'프로그래밍 언어 > Java' 카테고리의 다른 글
| [Java]try-catch 제대로 이해하기 (0) | 2025.05.28 |
|---|---|
| [Java]extends vs implements: 단일 vs 다중 상속 (0) | 2025.05.28 |
| Garbage collection (0) | 2025.05.28 |