본문 바로가기

[JAVA] 개발/문법

문자열 비교 (참조 주소와 객체)

  • ==: 두 객체가 같은 메모리 주소를 참조하는지 확인.
  • .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