java
[자바] equals overriding 과 hash code
하루이2222
2024. 8. 11. 19:04
자바에서 ==
, equals
, hashCode
의 차이와 역할
==
연산자의 동작
- 객체의 참조 주소를 비교한다.
- 두 객체가 같은 메모리 주소(참조)를 가리키는지 확인한다.
- 참조 변수는 스택 영역에 저장되고, 객체는 힙 영역에 저장된다.
- 따라서,
==
는 스택 영역에 있는 두 참조 변수를 비교하여, 같은 객체를 가리키고 있는지 판단한다.
Person person1 = new Person("John", 25);
Person person2 = new Person("John", 25);
System.out.println(person1 == person2); // false를 반환
- 위 예제에서
person1
과person2
는 각각 서로 다른 힙 영역에 객체를 가지고 있으므로,==
연산자는false
를 반환한다.
equals
메서드의 오버라이딩
equals
메서드를 오버라이딩하면, 객체의 실제 내용(멤버 변수 값들)을 비교할 수 있다.- 객체의 논리적 동등성을 판단하기 위해 오버라이딩을 해야 한다.
equals
메서드는 주로 두 객체가 같은 데이터를 가지고 있는지 비교하는 데 사용된다.
equals
메서드 오버라이딩 예시
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 obj) {
if (this == obj) return true; // 자기 자신과 비교하면 true
if (obj == null || getClass() != obj.getClass()) return false; // 타입이 다르거나 null이면 false
Person person = (Person) obj;
return age == person.age && name.equals(person.name); // 멤버 변수 값들이 같다면 true
}
@Override
public int hashCode() {
return Objects.hash(name, age); // hashCode도 같은 기준으로 생성
}
}
- 위 예시에서
equals
메서드는 두 객체의name
과age
가 같을 때true
를 반환하도록 구현되어 있다. - 이를 통해, 두 객체가 서로 다른 힙 영역에 있더라도 동일한 데이터를 가진다면
true
가 반환된다.
hashCode
메서드의 역할
hashCode
메서드는 객체를 고유한 정수 값으로 변환하는 역할을 한다.- 이 해시 코드는 해시 기반 자료구조(예:
HashMap
,HashSet
,HashTable
)에서 객체를 저장하거나 검색할 때 사용된다. - 효율적인 저장과 검색을 가능하게 하며, 객체의 해시 코드를 기반으로 해시 버킷이 결정된다.
hashCode
와 equals
의 관계
- 중요한 규칙: 두 객체가
equals
에 의해 같다고 판단되면, 그 객체들의hashCode
도 동일해야 한다. - 해시 기반 자료구조에서는 먼저
hashCode
를 사용해 객체를 특정 버킷에 할당한 후, 같은 해시 코드를 가진 객체들에 대해equals
로 실제 동등성을 확인한다. - 해시 충돌: 서로 다른 객체가 같은
hashCode
를 가질 수 있으며, 이 경우equals
메서드를 통해 실제로 동일한지 확인한다.
hashCode
오버라이딩 예시
@Override
public int hashCode() {
return Objects.hash(name, age); // name과 age를 기반으로 해시 코드 생성
}
핵심 요약
==
연산자는 스택 영역의 참조 주소를 비교한다.equals
메서드는 오버라이딩을 통해 힙 영역의 객체의 내용을 비교하도록 재정의할 수 있다.hashCode
메서드는 해시 기반 자료구조에서 객체를 저장하고 검색하는 데 사용되며,equals
와 일관되게 오버라이딩해야 한다.equals
와hashCode
메서드를 올바르게 구현하면, 객체의 논리적 동등성을 바탕으로 일관되게 동작하게 할 수 있다.- 즉 인스턴스 화 된 객체 는 힙 , 객체를 담고 있는 변수의 참조 주소 는 스택 , queals를 그냥 쓰면 스택에 존재하는 참조주소 만 비교, 따라서 객체 를 정확히 동일 한지 판단 하려면 equals overrriding 을 통해 객체의 값을 검증하는 과정이 필요.