java
자바에서 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의 특징과 성능을 잘 이해하고 상황에 맞게 활용하는 것이 중요합니다.
들어가며 소프트웨어가 처리해야 하는 데이터 양이 늘어날수록, 단순히 기능 구현만으로는 성능과 효율을 보장하기 어렵습니다. 특히…
들어가며 소프트웨어를 구현할 때 성능 최적화나 안정성을 높이려면, 단순히 고수준 코드만 신경 쓰는 것을 넘어…
들어가며 소프트웨어가 복잡해질수록, 단순히 알고리즘의 시간복잡도만으로는 모든 문제를 해결할 수 없습니다. 특히 운영체제 수준에서는 다중…
들어가며 복잡한 소프트웨어가 원활히 동작하려면 단순히 코드만 잘 짜는 것으로는 부족합니다. 트랜잭션 처리나 대규모 데이터…
들어가며 소프트웨어를 개발할 때 메모리 관리 방식은 프로그램의 안정성과 성능을 좌우하는 핵심 요소입니다. 특히 자바스크립트,…
들어가며 소프트웨어 개발자는 코드가 어떻게 실행되는지 정확히 이해해야 할 필요가 있습니다. 우리가 작성한 프로그램은 결국…