‘JAVA에서 두 개의 오브젝트가 같은가’ 라는 말은 주의해서 사용해야 한다.
JAVA에서는 두 개의 오브젝트가 완전히 같은 동일한 (Identical) 오브젝트라고 말하는 것과, 동일한 정보를 담고 있는 (Equivalent) 오브젝트라고 말하는 것은 분명한 차이가 있다.
전자는 동일성(Identical) 비교라 하고, 후자는 동등성(Equivalent) 비교라고 한다.
동일성은 == 연산자로 동등성은 equals() 메소드를 이용해 비교한다.
두 개의 오브젝트가 동일하다면 사실은 하나의 오브젝트만 존재하는 것이고 두 개의 오브젝트 레퍼런스 변수를 갖고 있을 뿐이다.
두개의 오브젝트가 동일하지는 않지만 동등한 경우에는 두 개의 각기 다른 오브젝트가 메모리상에 존재하는 것인데, 오브젝트의 동등성 기준에 따라 두 개의 각기 다른 오브젝트 정보가 동등하다고 판단하는 것일 뿐이다. 물론 동일한 오브젝트는 동등하기도 할 것이다. 하지만 그 반대는 항상 참은 아니다.
자바 클래스를 만들 때 equals() 메소드를 따로 구현하지 않았다면, 최상위 클래스인 Object 클래스에 구현되어 있는 equals() 메소드가 사용된다.
Object 의 equals() 메소드는 두 오브젝트의 동일성을 비교해서 그 결과를 돌려준다. 따라서 이때는 동일한 오브젝트여야지만 동등한 오브젝트라고 여겨질 것이다.
출처) 토비의 스프링 3.1 Vol. 1