equals 설계가 이해가 어렵습니다
질문 내용이 명확하지 않아서 어려움을 느끼시는 부분이 어떤 지점인지는 알 수 없으나, 제가 스스로의 이해를 위해서 작성했던 코드를 확인하시면 도움이 될 것 같아 첨부합니다.package mytest.equality; public class UserMain { public static void main(String[] args) { User user1 = new User("id-100"); User user2 = new User("id-100"); // prints false System.out.println(user1.equals(user2)); // test code System.out.println(user1); // this // ㄴ prints mytest.equality.User@30f39991 System.out.println(user2); // obj // ㄴ prints mytest.equality.User@452b3a41 System.out.println(user1 == user2); // 당연히 false } }package mytest.equality; public class User { private String id; public User(String id) { this.id = id; } @Override public boolean equals(Object o) { // 1. // 위 UserMain에서 본 것과 같이 this와 o는 각각 user1, user2의 // 패키지.클래스@해시코드를 리턴함 즉, physical address를 리턴함. // 이 둘이 같다면 아예 동일한 객체이므로 당연히 동등하기도 함. if (this == o) return true; // 2. 아래 해설 코드 확인 if (o == null || getClass() != o.getClass()) return false; // 여기까지 도달했다면, user1과 user2 객체는 // `패키지.클래스`는 동일하지만, 해시코드는 동일하지 않은 상태라는 것이 보증됨. // 3. // 해당 클래스에서는 User의 field인 id값이 동일하다면 동등한 객체로 판단하기로 정했음. // 따라서 User field인 id에 접근해야 하는데, // 참조 타입이 Object type(부모)인 상태로는 id(자식)에 접근할 수 없음. // 따라서 down-casting User user = (User) o; // 4. // 두 객체의 id 값이 동일한지 확인. // 맞다면 동등한 객체이고, 아니라면 동등하지 않은 객체임. return id == user.id; // ㄴ (this.id) == (user.id);와 같은 의미임. }// 위 코드 블록의 2.에 대한 해설 코드 // o == null // ㄴ 비교하려는 객체가 null 즉 없는 상태라면, 당연히 동일/동등하지 않음. // getClass()는 다음과 같음 System.out.println(user1.getClass()); // ㄴ prints class mytest.equality.User // o.getClass()는 다음과 같음 System.out.println(user2.getClass()); // ㄴ prints class mytest.equality.User // getClass()는 해당 객체의 `패키지.클래스`를 리턴함. // 이 값이 동일하지 않다면 해시코드는 확인할 필요도 없이 동일/동등하지 않은 객체임.