Java/연습문제

자바 연습문제 - HashSet과 equals/hashCode 오버라이딩을 활용한 중복 방지

코딩하는냥이 2025. 5. 22. 11:23
반응형

📖 문제

HashSet에 Student 객체를 저장하려고 합니다.
학번이 같으면 동일한 Student라고 가정하고, 중복 저장이 되지 않도록 하고 싶습니다.
Student 객체의 해시코드는 학번이라고 가정하고, Student 클래스를 작성해보세요.


📦 예제 클래스

HashSetExample.java

import java.util.HashSet;
import java.util.Set;

public class HashSetExample {
	public static void main(String[] args) {
		Set<Student> set = new HashSet<Student>();
		
		set.add(new Student(1, "홍길동"));
		set.add(new Student(2, "신용권"));
		set.add(new Student(1, "조민우"));
		
		System.out.println("저장된 객체 수 : " + set.size());
		for(Student s : set)
			System.out.println(s.studentNum + " : " + s.name);
	}
}

Student.java

public class Student {
	public int studentNum;
	public String name;

	public Student(int studentNum, String name) {
		this.studentNum = studentNum;
		this.name = name;
	}

	// 여기서부터 작성할 것
}

📌 예제 정답 (Student.java)

public class Student {
	public int studentNum;
	public String name;

	public Student(int studentNum, String name) {
		this.studentNum = studentNum;
		this.name = name;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Student student)
			return student.studentNum == studentNum;
		return false;
	}

	@Override
	public int hashCode() {
		return studentNum;
	}
}

💻 실행 결과

저장된 객체 수 : 2
1 : 홍길동
2 : 신용권

💬 코드 설명

  • HashSet은 내부적으로 객체의 hashCode()와 equals() 메소드를 이용해 중복 여부를 판단합니다.
  • studentNum 값이 같으면 같은 학생으로 간주해야 하므로, equals() 메소드에서는 학번이 같은지를 비교합니다.
  • hashCode() 메소드에서는 학번을 해시값으로 반환하여 중복 처리가 일관되도록 구성합니다.
  • 따라서 학번이 같은 Student 객체는 하나만 저장되며, "조민우"는 "홍길동"과 동일한 학번으로 판단되어 저장되지 않습니다.

💡 학습 포인트

이 문제를 통해 출제자가 전달하고자 한 핵심 개념은 다음과 같습니다:

  1. HashSet의 중복 저장 원리 이해하기
    • HashSet은 동일한 객체를 식별할 때 equals()와 hashCode()를 함께 사용합니다.
  2. equals()와 hashCode()의 재정의 필요성
    • 사용자 정의 클래스에서는 의미 있는 비교 기준을 명시적으로 구현해야 합니다.
  3. 학번을 기준으로 동등성 정의하기
    • 이 문제는 학생 객체의 studentNum이 같으면 같은 객체로 판단해야 하는 실습입니다.
  4. instanceof + 패턴 매칭 활용하기 (Java 16+)
    • obj instanceof Student student 문법을 통해 형변환을 간결하게 처리할 수 있습니다.

📌 마무리 정리

  • 작성하신 코드는 문제에서 요구한 바를 정확하게 충족하며, 실행 결과도 기대와 일치합니다.
  • 이 문제는 HashSet의 동작 원리, 특히 사용자 정의 객체에서의 중복 판별 로직을 올바르게 설계하는 연습입니다.
  • 실무에서도 equals()와 hashCode() 재정의는 컬렉션을 사용할 때 필수적으로 고려해야 할 요소입니다.