자바에서 Set은 중복을 허용하지 않는 데이터 집합을 의미합니다. List와 달리 동일한 요소를 여러 번 포함할 수 없으며, 순서와 관계없이 각 요소가 유일함을 보장합니다. 이러한 특징 덕분에 Set은 중복 데이터가 없어야 할 때 매우 유용합니다. 자바 컬렉션 프레임워크에는 대표적으로 HashSet, TreeSet, LinkedHashSet이 있으며, 각각 고유한 장단점을 갖고 있습니다. 이번 글에서는 이 세 가지 Set 구현체의 차이점, 성능, 내부 동작 원리 등을 자세히 다뤄보겠습니다.
Set 인터페이스는 자바 컬렉션 프레임워크의 중요한 구성 요소로, 중복을 허용하지 않는 집합을 표현합니다. 이는 수학적인 집합과 유사한 개념으로, 각 요소는 고유해야 합니다. Set 인터페이스를 구현하는 클래스들은 다음과 같은 공통적인 특징을 갖습니다.
모든 Set 구현체들은 공통적인 주요 메서드들을 제공합니다.
HashSet은 Set 인터페이스의 가장 일반적인 구현체로, 해시 테이블을 사용하여 요소를 저장합니다. 주요 특징은 다음과 같습니다.
import java.util.HashSet;
import java.util.Set;
public class HashSetExample {
public static void main(String[] args) {
Set<String> hashSet = new HashSet<>();
hashSet.add("Apple");
hashSet.add("Banana");
hashSet.add("Orange");
hashSet.add("Apple"); // 중복이므로 추가되지 않음
for (String fruit : hashSet) {
System.out.println(fruit);
}
}
}
Java위 코드에서 “Apple”은 두 번 추가되었지만 중복이므로 한 번만 저장됩니다.
TreeSet은 이진 검색 트리인 TreeMap을 기반으로 구현된 Set으로, 요소들이 자동으로 정렬됩니다. 주요 특징은 다음과 같습니다.
import java.util.Set;
import java.util.TreeSet;
public class TreeSetExample {
public static void main(String[] args) {
Set<Integer> treeSet = new TreeSet<>();
treeSet.add(20);
treeSet.add(5);
treeSet.add(15);
treeSet.add(10);
for (Integer number : treeSet) {
System.out.println(number);
}
}
}
Java위 예제에서 TreeSet은 요소들을 자동으로 오름차순 정렬하여 출력합니다: 5, 10, 15, 20.
LinkedHashSet은 요소들이 추가된 순서를 유지하는 Set 구현체로, 내부적으로 해시 테이블과 이중 연결 리스트를 사용합니다. 주요 특징은 다음과 같습니다.
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSetExample {
public static void main(String[] args) {
Set<String> linkedHashSet = new LinkedHashSet<>();
linkedHashSet.add("Banana");
linkedHashSet.add("Apple");
linkedHashSet.add("Grape");
linkedHashSet.add("Banana"); // 중복이므로 추가되지 않음
for (String fruit : linkedHashSet) {
System.out.println(fruit);
}
}
}
Java위 예제에서 요소들은 삽입된 순서대로 출력됩니다: “Banana”, “Apple”, “Grape”.
특징 | HashSet | TreeSet | LinkedHashSet |
---|---|---|---|
순서 유지 | 유지하지 않음 | 정렬된 순서 유지 | 삽입 순서 유지 |
시간 복잡도 (삽입/검색) | O(1) | O(log n) | O(1) |
정렬 여부 | 없음 | 자동 정렬 | 없음 |
null 값 허용 여부 | 가능 (1개) | 불가 | 가능 (1개) |
메모리 사용 | 적음 | 중간 | 많음 |
Set 인터페이스의 구현체들인 HashSet, TreeSet, LinkedHashSet은 각각의 사용 목적과 상황에 따라 선택됩니다. 요소의 순서가 중요하지 않고 빠른 검색이 필요하다면 HashSet이 적합하고, 자동 정렬과 범위 검색이 필요한 경우 TreeSet, 삽입된 순서를 유지하면서 중복 제거가 필요하다면 LinkedHashSet을 사용하면 됩니다. 각 Set의 특징과 성능을 잘 이해하고 상황에 맞게 활용하는 것이 중요합니다.
컴포넌트 스캔이란? 컴포넌트 스캔(Component Scan)은 스프링 프레임워크가 특정 패키지를 탐색하면서, 스캔 대상에 해당하는 클래스를 찾아…
스프링 빈이란? 스프링 빈(Spring Bean)은 스프링 IoC(Inversion of Control) 컨테이너가 관리하는 자바 객체를 의미합니다. 간단히…
스프링 컨테이너(Spring Container)란? 스프링 컨테이너는 스프링 프레임워크에서 가장 핵심적인 부분으로, IoC(Inversion of Control) 개념을 기반으로…
Queue란 무엇인가? Java에서 Queue는 데이터 구조의 일종으로, 데이터를 선입선출(FIFO, First-In-First-Out) 방식으로 처리합니다. 이 글에서는 Queue의…
Stack이란 무엇인가? Java에서 Stack은 자료구조의 한 종류로, 데이터를 순서대로 쌓아 올리는 형태로 운영됩니다. 컴퓨터 과학에서…
소개 자바에서 Map 인터페이스는 키(Key)와 값(Value)의 쌍을 저장하는 자료구조입니다. 이는 연관 배열이라고도 불리며, 각 키는…