Java/자바 정리

141. 사용자 정의 객체의 중복 비교 – hashCode()와 equals() 재정의

코딩하는냥이 2025. 5. 20. 12:34
반응형

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()를 활용합니다.
사용자 정의 클래스를 저장하려면 이 두 메서드를 정확하게 재정의해야만
내용이 같은 객체를 하나로 간주하고 중복 없이 저장할 수 있습니다.
이번 예제를 통해 그 중요성을 직접 확인할 수 있었습니다.