Java 의 equals 와 == 의 차이

Dayeon myeong·2022년 3월 2일
0

면접

목록 보기
4/35

Java 의 equals 와 == 의 차이에 대해 설명해주세요.

기본 equals는 ==과 마찬가지로 객체의 referece value 참조값(주소값) 자체를 비교한다. 재정의하여 필드의 내용 비교가 가능하다.

public boolean equals(Object obj) {
    return (this == obj);
}

equals를 재정의해야하는 경우
객체 식별성(object identity; 두 객체가 물리적으로 같은가, 같은 reference value를 가졌나)이 아닌 '논리적 동치성'을 확인해야 할 경우 재정의해야한다.

논리적 동치성이란 주소값이 아닌 값 자체, 필드 값 자체가 같은것이라고 보면 될 것 같다.

Integer,String 같은 값 클래스는 두 객체의 물리적인 주소값이 일치하는지가 궁금한 게 아니고 값이 일치하는지를 알고 싶은것이다. equals를 재정의해두면 값 비교는 물론 Map의 키와 Set의 원소로도 사용이 가능하다. 컬렉션의 contains와 HashSet, HashMap의 get 의 경우 equals를 사용하여 값 조회를 하기 때문에 논리적 동치성을 가진 객체들은 equals를 재정의한다. (추가적으로 hashCode도 재정의해야 한다. HashSet, HashMap은 hashCode를 기반으로 해시 버킷에 데이터를 저장하기 때문이다. )

equals 재정의 할 때 지켜야 할 규약 : 동치관계

equals를 재정의할 때는 5가지 규약을 지켜야 한다.

Object 명세에서 말하는 동치관계란 무엇일까?
집합을 서로 같은 원소들로 이루어진 부분집합으로 나누는 연산. 이 부분집합을 동치 클래스라 한다.
equals 메서드가 쓸모 있으려면 모든 원소가 같은 동치클래스에 속한 어떤 원소와도 교환이 가능해야 한다.

내 생각에는 Integer, String같은 값 클래스의 경우 값이 서로 일치하여 교환되도 무관하고, 혹은 클래스의 경우에는 두 객체의 멤버 변수들을 서로 교환되도 이상이 없는 것이라 보면 될 것 같다.

  • 반사성(reflexivity): null이 아닌 모든 참조 값 x에 대해, x.equals(x)는 true다.
    - 반사성은 객체는 자기 자신과 같아야 한다.

  • 대칭성(symmetry): null이 아닌 모든 참조 값 x, y에 대해, x.equals(y)가 true면 y.equals(x)도 true다.
    - 대칭성은 두 객체는 서로에 대한 동치 여부에 똑같이 답해야 한다는 뜻이다.

  • 추이성(transitivity): null이 아닌 모든 참조 값 x, y, z에 대해, x.equals(y)가 true이고, y.equals(z)도 true면 x.equals(z)도 true다.
    - 추이성은 첫 번째 객체와 두 번째 객체가 같고, 두 번째 객체와 세 번째 객체가 같아면, 첫 번째 객체와 세 번째 객체도 같아야 한다.

  • 일관성(consistency): null이 아닌 모든 참조 값 x, y에 대해, x.equals(y)를 반복해서 호출하면 항상 true이거나 false다.
    - 일관성이란 두 객체가 같다면 (어느 하나 혹은 두 객체 모두가 수정되지 않는 한) 앞으로도 영원히 같아야 한다는 뜻이다.

  • null아님: null이 아닌 모든 참조 값 x에 대해, x.equals(null)은 false다.
    - 모든 객체가 null과 같지 않아야 한다.

equals 재정의할 때 주의사항

상속을 통해서 구체 클래스를 확장해 새로운 값을 추가하면서 equals 규약을 만족시키긴 어렵다. 핵심 필드를 무시한 채 재정의하거나, 추이성, 대칭성 위배, 무한재귀, 리스코프 치환 위배 등의 문제가 있다. 문제를 해결하는 방법은 상속 대신에 컴포지션을 사용하는 것이다.

컴포지션이란 기존 클래스가 새로운 클래스의 구성 요소로 쓰인다.
기존 클래스를 확장하는 대신 새로운 클래스를 만들고 private 필드로 기존 클래스의 인스턴스를 참조하게 한다. 컴포지션을 통해 새 클래스의 인스턴스 메서드들은 기존 클래스에 대응하는 메서드를 호출해 그 결과를 반환한다.

아래 참고
아이템 10 equals는 일반규약을 지켜 재정의하라

profile
부족함을 당당히 마주하는 용기

0개의 댓글