- ==: 두 객체가 같은 메모리 주소를 참조하는지 확인.
- .equals(): 두 객체의 내용이 같은지 확인.
.equals()는 일반적으로 오버라이드되어 객체의 특정 속성(문자열, 필드 등)을 비교합니다.
- 참조(Reference): 객체가 저장된 메모리의 위치를 나타내는 값입니다.
- 참조 주소(Address): 객체가 실제로 저장된 메모리의 주소입니다.
즉, 참조는 객체가 메모리의 어느 위치에 저장되어 있는지를 나타내는 변수라고 이해하면 됩니다.
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
Java에서 문자열은 객체입니다.
따라서 == 연산자는 문자열의 실제 값이 아니라 참조(주소)를 비교합니다.
- str1과 str2:
- str1과 str2는 **리터럴 풀(String Pool)**에 저장된 동일한 "hello"를 참조합니다.
- 즉, str1과 str2는 같은 메모리 주소를 가리키므로 str1 == str2는 true를 반환합니다.
- str1과 str3:
- str3는 new String("hello")로 생성된 새로운 객체입니다.
- 따라서, str1과 str3는 다른 메모리 주소를 가지므로 str1 == str3는 false를 반환합니다.
equals()는 문자열의 실제 값(내용)을 비교합니다.
따라서 참조 주소가 다르더라도 문자열의 내용이 같다면 true를 반환합니다.
System.out.println(str1 == str2); // true (참조 주소가 동일)
System.out.println(str1 == str3); // false (참조 주소가 다름)
System.out.println(str1.equals(str3)); // true (문자열의 내용이 동일)
왜 이런 일이 발생할까?
(1) String Pool:
- 문자열 리터럴(예: "hello")은 Java의 String Pool에 저장됩니다.
- 동일한 문자열 리터럴이 여러 번 사용되면, 메모리를 절약하기 위해 기존 객체를 재사용합니다.
(2) new 키워드:
- new String("hello")는 항상 새로운 문자열 객체를 생성합니다.
- 따라서 동일한 내용의 문자열이라도 새로운 메모리 주소를 가집니다.
'[JAVA] 개발 > 문법' 카테고리의 다른 글
[JAVA] String.split("x",-1); (0) | 2024.11.18 |
---|---|
[JAVA] char vs String (0) | 2024.11.16 |
[JAVA] 배열 vs 리스트 (0) | 2024.11.13 |