equals()와 hashcode()

2025. 4. 8. 18:08·CS 스터디/CS - JAVA

equals()메서드와 hashcode()메서드는  Java의 모든 객체가 기본적으로 상속받는 Object 클래스에 정의된 메서드로, 해시 기반 컬렉션에서 객체의 동등성 판단과 해시 값 계산을 통해 정확한 저장 및 검색을 수행하는 데 필요한 필수 메커니즘입니다. equals()와 hashcode()의 기본구현을 알아보고, 해시 기반 컬렉션에서 두 메서드를 사용하기 위한 규약에 대해 알아보겠습니다.

 

equals()메서드의 기본 구현


equals()는 객체의 동등성을 비교하는 메서드로 두 객체의 참조가 같은지 아닌지를 판단합니다.

// equals()의 기본구현은 객체의 주소값이 동일한지를 비교
public boolean equals(Object obj) {
    return (this == obj);
}

 

hashcode()메서드의 기본구현


hashcode()는 객체의 해시 코드(hash code)를 반환하는 메서드로, 객체를 식별할 수 있는 정수 값을 제공합니다.

// hashCode()의 기본구현은 객체의 메모리 주소 기반 해시값 반환
public int hashCode() {
    return System.identityHashCode(this);
}

 

해시 기반 컬렉션의 동작 원리


해시 기반 컬렉션은 데이터를 빠르게 저장하고 검색하기 위해 내부적으로 해시 함수를 사용합니다. 이때 핵심 역할을 하는 메서드가 바로 equals()와 hashCode()입니다.

HashMap, HashSet, Hashtable, LinkedHashMap, ConcurrentHashMap, Dictionary 등이 해시 기반 컬렉션입니다.

 

동작 원리

  1. 객체를 저장할 때 hashCode()를 호출하여 해시 값을 계산하고, 이 값을 바탕으로 저장 위치(버킷)를 결정합니다.
  2. 동일한 해시 값을 갖는 객체가 여러 개 존재할 수 있으므로, 실제로 값이 같은지를 판단하기 위해 equals()를 사용하여 객체를 비교합니다.

오버라이딩이 필요한 이유

기본적으로 Object 클래스의 equals()는 객체의 주소값(참조값) 을 기준으로 비교하고, hashCode() 또한 객체의 주소를 기반으로 해시 값을 생성합니다. 즉, 두 객체가 내부적으로 같은 데이터를 가지고 있어도 다른 객체로 간주될 수 있습니다.

 

쉽게 말해, 같은 데이터를 두 번 넣었을 때, 중복성검사가 정상적으로 이루어질 수 없다는 것입니다.

 

따라서 id나 이름과 같은 논리적인 값 기준으로 동등성을 정의하려면 equals()와 hashCode()를 오버라이딩해주어야 합니다.

 

결론적으로, 해시 기반 컬렉션을 제대로 사용하려면 equals()와 hashCode()를 규약에 따라 오버라이딩해줘야 정확한 저장과 조회가 가능합니다.

더보기
💡해시 함수
해시 함수는 객체의 속성을 기반으로 고유한 해시 코드를 생성합니다.
생성된 해시 코드를 이용해 데이터가 저장될 위치(버킷)를 결정합니다.

이제 해시 기반 컬렉션에서 equals()와 hashCode() 메서드를 구현할 때 지켜야 할 규약과 오버라이딩 구현 예시에 대해 알아보겠습니다.

 

equals()오버라이딩 시 지켜야 할 규약


1. 반사성

객체 자신과 비교할 때는 항상 true를 반환해야 함

 

2. 대칭성

두 객체를 서로 비교할 때, 비교 결과는 반대 순서에서도 동일해야 함

 

3. 추이성

A와 B가 같고, B와 C가 같다면, A와 C도 같아야 함

 

4. 일관성

같은 객체에 대해 여러 번 equals()를 호출해도 결과가 바뀌지 않아야 함

 

5. null과의 비교 

어떤 객체가 null과 비교될 때는 항상 false를 반환

 

hashcode() 오버라이딩 시 지켜야 할 규약


1. 일관성

객체 상태가 변하지 않는 한 동일한 객체에 대해 여러 번 호출해도 항상 같은 해시 값을 반환해야 함

 

2. equals()와의 연계성⭐️

  • 두 객체가 equals()에 의해 같다고 판단된다면, 이 두 객체의 hashCode() 값은 반드시 같아야함
  • 반대로, 두 객체가 다르다고 해서 반드시 다른 해시 값을 가져야 하는 것은 아니지만, 서로 다른 해시 값을 가지는 것이 성능상 유리
  • hascode()의 값이 다른 두 객체의 equals()값은 같을 수 없음

3. 다른 객체에 대한 충돌 최소화

서로 다른 객체는 가능한 한 다른 해시 값을 반환해야 함(해시 충돌 방지)

 

equals() & hashcode()  오버라이딩 구현 예제


// id와 username을 내용 기반으로 해시 컬렉션에서 다루기위한 오버라이딩 예제
import java.util.Objects;

public class Member {
    private int id;
    private String username;

    public Member(int id, String username) {
        this.id = id;
        this.username = username;
    }

    // equals() 오버라이딩
    @Override
    public boolean equals(Object o) {
        // 1. 자기 자신과 비교하는 경우는 항상 true (성능 최적화)
        if (this == o) return true;

        // 2. null이거나, 클래스 타입이 다르면 false
        if (!(o instanceof Member)) return false;

        // 3. 형변환을 통해 비교할 대상(Member 타입)으로 변환
        Member member = (Member) o;

        // 4. id가 같고 username이 같은 경우 true (논리적 동등성 정의)
        return id == member.id && Objects.equals(username, member.username);
    }

    // hashcode() 오버라이딩
    @Override
    public int hashCode() {
        // id와 username을 기반으로 해시코드 생성
        // -> equals에서 비교에 사용된 필드들을 기반으로 해시 값 생성 진행
        return Objects.hash(id, username);
    }
}

'CS 스터디 > CS - JAVA' 카테고리의 다른 글

Java의 원시 타입과 참조 타입  (0) 2025.04.20
객체 지향 설계 5대 원칙 (SOLID)  (0) 2025.04.14
Java의 예외처리  (0) 2025.04.07
final, finalize, finally의 차이와 활용  (0) 2025.04.01
String, StringBuilder, StringBuffer 특징 및 성능비교  (0) 2025.03.26
'CS 스터디/CS - JAVA' 카테고리의 다른 글
  • Java의 원시 타입과 참조 타입
  • 객체 지향 설계 5대 원칙 (SOLID)
  • Java의 예외처리
  • final, finalize, finally의 차이와 활용
BIS's tech Blog
BIS's tech Blog
Welcome to Kanghyun's tech blog :)
  • BIS's tech Blog
    벼익숙의 기술 블로그
    BIS's tech Blog
  • 전체
    오늘
    어제
    • 분류 전체보기 (68)
      • 알고리즘 (54)
        • 백준 (45)
        • 프로그래머스 (9)
      • CS 스터디 (14)
        • CS - JAVA (11)
        • CS - DB (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    Top-Down
    java
    프로그래머스
    동적 계획
    재귀
    너비 우선 탐색
    깊이 우선 탐색
    완전탐색
    Baekjoon
    브루트포스
    백트래킹
    dp
    백준
    BFS
    CS
    Lv2
    기술질문
    DFS
    알고리즘 고득점 kit
    자료구조
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
BIS's tech Blog
equals()와 hashcode()
상단으로

티스토리툴바