Set 인터페이스는 중복 요소를 허용하지 않는 컬렉션 타입으로, 각 구현체는 데이터 저장 방식과 순서 보장 여부에서 차이를 보인다. 주요 구현체인 HashSet, LinkedHashSet, TreeSet의 특성과 사용 방법을 살펴보자.
HashSet은 해시 테이블을 기반으로 동작하며, 요소의 순서가 보장되지 않는다. 다음 코드 예시는 Integer 타입 요소를 HashSet에 추가한 결과를 보여준다.
import java.util.HashSet;
import java.util.Set;
public class UniqueNumberCollection {
public static void main(String[] args) {
Set<Integer> uniqueData = new HashSet<>();
uniqueData.add(12);
uniqueData.add(7);
uniqueData.add(19);
uniqueData.add(7); // 중복 처리
uniqueData.add(-5);
System.out.println(uniqueData);
}
}
출력 결과는 [7, -5, 12, 19] 또는 다른 순서일 수 있다.
LinkedHashSet은 삽입 순서를 유지하는 특성을 갖는다. 내부적으로 연결리스트를 사용하여 순서를 관리한다.
import java.util.LinkedHashSet;
import java.util.Set;
public class OrderedDataExample {
public static void main(String[] args) {
Set<Integer> sequentialSet = new LinkedHashSet<>();
sequentialSet.add(8);
sequentialSet.add(3);
sequentialSet.add(11);
sequentialSet.add(3); // 중복 처리
sequentialSet.add(6);
System.out.println(sequentialSet);
}
}
출력: [8, 3, 11, 6]
TreeSet은 요소를 정렬된 상태로 저장한다. 기본적으로 Comparable 인터페이스를 구현한 타입에 대해 오름차순으로 정렬되며, 사용자 정의 타입의 경우 Comparator를 제공해야 한다. 다음 예시는 Student 클래스의 평균 점수를 기준으로 정렬하는 방법을 보여준다.
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
class StudentRecord {
private String studentName;
private int studentAge;
private int[] examResults;
public StudentRecord(String name, int age, int[] scores) {
this.studentName = name;
this.studentAge = age;
this.examResults = scores;
}
public double calculateAverage() {
return (examResults[0] + examResults[1]) / 2.0;
}
@Override
public String toString() {
return "Student{name='" + studentName + "', age=" + studentAge + ", scores=" + java.util.Arrays.toString(examResults) + "}";
}
}
public class SortedStudentRecords {
public static void main(String[] args) {
Set<StudentRecord> studentSet = new TreeSet<>(Comparator.comparingDouble(StudentRecord::calculateAverage));
studentSet.add(new StudentRecord("서", 16, new int[]{85, 92}));
studentSet.add(new StudentRecord("유", 15, new int[]{78, 88}));
studentSet.add(new StudentRecord("강", 17, new int[]{65, 75}));
System.out.println(studentSet);
}
}
출력: [Student{name='강', age=17, scores=[65, 75]}, Student{name='유', age=15, scores=[78, 88]}, Student{name='서', age=16, scores=[85, 92]}]