[Java] equals() 와 hashCode()

2025. 1. 24. 08:26·개발/Java

equals()와 hashCode()는 Java에서 객체의 동등성(equality) 비교와 해싱(hashing) 을 위해 사용되는 중요한 메서드다.

equals()는 객체의 논리적 동등성을 비교하고, hashCode()는 객체의 해시 코드를 반환한다.


1. equals() 메서드:

  • 역할: 두 객체가 논리적으로 같은지 비교한다. 즉, 두 객체가 동등한(equivalent) 지를 판단한다.
  • 기본 구현: Object 클래스에 정의된 equals() 메서드는 객체의 참조(reference)를 비교. 즉, 두 객체가 동일한 메모리 주소를 가리키고 있는지 확인한다.
  • 재정의(Overriding): 객체의 참조가 아닌 내용(필드 값)을 기반으로 동등성을 비교하려면 equals() 메서드를 재정의해야 한다. 예를 들어, String 클래스는 문자열의 내용이 같으면 true를 반환하도록 equals()를 재정의되어있다.
  • 사용:
    • 객체의 논리적 동등성 비교
    • List, Set과 같은 컬렉션에서 객체의 포함 여부 확인
    • Map에서 키의 동등성 비교

2. hashCode() 메서드:

  • 역할: 객체의 해시 코드(hash code) 를 반환한다. 해시 코드는 객체를 고유하게 식별하는 정수 값이다.
  • 기본 구현: Object 클래스에 정의된 hashCode() 메서드는 객체의 메모리 주소를 기반으로 해시 코드를 생성한다.
  • 재정의(Overriding): equals() 메서드를 재정의한 경우, hashCode() 메서드도 반드시 재정의해야 한다.
    즉, 기존의 equlas()에서 객체의 주소를 기준으로 동등한지 비교했고 , hashCode() 에서도 객체의 주소를 가지고 해시값을 만들었으니 , equlas()의 기준이 필드값이 같은지로 바뀌었을때 hashCode()에서도 필드값을 통해 해시값을 리턴해야한다
  • 사용:
    • 해시 테이블(Hash Table) 과 같은 해시 기반 자료구조(e.g., HashMap, HashSet)에서 객체를 저장하고 검색하는 데 사용됨.

equals()와 hashCode()의 관계 (일반 규약):

  • equals()가 true를 반환하는 두 객체는 hashCode()도 같은 값을 반환해야 한다.
    • 즉, 논리적으로 동등한 객체는 동일한 해시 코드를 가져야 한다.
  • hashCode()가 같은 값을 반환하더라도, equals()는 false를 반환할 수 있다.
    • 즉, 해시 코드가 같다고 해서 두 객체가 반드시 논리적으로 동등한 것은 아닙니다(해시 충돌).
      (해시의 특성상 희박한 확률로 다른 객체가 같은 해시값을 가질 수 있다.)

equals()와 hashCode() 재정의 시 주의사항:

  • 일관성(Consistent): 객체의 상태가 변경되지 않았다면, equals()와 hashCode()는 항상 같은 결과를 반환해야 한다.
  • 대칭성(Symmetric): a.equals(b)가 true이면, b.equals(a)도 true여야 한다.
  • 추이성(Transitive): a.equals(b)가 true이고 b.equals(c)가 true이면, a.equals(c)도 true여야 한다.
  • 반사성(Reflexive): a.equals(a)는 항상 true여야 한다.
  • null 처리: a.equals(null)은 항상 false여야 한다.
  • hashCode() 재정의: equals()를 재정의하면 반드시 hashCode()도 재정의해야 한다.
  • 성능: hashCode()는 가능한 한 빠르고 균등하게 해시 코드를 분배하도록 구현해야 한다.

equals()와 hashCode() 재정의 예시:

Java
 
public class Person {
    private String name;
    private int age;

    // ... (생성자, getter/setter 등) ...

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true;
        if (obj == null || getClass() != obj.getClass()) return false;
        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

 

 

저작자표시 비영리 변경금지 (새창열림)

'개발 > Java' 카테고리의 다른 글

예외  (0) 2025.03.27
java.time  (0) 2025.03.14
java.util.Date  (0) 2025.03.14
Enum 타입  (0) 2025.03.05
[Java] 자바 객체와 관련된 용어 정리  (0) 2025.01.24
'개발/Java' 카테고리의 다른 글
  • java.time
  • java.util.Date
  • Enum 타입
  • [Java] 자바 객체와 관련된 용어 정리
함수형 인간
함수형 인간
잘 까먹는 개발자의 두뇌 확장 장치
  • 함수형 인간
    개발 기록 노트
    함수형 인간
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 글 목록 (84)
      • 기타 (1)
      • 개발 (82)
        • Java (6)
        • Javascript (1)
        • Spring (20)
        • jQuery (0)
        • Git (0)
        • servlet (11)
        • JSP (6)
        • HTML (0)
        • CSS (10)
        • SQL (9)
        • JSTL (3)
        • Mybatis (4)
        • Design Patterns (0)
        • HTTP (2)
        • Devtools (0)
        • IntelliJ (5)
        • JDBC (1)
        • Lombok (3)
        • Logging (1)
      • 책 리뷰 (0)
  • hELLO· Designed By정상우.v4.10.3
함수형 인간
[Java] equals() 와 hashCode()
상단으로

티스토리툴바