동등성

두 객체의 내용(값)이 같은지 비교하는 것입니다. 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() → 같은 값인가?

CSLOG에서 보기