[ 목차 ]
컬렉션 프레임워크란?
컬렉션(Collection)이란?
- 정의: 컬렉션은 객체의 그룹(데이터 그룹)을 나타낸다. 즉, 데이터를 모아 관리하는 컨테이너 역할을 한다.
- 예: 학생 목록, 상품 카탈로그, 사용자 데이터 등.
- 특징:
- 데이터를 저장, 검색, 삭제, 수정하는 데 사용.
- 다양한 데이터 구조를 지원하여 유연한 데이터 관리 가능.
프레임워크(Framework)란?
- 정의: 소프트웨어 개발을 위한 표준화된 구조와 도구의 집합.
- 특징:
- 코드 재사용성과 개발 생산성을 높임.
- 일정한 설계 원칙과 가이드라인을 제공하여 유지보수가 쉬움.
컬렉션 프레임워크란?
- 정의: 컬렉션을 효과적으로 관리하기 위한 데이터 구조와 알고리즘의 표준화된 집합.
- 목적:
- 데이터 그룹 관리(삽입, 삭제, 탐색 등)를 간단하고 일관된 방식으로 처리.
- 다양한 데이터 구조 및 알고리즘을 제공하여 효율적 데이터 관리.
- 특징:
- 표준화된 인터페이스 제공.
- 다양한 데이터 구조 및 알고리즘 구현체 포함.
- 제네릭(Generic) 지원으로 타입 안정성과 재사용성 보장.
컬렉션 프레임워크의 구성요소
컬렉션 프레임워크는 크게 인터페이스, 구현 클래스, 알고리즘으로 구성된다.
1. 인터페이스 (Interfaces)
컬렉션 프레임워크의 핵심 인터페이스는 다음과 같다:
- Iterable : 컬렉션을 순회(iterate)하는 기능 제공, for-each 루프를 지원.
- Collection : 모든 컬렉션의 공통 기능 정의.
- List : 순서를 유지하며, 인덱스를 통해 접근 가능.
- Set : 중복을 허용하지 않음.
- Queue : FIFO(First-In-First-Out) 방식으로 데이터 관리.
- Map : 키-값 쌍 데이터를 관리. 컬렉션 인터페이스와는 별도로 설계됨.
- SortedSet & SortedMap : 정렬된 데이터를 관리.
- NavigableSet & NavigableMap : 정렬된 데이터에 탐색 기능 추가.
2. 구현 클래스 (Classes)
- List 구현체:
- ArrayList: 배열 기반, 인덱스 접근에 유리.
- LinkedList: 노드 기반, 삽입/삭제에 유리.
- Vector: 동기화된 ArrayList.
- Stack: LIFO(Last In First Out) 방식으로 동작.
- Set 구현체:
- HashSet: 해시 기반, 중복 제거.
- TreeSet: 정렬된 순서로 관리.
- LinkedHashSet: 삽입 순서를 유지.
- Map 구현체:
- HashMap: 키-값 쌍 관리, 빠른 검색.
- TreeMap: 키 순서대로 정렬.
- LinkedHashMap: 삽입 순서를 유지.
- Hashtable: 동기화된 HashMap.
- Queue 구현체:
- PriorityQueue: 우선순위 기반 데이터 관리.
- LinkedList: 큐와 리스트 모두로 활용 가능.
- ArrayDeque: 스택 및 큐로 활용 가능한 덱(Deque) 구현체.
- Concurrent 컬렉션 클래스:
- 멀티스레드 환경에서 동시성을 보장하며 기본 컬렉션 클래스의 확장된 형태.
- ConcurrentHashMap: 특정 버킷 단위로 락을 걸어 동시성을 보장.
- CopyOnWriteArrayList: 쓰기 작업 시 기존 데이터를 복사하여 동시성 문제 해결.
- BlockingQueue: 멀티스레드 환경에서 생산자-소비자 패턴 구현에 유용.
3. 알고리즘 (Algorithms)
컬렉션 프레임워크는 데이터 조작을 위한 다양한 알고리즘을 제공한다:
- 정렬(Sorting): Collections.sort()를 사용하여 컬렉션 정렬.
- 검색(Search): Collections.binarySearch()로 이진 검색 수행.
- 셔플(Shuffle): Collections.shuffle()로 컬렉션 요소를 무작위로 섞기.
- 최소값/최대값: Collections.min() 및 Collections.max()를 통해 최소/최대 요소 찾기.
- 반복자 동작: Collections.unmodifiableCollection()을 사용하여 읽기 전용 컬렉션 생성.
인터페이스별 특징과 주요 메서드
1. Iterable
- 특징:
- 컬렉션을 순회(iterate)하는 기능 제공.
- for-each 루프에서 사용 가능.
- 주요 메서드:
- iterator(): 컬렉션의 반복자 반환.
2. Collection
- 특징:
- 모든 컬렉션의 공통 기능 정의.
- 주요 메서드:
- add(E e): 요소 추가.
- remove(Object o): 요소 삭제.
- size(): 컬렉션 크기 반환.
- contains(Object o): 특정 요소 포함 여부 확인.
3. List
- 특징:
- 순서가 있는 데이터 관리.
- 인덱스 기반 접근 가능.
- 주요 메서드:
- get(int index): 특정 위치의 요소 반환.
- set(int index, E element): 특정 위치의 요소 수정.
- indexOf(Object o): 특정 요소의 첫 번째 인덱스 반환.
4. Set
- 특징:
- 중복을 허용하지 않는 데이터 관리.
- 주요 메서드:
- add(E e): 요소 추가.
- remove(Object o): 요소 삭제.
5. Queue
- 특징:
- FIFO(First-In-First-Out) 방식으로 데이터 관리.
- 주요 메서드:
- offer(E e): 요소 추가.
- poll(): 첫 번째 요소 반환 및 삭제.
- peek(): 첫 번째 요소 반환.
6. Map
- 특징:
- 키-값 쌍으로 데이터를 관리하며, 효율적인 검색과 업데이트를 제공.
- 컬렉션 인터페이스를 상속받지 않음. 이는 Map이 단순한 데이터 그룹이 아닌, 키-값 관계를 중심으로 동작하기 때문.
- 주요 메서드:
- put(K key, V value): 키-값 추가.
- get(Object key): 특정 키에 대한 값 반환.
- remove(Object key): 키-값 삭제.
- 왜 Map은 컬렉션 인터페이스를 상속받지 않는가?
- Map은 키-값 쌍 데이터를 관리하는 구조로, Collection과는 다른 데이터 관리 체제을 가진다.
- Map의 데이터는 키를 기준으로 고유하며, 이는 단순히 요소를 추가하고 제거하는 Collection 인터페이스와는 다른 설계 철학을 반영한다.
7. SortedSet
- 특징:
- 요소를 정렬된 상태로 유지.
- 주요 메서드:
- first(): 가장 작은 요소 반환.
- last(): 가장 큰 요소 반환.
- subSet(E fromElement, E toElement): 특정 범위의 요소 반환.
8. SortedMap
- 특징:
- 키를 정렬된 상태로 유지.
- 주요 메서드:
- firstKey(): 가장 작은 키 반환.
- lastKey(): 가장 큰 키 반환.
- headMap(K toKey): 특정 키보다 작은 범위의 데이터 반환.
9. NavigableSet
- 특징:
- 정렬된 데이터에 탐색 기능 추가.
- 주요 메서드:
- lower(E e): 특정 요소보다 작은 값 반환.
- higher(E e): 특정 요소보다 큰 값 반환.
- ceiling(E e): 주어진 값 이상인 최소값 반환.
10. NavigableMap
- 특징:
- 키에 대한 탐색 기능 추가.
- 주요 메서드:
- lowerEntry(K key): 특정 키보다 작은 키-값 쌍 반환.
- higherEntry(K key): 특정 키보다 큰 키-값 쌍 반환.
- ceilingEntry(K key): 주어진 키 이상인 최소 키-값 쌍 반환.
Concurrent 컬렉션 클래스
- 특징:
- 멀티스레드 환경에서 동시성을 보장하도록 설계된 컬렉션 클래스이다.
- synchronized 키워드로 락을 거는 기존 동기화 컬렉션보다 더 나은 성능 제공한다.
- 데이터 무결성을 유지하며, 높은 동시성 처리 성능을 제공한다.
- Concurrent 컬렉션의 종류:
- ConcurrentHashMap: 키-값 데이터에 대해 동시성을 보장하며, 특정 버킷에만 락을 걸어 성능 저하를 최소화.
- CopyOnWriteArrayList: 쓰기 작업 시 기존 데이터를 복사하여 동시성 문제를 방지.
- BlockingQueue: 생산자-소비자 패턴에 유용하며, 쓰레드가 안전하게 대기하거나 데이터 접근 가능.
- ConcurrentSkipListMap: 정렬된 데이터와 동시성 제어가 필요한 경우 사용.
- 성능 비교: Synchronized 컬렉션 vs Concurrent 컬렉션:
- Synchronized 컬렉션:
- Collections.synchronizedMap, Collections.synchronizedList 등을 통해 동기화를 제공.
- 단일 락을 사용하여 모든 쓰레드 접근을 순차적으로 처리하므로 성능이 낮음.
- Concurrent 컬렉션:
- 락의 범위를 세분화하거나 락 없이 동시성을 보장하는 방식(MVCC 등)을 사용.
- 멀티스레드 환경에서 높은 처리량 제공.
- Synchronized 컬렉션:
- 안정성 확보 방법:
- Concurrent 컬렉션은 동시성을 보장하지만, 데이터의 논리적 무결성을 보장하려면 추가적인 관리가 필요할 수 있다.
- 예를 들어, computeIfAbsent 메서드를 사용하여 데이터 생성 로직을 원자적으로 처리.
- 사용 사례:
- ConcurrentHashMap: 대규모 키-값 데이터 관리.
- CopyOnWriteArrayList: 읽기 작업이 많은 환경에서 변경 작업이 드문 경우.
- BlockingQueue: 멀티스레드 기반의 작업 큐, 생산자-소비자 모델.
- 결론:
- Concurrent 컬렉션은 동기화 컬렉션보다 더 나은 성능을 제공하며, 멀티스레드 환경에서 안전하고 효율적인 데이터 처리를 지원한다.
- 적절한 동시성 전략을 선택하여 안정성과 성능의 균형을 맞추는 것이 중요하다.
컬렉션 프레임워크를 보완하는 정렬 인터페이스
1. Comparable
- 정의: 객체 간의 자연 정렬을 정의하는 인터페이스.
- 주요 메서드:
- compareTo(T o): 현재 객체와 비교 대상 객체를 비교.
- 특징:
- 컬렉션의 요소를 정렬하기 위해 기본적으로 사용됨.
- 단일 속성 기준으로 정렬.
- 사용 예시:

