8.3 참조 변수의 비교

1. ==의 배신 💔

기본 타입(int, double)은 ==로 비교하면 값이 같은지 확인합니다. 하지만 참조 타입(String, 배열 등)은 ==로 비교하면 “주소”가 같은지 확인합니다.

String s1 = new String("안녕");
String s2 = new String("안녕");

System.out.println(s1 == s2); // false! (주소가 다름)

내용은 같아도, 힙 영역에 따로따로 지어진 집이기 때문에 주소가 다릅니다.

flowchart TD
    subgraph Stack [변수]
        s1[변수 s1]
        s2[변수 s2]
    end
    
    subgraph Heap [객체 (집)]
        obj1[번지1: '안녕']
        obj2[번지2: '안녕']
    end
    
    s1 -->|가리킴| obj1
    s2 -->|가리킴| obj2
    
    s1 -. "=="은 화살표 도착지가 같은지 비교 .-> s2
    obj1 -. "equals()"는 상자 안의 내용물이 같은지 비교 .-> obj2
    
    style Stack fill:#eef,stroke:#333
    style Heap fill:#efe,stroke:#333

2. equals()를 써야 하는 이유

내용물(실제 값)이 같은지 비교하려면 equals() 메소드를 써야 합니다.

System.out.println(s1.equals(s2)); // true (내용이 같음)

비유:

  • ==: “너네 둘이 주민등록번호(주소)가 같아?” (동일 인물인가?)
  • equals(): “너네 둘이 생김새(내용)가 같아?” (일란성 쌍둥이인가?)
서브목차