💻 프로그래밍 언어/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() 메서드는 객체의 메모리 주소를 기반으로 해시 코드를 생성한다.
왜 사용해?
- 컬렉션 프레임워크
- HashMap, HashSet과 같은 해시 기반 컬렉션에서 객체를 저장하고 검색할 때, equals()와 hashCode()를 사용
- 이 두 메서드를 올바르게 재정의하지 않으면, 컬렉션에서 객체를 제대로 찾지 못할 수 있다.
- 객체 동등성
- 두 객체가 동등한지 여부를 논리적으로 비교할 때 사용
- 데이터 클래스나, 엔티티 클래스에서 중요
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를 반환했을 것이다.
반응형