동등성
두 객체의 내용(값)이 같은지 비교하는 것입니다. Java에서는 equals() 메서드로 판단합니다.
동일성 vs 동등성
| 개념 | 비교 대상 | 연산자/메서드 | 질문 |
|---|---|---|---|
| 동일성 | 참조(주소) | == | 같은 객체인가? |
| 동등성 | 내용(값) | equals() | 같은 값인가? |
비유
동일성: 같은 사람인가? (주민등록번호)
동등성: 같은 내용인가? (이름, 나이가 같음)
예시
String s1 = new String("hello");
String s2 = new String("hello");
// 동일성 - 같은 객체인가?
System.out.println(s1 == s2); // false (다른 객체)
// 동등성 - 같은 내용인가?
System.out.println(s1.equals(s2)); // true (내용이 같음)
메모리 관점
[Heap]
┌─────────────────┐
│ 0x100: "hello" │ ← s1이 참조
└─────────────────┘
┌─────────────────┐
│ 0x200: "hello" │ ← s2가 참조
└─────────────────┘
동일성(==): 0x100 != 0x200 → false
동등성(equals): "hello" == "hello" → true
커스텀 객체에서 동등성
class Money {
private int amount;
Money(int amount) {
this.amount = amount;
}
// equals 재정의 전
// → Object의 equals 사용 (== 와 동일)
}
Money m1 = new Money(1000);
Money m2 = new Money(1000);
m1.equals(m2); // false (equals 재정의 안 함)
class Money {
private int amount;
Money(int amount) {
this.amount = amount;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (!(obj instanceof Money)) return false;
Money money = (Money) obj;
return this.amount == money.amount;
}
@Override
public int hashCode() {
return Objects.hash(amount);
}
}
Money m1 = new Money(1000);
Money m2 = new Money(1000);
m1.equals(m2); // true (금액이 같으면 동등)
실무에서 중요한 이유
// HashMap, HashSet은 동등성으로 비교
Set<Money> wallet = new HashSet<>();
wallet.add(new Money(1000));
wallet.contains(new Money(1000)); // equals 재정의해야 true
정리
동일성(Identity): == → 같은 객체인가?
동등성(Equality): equals() → 같은 값인가?