Java

[Java] == 연산자와 .equals()의 차이는?

Woonys 2022. 6. 17. 00:26
반응형

==.equals()의 차이는?

저번 글에서 썼던 예제를 살짝 바꿔보자.

public static void main(String[] args) {
        Integer a = 128;
    Integer b = 128;
    System.out.println(a == b);
    System.out.println(a.equals(b));
}

결과는 어떻게 나올까?

false // ==
true // .equals()

== 연산자야 둘을 비교하는 연산자인 건 워낙 많이 봤고, .equals() 메소드도 보면 두 객체를 비교하는 메소드인 것 같은데 무엇이 다르길래 하나는 false이고 하나는 true일까? 바로 무엇을 비교하느냐의 차이다. == 연산자는 객체 자체를 비교한다. 정확히는 비교하려는 두 객체 각각의 메모리 내 주소 번지를 비교하는 것.

a가 참조하고 있는 Integer 객체와 b가 참조하고 있는 Integer 객체는 값은 같지만 서로 다른 힙 메모리 영역 내에서 다른 주소 번지에 위치한다. 주소 값이 같지 않으니 false를 반환한다. 여기서 == 연산자를 함부로 쓰면 안되는 이유가 나온다. 주로 두 객체를 비교할 때는 두 객체의 값을 비교하는 경우가 대부분이다. 그런데 == 연산자는 객체가 저장되어 있는 메모리의 주소를 비교한다. 만약 이전 값을 캐싱해놓은 객체가 있다면 어떻게 될까? 새로 생성하지 않고 이전에 만든 객체가 리턴될 수 있다. 따라서 객체 비교에 == 연산자를 쓰는 것은 예상치 못한 결과를 가져올 수 있기에 되도록 쓰지 않는 게 좋다.

반면, .equals() 메소드는 객체가 갖는 값을 비교한다. 서로 다른 주소 번지에 위치한 두 Integer 객체 a, b는 주소 번지는 다를지언정 그 주소 안에 들어있는 값이 128인 건 동일하다. 그러니 true를 반환한다. 객체의 값을 비교하고 싶다면 반드시 .equals()를 쓰도록 하자.

Reference

반응형