UserV2 예제
UserV2 는 id (고객번호)가 같으면 논리적으로 같은 객체로 정의하겠다.
package lang.object.equals;
public class UserV2 {
private String id;
public UserV2(String id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
UserV2 user = (UserV2) obj;
return id.equals(user.id);
}
}
Object 의 equals() 메서드를 재정의했다.UserV2 의 동등성은 id (고객번호)로 비교한다.equals() 는 Object 타입을 매개변수로 사용한다. 따라서 객체의 특정 값을 사용하려면 다운캐스팅이 필요하다.this )에 있는 id 문자열과 비교 대상으로 넘어온 객체의 id 문자열을 비교한다.UserV2 에 있는 id 는 String 이다. 문자열 비교는 == 이 아니 equals() 를 사용해야 한다. package lang.object.equals;
public class EqualsMainV2 {
public static void main(String[] args) {
UserV2 user1 = new UserV2("id-100");
UserV2 user2 = new UserV2("id-100");
System.out.println("identity = " + (user1 == user2));
System.out.println("identity = " + (user1 == user2));
System.out.println("equality = " + user1.equals(user2));
}
}
identity = false
equality = true

user1 , user2 는 서로 다른 객체이지만 둘다 같은 id (고객번호)를 가지고 있다. 따라서 동등하다.정확한 equals() 구현
앞서 UserV2 에서 구현한 equals() 는 이해를 돕기 위해 매우 간단히 만든 버전이고, 실제로 정확하게 동작하려면 다음과 같이 구현해야 한다. 정확한 equals() 메서드를 구현하는 것은 생각보다 쉽지 않다.
IntelliJ를 포함한 대부분의 IDE는 정확한 equals() 코드를 자동으로 만들어준다.
generator 단축키: ⌘N (macOS) / Alt+Insert (Windows/Linux)
//변경 - 정확한 equals 구현, IDE 자동 생성
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(id, user.id);
}