
자바의 컬렉션 프레임워크에서 사용하는 다양한 자료구조를 쉽게 설명해 줄게요. 먼저 표를 해석하는 방법부터 알아보자.
컬렉션 프레임워크는 데이터를 저장하고 관리하는 자료구조 (데이터 구조)를 제공하는데, 주요 인터페이스로 Set, List, Deque, Map이 있다. 각각의 특징을 알아보자.
이제 표에 나온 자료구조들을 하나씩 설명해볼게.
✔️ HashSet (해시셋)
contains() 같은 검색 속도가 빠름✔️ TreeSet (트리셋)
✔️ LinkedHashSet (링크드해시셋)
✔️ ArrayList (배열 리스트)
get(index)로 빠르게 데이터 접근 가능 ✔️ LinkedList (연결 리스트)
get(index)로 특정 데이터 접근할 때는 속도가 느림 (처음부터 차례대로 찾아야 하기 때문)✔️ ArrayDeque (배열 데크)
addFirst(), addLast()로 앞뒤에서 빠르게 데이터 추가 가능 LinkedList보다 빠르고 메모리 사용량이 적음 ✔️ LinkedList (연결 리스트) → Deque 기능도 제공
LinkedList는 List뿐만 아니라 Deque 기능도 제공 addFirst(), removeLast() 등) get(index) 속도는 느림✔️ HashMap (해시맵)
✔️ TreeMap (트리맵)
✔️ LinkedHashMap (링크드해시맵)
HashMap보다 약간 메모리를 더 사용하지만 순서를 보장하는 장점이 있음| 자료구조 | 특징 | 언제 사용하면 좋을까? |
|---|---|---|
| HashSet | 순서 없음, 중복 없음, 검색 빠름 | 데이터 중복 제거할 때 |
| TreeSet | 자동 정렬, 검색 빠름 | 정렬된 상태로 저장하고 싶을 때 |
| LinkedHashSet | 입력 순서 유지 | 중복 없이 순서를 유지할 때 |
| ArrayList | 배열 기반, 빠른 검색 | 조회가 많고, 중간 삽입이 적을 때 |
| LinkedList | 연결 리스트 기반, 빠른 삽입/삭제 | 삽입/삭제가 많고, 순차 접근할 때 |
| ArrayDeque | 크기 조절 배열, 양방향 삽입/삭제 | 큐(Queue)처럼 사용할 때 |
| LinkedList (Deque) | 양방향 삽입/삭제 가능 | 덱(Deque) 기능이 필요할 때 |
| HashMap | 순서 없음, 검색 빠름 | 키-값 저장, 빠른 검색 필요할 때 |
| TreeMap | 키 자동 정렬 | 정렬된 데이터 유지할 때 |
| LinkedHashMap | 입력 순서 유지 | 키-값 저장, 순서를 유지할 때 |
1. HashSet 예제 (중복 제거)
import java.util.HashSet;
public class HashSetExample {
public static void main(String[] args) {
HashSet<Integer> set = new HashSet<>();
set.add(10);
set.add(20);
set.add(10); // 중복 데이터 추가
System.out.println(set); // 중복된 10은 한 번만 출력됨
}
}
2. ArrayList vs LinkedList 속도 비교
import java.util.ArrayList;
import java.util.LinkedList;
public class ListExample {
public static void main(String[] args) {
ArrayList<Integer> arrayList = new ArrayList<>();
LinkedList<Integer> linkedList = new LinkedList<>();
// ArrayList에 데이터 추가
for (int i = 0; i < 10000; i++) {
arrayList.add(i);
}
// LinkedList에 데이터 추가
for (int i = 0; i < 10000; i++) {
linkedList.add(i);
}
// ArrayList의 중간 삽입 속도 측정
long startTime = System.nanoTime();
arrayList.add(5000, 100);
long endTime = System.nanoTime();
System.out.println("ArrayList 중간 삽입 시간: " + (endTime - startTime) + " ns");
// LinkedList의 중간 삽입 속도 측정
startTime = System.nanoTime();
linkedList.add(5000, 100);
endTime = System.nanoTime();
System.out.println("LinkedList 중간 삽입 시간: " + (endTime - startTime) + " ns");
}
}
✔ 결과적으로 LinkedList가 중간 삽입이 더 빠름 (ArrayList는 배열을 이동시켜야 하기 때문)
HashMap, HashSet, ArrayListTreeSet, TreeMapLinkedHashSet, LinkedHashMapLinkedList이제 자료구조를 이해하고 코드에서 적절한 컬렉션을 사용할 수 있을 거야! 😃
참고문헌 : https://docs.oracle.com/javase/8/docs/technotes/guides/collections/overview.html