2. Comparator
- 정의: 사용자 정의 정렬을 지원하는 인터페이스.
- 주요 메서드:
- compare(T o1, T o2): 두 객체를 비교.
- 특징:
- 여러 속성 기준으로 유연한 정렬 가능.
- 사용 예시:
컬렉션 프레임워크의 장점
- 코드 간결화: 다양한 데이터 구조와 알고리즘 제공.
- 재사용성 증가: 표준화된 API로 다양한 작업 가능.
- 타입 안정성: 제네릭 지원으로 타입 안전성을 보장.
- 성능 최적화: 특정 작업에 적합한 자료구조 제공.
- 멀티스레드 환경 지원: Concurrent 컬렉션으로 동시성 문제 해결.
출처
🧱 Java Collections Framework 종류 💯 총정리
Java Collection Framework 자바 새내기분들은 컬렉션 프레임워크라는 단어에 뭔가 거창하고 어려운 느낌이 들수 있겠지만, 그냥 자료 구조(Data Structure) 종류의 형태들을 자바 클래스로 구현한 모음집
inpa.tistory.com
https://hudi.blog/java-collection-framework-1/
JAVA Collection Framework (1) - 컬렉션 프레임워크란?
본 포스팅에서는 컬렉션 프레임워크의 개요, 종류, 그리고 구현과 상속의 계층적 구조 등에 대해 개괄적으로 짚어본다. 1. Collection Framework 의 개요 컬렉션 프레임워크는 자바 프로그래밍에서 빠
hudi.blog
https://coding-factory.tistory.com/550
[Java] 자바 컬렉션 프레임워크(List, Set, Map) 총정리
컬렉션 프레임워크란? 배열을 사용하다 보면 여러가지 비효율적인 문제가 생깁니다. 가장 큰 문제점은 크기가 고정적이라는 것입니다. 배열의 크기는 생성할 때 결정되며 그 크기를 넘어가게
coding-factory.tistory.com
https://velog.io/@jummi10/Synchronized-Collection-vs-Concurrent-Collection
Synchronized Collection vs Concurrent Collection
스레드 안정성(Thread-safety) 보장성능(performance)확장성(scalability)스레드 안정성을 확보하는 방법(how they achieve thread-safety)한 번에 하나의 스레드만 객체에 접근하도록 허용한다.synchronized obje
velog.io
'JAVA' 카테고리의 다른 글
Garbage Collection (2) | 2025.01.17 |
---|---|
Enum이란? (1) | 2024.11.01 |
오버로딩 vs 오버라이딩 (7) | 2024.10.23 |
자바에서의 Error & Exception (0) | 2024.10.21 |
JDK/JRE/JVM 개념 (0) | 2024.10.14 |