Object 는 동등성 비교를 위한 equals() 메서드를 제공한다.
자바는 두 객체가 같다라는 표현을 2가지로 분리해서 제공한다.
== 연산자를 사용해서 두 객체의 참조가 동일한 객체를 가리키고 있는지 확인equals() 메서드를 사용하여 두 객체가 논리적으로 동등한지 확인단어 정리 "동일"은 완전히 같음을 의미한다. 반면 "동등"은 같은 가치나 수준을 의미하지만 그 형태나 외관 등이 완전히 같지는 않을 수 있다.
쉽게 이야기해서 동일성은 물리적으로 같은 메모리에 있는 객체 인스턴스인지 참조값을 확인하는 것이고, 동등성은 논리적으로 같은지 확인하는 것이다. 동일성은 자바 머신 기준이고 메모리의 참조가 기준이므로 물리적이다. 반면 동등성은 보통 사람이 생각하는 논리적인 기준에 맞추어 비교한다.
예를 들어 같은 회원 번호를 가진 회원 객체가 2개 있다고 가정해보자.
User a = new User("id-100") //참조 x001
User b = new User("id-100") //참조 x002
이 경우 물리적으로 다른 메모리에 있는 다른 객체이지만, 회원 번호를 기준으로 생각해보면 논리적으로는 같은 회원으로 볼 수 있다. (주민등록번호가 같다고 가정해도 된다.)
따라서 동일성은 다르지만, 동등성은 같다. 문자의 경우도 마찬가지이다.
String s1 = "hello";
String s2 = "hello";
이 경우 물리적으로는 각각의 "hello" 문자열이 다른 메모리에 존재할 수 있지만, 논리적으로는 같은 "hello" 라는 문자열이다. (사실 이 경우 자바가 같은 메모리를 사용하도록 최적화 한다. 이 부분은 뒤에서 다룬다.)
예제를 통해서 동일성과 동등성을 비교해보자.
UserV1 예제
package lang.object.equals;
public class UserV1 {
private String id;
public UserV1(String id) {
this.id = id;
}
}
package lang.object.equals;
public class EqualsMainV1 {
public static void main(String[] args) {
UserV1 user1 = new UserV1("id-100");
UserV1 user2 = new UserV1("id-100");
System.out.println("identity = " + (user1 == user2));
System.out.println("equality = " + user1.equals(user2));
}
}