반응형
HashSet은 중복된 객체를 저장하지 않지만,
사용자 정의 클래스를 저장할 때는 equals()와 hashCode()를 제대로 재정의하지 않으면
내용이 같더라도 서로 다른 객체로 인식되어 중복 저장될 수 있습니다.
이번 예제에서는 Member 클래스를 통해 중복 판단 기준을 명확히 정의해봅니다.
📦 Member.java
package ch15.sec03;
public class Member {
public String name;
public int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
public int hashCode() {
return name.hashCode() + age;
}
public boolean equals(Object obj) {
if (obj instanceof Member target)
return target.name.equals(name) && (target.age == age);
else
return false;
}
}
📌 예제 코드
package ch15.sec03;
import java.util.HashSet;
import java.util.Set;
public class HashSetExample {
public static void main(String[] args) {
Set<Member> set = new HashSet<Member>();
set.add(new Member("홍길동", 30));
set.add(new Member("홍길동", 30)); // 같은 내용의 객체
System.out.println("총 객체의 수 : " + set.size());
}
}
💻 실행 결과
총 객체의 수 : 1
💬 코드 설명
- Member 클래스는 이름과 나이를 필드로 갖는 사용자 정의 객체입니다.
- 두 객체 모두 "홍길동"이라는 이름과 30이라는 나이를 갖고 있으므로, 논리적으로는 같은 객체입니다.
- hashCode()는 이름의 해시값과 나이의 합으로 계산되며,
equals()는 이름과 나이가 모두 같을 때만 true를 반환하도록 재정의되어 있습니다. - 이 덕분에 HashSet이 두 객체를 동일하다고 판단하여 중복 저장을 하지 않게 됩니다.
💡 포인트 정리
- 사용자 정의 클래스를 HashSet, HashMap 등에서 사용할 경우
반드시 equals()와 hashCode()를 재정의해야 논리적 중복 판단이 가능합니다. - equals()는 내용 비교, hashCode()는 동등 객체의 동일 해시값 보장을 위한 역할을 합니다.
- 두 메서드는 항상 함께 재정의해야 Set이나 Map에서 제대로 작동합니다.
📌정리하자면, 자바에서 HashSet은 객체의 중복 여부를 판단할 때 내부적으로 equals()와 hashCode()를 활용합니다.
사용자 정의 클래스를 저장하려면 이 두 메서드를 정확하게 재정의해야만
내용이 같은 객체를 하나로 간주하고 중복 없이 저장할 수 있습니다.
이번 예제를 통해 그 중요성을 직접 확인할 수 있었습니다.
'Java > 자바 정리' 카테고리의 다른 글
144. 멀티스레드 환경에서도 안전한 Map – Hashtable 사용법 (0) | 2025.05.20 |
---|---|
143. 키-값 쌍을 저장하는 HashMap – 중복 처리와 순회 방법 (0) | 2025.05.20 |
142. HashSet에서 요소를 안전하게 제거하는 방법 – Iterator 활용 (0) | 2025.05.20 |
140. 중복을 허용하지 않는 Set – HashSet의 특징 (0) | 2025.05.20 |
139. ArrayList vs LinkedList 성능 비교 (0) | 2025.05.20 |
138. Vector로 멀티스레드 환경에서도 안전하게 저장하기 (1) | 2025.05.20 |