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의 특징과 성능을 잘 이해하고 상황에 맞게 활용하는 것이 중요합니다.
테스트 시 의존성 주입(Dependency Injection)과 Mockito Spring 애플리케이션을 개발하다 보면, 테스트 코드에서 실제 빈(Bean)을 사용하지…
들어가며 스프링 기반 프로젝트에서 좋은 설계 구조와 테스트 전략은 소프트웨어 품질과 유지보수성에 직결됩니다. 최근 학습한…
들어가며 코드를 작성할 때 종종 "이 로직을 어떻게 단순하고 읽기 쉽게 표현할 수 있을까?" 고민하게…
HTTP 상태코드란 무엇인가? HTTP 상태코드(HTTP Status Code)는 서버가 클라이언트의 요청을 처리한 결과를 수치화된 코드로 나타내는…
HTTP란 무엇인가? HTTP(Hypertext Transfer Protocol)는 웹에서 데이터를 주고받기 위해 사용하는 응용 계층 프로토콜입니다. 우리가 브라우저에서…