[Java] ==, equals() /문자열 비교 정복하기

2024. 12. 27. 12:27·Engineering Notes/Java & Spring

내가 파이썬만을 고집했다면 평생 들지 않았을 의문 중 하나이다.
 
왜 자바에서는 문자열을 비교할 때, equals() 메서드를 사용해야 하는가?
자바에서 문자열 비교 시, == 또는!= 연산자를 쓴다면 어떻게 되는가?
 
이에 대해 명쾌하게 답할 수 없다면 본 게시물을 읽을 가치가 있다.


String은 객체 타입인 '클래스'이다.

String str1 = new String("funczun");
String str2 = new String("funczun");

 우선 클래스답게 문자열 두 개를 생성해보았다.

System.out.println(str1 == str2); // false

 두 문자열을 == 연산자를 통해 비교하니 false가 출력되었다. 분명 str1, str2 모두 "funczun"으로 동일한데 false로 출력되는 이유가 궁금해진다.


== (!=) 연산자는 동일성을 비교하는 참조 비교 연산자다.

System.out.println(str1의 메모리 주소 == str2의 메모리 주소); // false

 해당 연산자는 문자열의 경우 두 문자열이 동일한 메모리 주소를 가리키는지 비교하는 '참조 비교 연산자'이다. 쉽게 말해 두 문자열 객체가 같은 객체인지 확인한다. 따라서 담긴 값이 같더라도, 두 문자열은 엄연히 각각 다른 객체로 생성되었기 때문에 두 문자열이 같지 않다고 보는 것이다. (값을 저장하는 기본 자료형의 경우, 당연히 값을 비교하는 데 쓰인다.)
 
 * 왜 실제 메모리 주소를 예시로 들지 않았나요?
 자바에서는 객체의 실제 메모리 주소를 직접적으로 얻을 수 없다. 관련 내용은 다음 포스팅에서 다루겠다.


문자열 리터럴 비교 시, 동일한 객체로 취급된다.

String str3 = "funczun";
String str4 = "funczun";

 일단 문자열 리터럴이라 함은 큰따옴표로 묶인 문자의 연속체이다. 자바에서는 이러한 문자열 리터럴에 대해 최적화 기능을 제공하는데, 이를테면 동일한 리터럴에 대해 동일한 객체를 참조하도록 한다.

System.out.println(str1 == str2); // true

 자바의 특성으로 인해 참조 비교 연산자를 사용하였음에도 true가 출력되는 것을 확인할 수 있다.


equals() 메서드를 사용하면 동등성을 확인한다.

String str1 = new String("funczun");
String str2 = new String("funczun");
String str3 = "funczun";
String str4 = "funczun";

System.out.println(str1.equals(str2));  // true
System.out.println(str3.equals(str4));  // true

 equals 메서드는 문자열이 논리적으로 동등한지 비교한다. 앞서 언급한 동일성이 자바 머신 기준 하에 메모리 참조를 비교하는 물리적인 방법이라면, 동등성은 인간이 생각하는 논리적인 기준에 맞추어 비교한다는 뜻이다. 중요한 점은 동등성이라는 개념 자체가 각각의 클래스마다 다르다는 것이며, String 클래스의 경우 문자열 내용이 그 기준 된다는 것이다.

'Engineering Notes > Java & Spring' 카테고리의 다른 글

[Java] if 문, switch 문, 삼항 연산자  (2) 2025.01.03
[Java] 객체의 실제 메모리 주소 얻기  (1) 2024.12.30
[Java] 주요 연산자 알아보기  (1) 2024.12.23
[Java] 기본 변수 한 장 정리  (3) 2024.12.20
[Java] 향상된 for 문  (1) 2024.12.16
'Engineering Notes/Java & Spring' 카테고리의 다른 글
  • [Java] if 문, switch 문, 삼항 연산자
  • [Java] 객체의 실제 메모리 주소 얻기
  • [Java] 주요 연산자 알아보기
  • [Java] 기본 변수 한 장 정리
UTACT
UTACT
시작은 가볍게 이유는 무겁게
  • UTACT
    Software Engineer
    UTACT
    • GitHub
  • 전체
    오늘
    어제
  • 공지사항

    • README
  • 최근 글

    • 분류 전체보기 (126)
      • Project Logs (2)
        • DashHub (2)
        • Re:Act (0)
        • Samsung NW (0)
      • Engineering Notes (76)
        • Java & Spring (44)
        • Database & Persistence (1)
        • DevOps & Infra (4)
        • CS & Algorithms (26)
        • Security (1)
      • Reflections (5)
        • Retrospectives (1)
        • Feedback Received (3)
        • Challenges (1)
      • Tips (24)
      • Archive (19)
  • 태그

    Reallocation
    where-was-i
    @CreatedDate
    vite
    CS
    Data Type
    heapify
    도커
    BFS
    hate-cnu
    Array
    iamdefinitelyabackenddeveloper
    VS Code
    REST
    데이터 영속성
    .prettierrc
    듀얼 피봇 퀵 정렬
    토스페이먼츠
    heap
    타입 소거
    DS
    OOP
    IntelliJ
    팀 정렬
    BOJ
    Python
    버프 슈트
    cherry-pick
    JPA
    인접 노드 리스트
  • hELLO· Designed By정상우.v4.10.6
UTACT
[Java] ==, equals() /문자열 비교 정복하기
상단으로

티스토리툴바