반응형
📖 문제
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 객체는 하나만 저장되며, "조민우"는 "홍길동"과 동일한 학번으로 판단되어 저장되지 않습니다.
💡 학습 포인트
이 문제를 통해 출제자가 전달하고자 한 핵심 개념은 다음과 같습니다:
- HashSet의 중복 저장 원리 이해하기
- HashSet은 동일한 객체를 식별할 때 equals()와 hashCode()를 함께 사용합니다.
- equals()와 hashCode()의 재정의 필요성
- 사용자 정의 클래스에서는 의미 있는 비교 기준을 명시적으로 구현해야 합니다.
- 학번을 기준으로 동등성 정의하기
- 이 문제는 학생 객체의 studentNum이 같으면 같은 객체로 판단해야 하는 실습입니다.
- instanceof + 패턴 매칭 활용하기 (Java 16+)
- obj instanceof Student student 문법을 통해 형변환을 간결하게 처리할 수 있습니다.
📌 마무리 정리
- 작성하신 코드는 문제에서 요구한 바를 정확하게 충족하며, 실행 결과도 기대와 일치합니다.
- 이 문제는 HashSet의 동작 원리, 특히 사용자 정의 객체에서의 중복 판별 로직을 올바르게 설계하는 연습입니다.
- 실무에서도 equals()와 hashCode() 재정의는 컬렉션을 사용할 때 필수적으로 고려해야 할 요소입니다.
'Java > 연습문제' 카테고리의 다른 글
자바 연습문제 - 사용자 정의 함수형 인터페이스 Function 구현 (0) | 2025.05.22 |
---|---|
자바 연습문제 - 람다식을 이용한 Thread 실행 코드 작성 (1) | 2025.05.22 |
자바 연습문제 - Comparator를 이용한 TreeSet 정렬 기준 지정 (0) | 2025.05.22 |
자바 연습문제 - TreeSet과 Comparable을 이용한 자동 정렬 구현 (0) | 2025.05.22 |
자바 연습문제 - HashMap을 이용한 점수 평균 및 최고 점수 계산 (1) | 2025.05.22 |
자바 연습문제 - List 컬렉션을 이용한 게시글 데이터 반환 구현 (0) | 2025.05.22 |