💻 프로그래밍 언어/Java

[Java] equals()와 hashCode()

케로⸝⸝◜࿀◝ ⸝⸝ 2024. 6. 5. 11:59

개요

  • Java에서 equals()hashCode() 메서드는 객체의 비교해시 기반 컬렉션을 다룰 때 중요한 역할을 한다.
  • 이 두 메서드는 Object 클래스에 정의되어 있으며, 이를 적절히 재정의함으로써 객체의 동등성을 정의할 수 있다.

 

equals() 메서드

  • equals() 메서드는 두 객체가 "논리적으로 동등한지"를 비교한다.
  • 기본적으로 Object 클래스의 equals() 메서드는 다음과 같이 구현되어 있다.
public boolean equals(Object obj) {
    return (this == obj);
}
  • 이는 기본적으로 두 객체의 레퍼런스를 비교한다. 만약 객체의 내용을 비교하고 싶다면 equals() 메서드를 재정의해야한다.

 

hashCode() 메서드

  • hashCode() 메서드는 객체의 해시 코드를 반환한다.
  • 해시 코드는 객체를 식별하는 정수 값으로, 해시 기반 컬렉션(ex. HashMap, HashSet)에서 객체를 빠르게 찾기 위해 사용된다.
  • 기본적으로 Object 클래스의 hashCode() 메서드는 객체의 메모리 주소를 기반으로 해시 코드를 생성한다.

 

왜 사용해?

  1. 컬렉션 프레임워크
    • HashMap, HashSet과 같은 해시 기반 컬렉션에서 객체를 저장하고 검색할 때, equals()와 hashCode()를 사용
    • 이 두 메서드를 올바르게 재정의하지 않으면, 컬렉션에서 객체를 제대로 찾지 못할 수 있다.
  2. 객체 동등성
    • 두 객체가 동등한지 여부를 논리적으로 비교할 때 사용
    • 데이터 클래스나, 엔티티 클래스에서 중요

 

equals()와 hashCode()의 재정의 규칙

  • 두 객체가 같다면(equals()가 true로 반환), 두 객체의 해시 코드도 같아야 한다.
  • 두 객체의 해시 코드가 같더라도, 두 객체가 반드시 같을 필요는 없다. (충돌이 발생할 수 있다.)

 

예제

import java.util.Objects;

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

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}
import java.util.HashSet;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("Alice", 30);
        Person p2 = new Person("Bob", 25);
        Person p3 = new Person("Alice", 30);

        Set<Person> people = new HashSet<>();
        people.add(p1);
        people.add(p2);

        System.out.println(people.contains(p3)); // true 출력
    }
}
  • people.contains(p3)이 true를 출력하는 이유는, p1과 p3이 논리적으로 동등하기 때문!
  • equals() hashCode()를 재정의 하지 않았다면, contains()는 false를 반환했을 것이다.

 

반응형