public boolean equals(Object obj) { ··· }
: equals() 메소드의 매개 타입은 Object인데,
이것은 모든 객체가 매개값으로 대입될 수 있음을 말함
→ 왜냐하면 모든 객체는 Object 타입으로 자동 타입 변환될 수 있기 때문
: Object 클래스의 equals() 메소드는 비교 연산자인 ==과 동일한 결과를 리턴함
Object obj1 = new Object();
Object obj2 = new Object();
//obj1(기준 객체).equals(obj2(비교 객체));
boolean result = obj1.equals(obj2);
// equals 와 결과가 동일함
boolean result = (obj1 == obj2)
: 동등 비교할 때 equals() 메소드를 흔히 사용함
두 객체를 비교해서 논리적으로 동등하면 true를 리턴,
그렇지 않으면 false를 리턴함
: 논리적으로 동등하다는 것은 같은 객체이건 다른 객체이건
상괎없이 객체가 저장하고 있는 데이터가 동일함을 뜻함
ex)
String 객체의 equals() 메소드는 String 객체의 번지를 비교하는 것이 아니고,
문자열이 동일한지 조사해서 같다면 true를 리턴하고,
그렇지 않다면 false를 리턴함
이것이 가능한 이유는
String 클래스가 Object의 equals() 메소드를 재정의(오버라이딩)해서
번지 비교가 아닌 문자열 비교로 변경했기 때문
일반적으로 Object의 equals() 메소드는
직접 사용되지 않고 하위 클래스에서 재정의하여
논리적으로 동등 비교할 때 이용됨
: equals() 메소드를 재정의할 때에는
매개값(비교 객체)이 기준 객체와 동일한 타입의 객체인지 먼저 확인
Object 타입의 매개 변수는 모든 객체가 매개값으로 제공될 수 있기 때문에
instanceof 연산자로 기준 객체와 동일한 타입인지 제일 먼저 확인해야 함
class Member {
public String id;
public Member(String id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
// 매개값이 Member 타입인지 확인
if(obj instanceof Member) {
//Memeber 타입으로 강제 타입 변환하고
//id필드값이 동일하니 검사한 후,
//동일하다면 true를 리턴
Member member = (Member) obj;
if(id.equals(member.id)) {
return true;
}
}
//매개값이 Member 타입이 아니거나
//id필드값이 다른 경우 false를 리턴
return false;
}
}
public class MemberExample {
public static void main(String[] args) {
Member obj1 = new Member("blue");
Member obj2 = new Member("blue");
Member obj3 = new Member("red");
//매개값이 Member타입이고
//id필드값도 동일하므로 true
if(obj1.equals(obj2)) {
System.out.println("obj1과 obj2는 동등합니다.");
} else {
System.out.println("obj1과 obj2는 동등하지 않습니다.");
}
//매개값이 Member타입이지만
//id필드값이 다르므로 false
if(obj1.equals(obj3)) {
System.out.println("obj1과 obj3은 동등합니다.");
} else {
System.out.println("obj1과 obj3은 동등하지 않습니다.");
}
}
}
💻 결과
obj1과 obj2는 동등합니다.
obj1과 obj3은 동등하지 않습니다.