JCF, Jaca Collection Framework
자바는 데이터를 저장하는 자료구조와 활용하는 알고리즘을 구조화하여 사용자에게 제공한다. 자료구조가 정의된 인터페이스와 구현하는 클래스로 구분되어 있다. c언어에서 스택을 구현하기 위해서는 직접 push, pop, peek을 만들어야 한다. 하지만 자바를 이용하면 Stack 클래스의 객체를 선언해 push, pop, peek을 가져와 사용할 수 있다.
이렇게 제공되는 프레임워크를 JCF라고 한다.
컬렉션 프레임워크 사용의 장점
컬렉션 프레임워크는 인터페이스와 다형성을 이용한 객체 지향적 설계를 통해 표준화되어 있다. 자바에서 직접 제공하는 것이기 때문에 안정적으로 사용할 수 있으며 알고리즘을 고성능으로 구현할 수 있다.
- 재사용이 높고, 사용이 편리하다.
- 상위 인터페이스 타입으로 업캐스팅하기 때문에 상호 운용성이 좋다.
- 컬렉션을 조합하여 새로운 알고리즘을 생성할 수 있다.
- 이미 구현된 API를 사용하기 때문에 설계 시간이 감소된다.
- 제네릭을 사용한 타입 안정성 보장
용도에 따라 최적화된 인터페이스로 구성되어 있기 때문에 이를 상속하는 클래스끼리 서로서로 이용할 수 있으며, 연속적이거나 비연속적인 자료구조도 사용할 수 있다. 덕분에 효율적인 메모리 관리도 가능하다.
구조와 상속 관계

컬렉션 프레임워크를 구성하는 기본 구조는 위와 같다.
최상위 인터페이스 Iterrable이 있고, 그 아래로 Collection을 상속받는 List, Queue, Set이 있다.
Map이 Iterable에 포함되지 않는 것은 다른 자료구조와 달리 Map은 key, value형태의 해시테이블을 나타내기 때문이다.
Iterator는 모든 요소를 순회하기 때문에 key를 통해서 접근하는 Map은 Iterator로 접근하는 것은 소용이 없다.
key를 가져와 iterator에 넣어 그 값을 하나씩 순회하는 방법으로 접근할 수 있지만 이 방법은 Map을 통한 방법이 아니기 때문에 결국 Iterator를 Map에서 사용하기 위해서는 타입을 변경하는 방법밖에 없다.
Map이 Iterable을 상속하나? 기억이 나지 않으면 iterator의 특징과 map은 해시테이블을 나타낸다는 걸 기억하자.
1. Collection 인터페이스

Collection을 상속받는 List, Queue, Set 인터페이스와 구현하는 각 클래스를 나타낸다.
1) List
순서가 있는 데이터의 집합. 데이터의 중복을 허용한다.

ⅰ. ArrayList
단방향 포인터 구조. 각 데이터에 대한 인덱스를 통해 접근해 조회 성능이 뛰어나다.
하지만 데이터를 추가하고 삭제할 때는 데이터의 이동이 필요해 비효율적이다. 만약 순차적으로 접근한다면 좋은 성능을 보인다.
ⅱ. LinkedList
양방향 포인터 구조. 노드를 연결하고 다음 주소를 통해 접근하기 때문에 중간에서 접근해도 성능을 유지한다.
LinkedList는 List뿐만 아니라, Stack, Queue, Deque 등 다른 인터페이스를 구현할 때 주로 사용된다.
ⅲ. Vector
ArrayList의 구형 버전으로 같은 방식으로 동작한다. 한 번에 하나의 스레드만 벡터 메서드를 호출할 수 있는 동기화 형태로, 멀티 스레드 환경이 아닌 경우에는 ArrayList를 사용하는 것이 좋다.
ⅳ. Stack
후입선출 구조의 자료구조. 먼저 들어온 데이터는 제일 마지막에 나간다. 다른 클래스와 다르게 push, pop 메서드를 사용하며, Stack은 Vector를 상속하기 때문에 최근에는 잘 쓰이지 않는다. Stack대신 Deque나 ArrayDeque를 사용하는 방법이 있다.
- List 주요 메서드
- void add(int, index, Object element)
- index위치에 element를 추가한다. - Obejct remove(int index)
- index 위치의 객체를 삭제하고, 반환한다. - Obejct get(int index)
- index 위치의 객체를 반환한다. - void sort(Comparator c)
- 지정된 comparator로 정렬한다.
2) Queue
후입선출 구조로 되어 먼저 들어온 데이터가 먼저 빠져나간다.
이미지에는 나와있지 않지만 LinkedList를 통해 Queue를 구현하는 것이 대표적이다.

ⅰ. PriorityQueue
우선순위를 가지고 있는 큐. (우선순위 큐)
우선순위가 높은 순으로 정렬되고 꺼낼 수 있다. 필수적으로 Comparable인터페이스를 구현해야 하며, 힙 형태로 저장된다.
ⅱ. Deque <I>
Deque는 Double-Ended Queue를 의미하는 양쪽으로 데이터 삽입, 삭제가 가능하다.
스택으로도 사용할 수 있고, 큐로도 사용할 수 있는 형태
ⅲ. ArrayDeque
Deque | Queue | Stack |
offerLast() | offer() | push() |
pollLast() | pop() | |
pollFirst() | poll() | |
peekFirst() | peek() | |
peekLast() | peek() |
Deque 인터페이스를 구현하는 ArrayDeque는 앞, 뒤로 모두 데이터 이동이 이루어지기 때문에 First, Last가 붙는다.
- Queue 주요 메서드
- boolean add(Object o)
- Object 객체를 Queue에 추가. 저장 공간이 부족하면 IllegalStateException이 발생한다. - boolean offer(Obejct p)
- Object 객체를 Queue에 추가. - Object remove()
- Queue에서 객체를 삭제하고 반환한다.
비어있는 Queue에서 remove()를 하면 NoSuchElementException이 발생한다. - Object poll()
- Queue에서 객체를 삭제하고 반환한다. 비어있는 Queue면 null을 반환
3) Set
데이터 중복을 허용하지 않고, 순서를 유지하지 않는다. 중복이 허용되지 않는 특징을 살려 중복값을 비교할 때 주로 사용한다.

ⅰ. HashSet
해시 알고리즘을 사용한 가장 빠른 접근 속도를 가지고 있다. 순서가 보장되지 않아 순서를 예측할 수 없다.
ⅱ. LinkedHashSet
순서를 가지고 있는 HashSet을 구현하고 싶을 때 사용된다. → 순서를 보장하는 HashSet
ⅲ. TreeSet
이진 검색 트리 형태(BST - red-black tree)로 데이터를 저장하여 검색에 뛰어난 성능을 보인다. 저장 순서를 보장하지는 않지만 데이터를 정렬할 수 있다.
- Set 주요 메서드
- boolean add(E e)
- e 객체를 저장 후 성공하면 true, 실패하면 false 반환. 중복된 객체가 들어가면 실패 - boolean contains(Object o)
- o 객체가 저장되었는지 여부를 리턴
2. Map 인터페이스

key와 value 쌍으로 이루어진 데이터 집합으로 key를 통해 value에 접근하여 조회 최고 성능을 보인다. → O(1)
value는 중복이 가능하지만 key는 중복이 불가능하다. 해시테이블 구조로 저장순서가 유지되지 않는다.
1) HashMap
해시테이블을 보완한 컬렉션으로 추가, 삭제, 접근이 모두 뛰어나다. null을 저장할 수 있고, 비동기 형태로 작동한다.
2) LinkedHashMap
삽입 순서를 유지하는 HashMap 형태를 말한다. 각 Entry가 연결리스트로 구성되어 있다.
3) HashTable
자바 초기 버전에 나온 것으로 null이 허용되지 않는다. HashMap보다 느리지만 동기화가 지원된다.
현재는 HashTable대신 HashMap을 주로 사용한다.
4) TreeMap
Map이 이진 트리 구조로 이루어져 있다. SortedMap 인터페이스를 구현해 key값을 기준으로 정렬된다.
정렬된 형태이기 때문에 검색이 빠른대신 저장은 시간이 걸린다.
- Map 주요 메서드
- boolean containsKey(Object key)
- 지정된 key와 일치하는 객체가 있는지 확인한다. - boolean containsValue(Object value)
- 지정된 value와 일치하는 객체가 있는지 확인한다. - Set entrySet()
- Map에 저장된 key-value를 Map.Entry타입으로 저장한 Set 반환 - Set keySet()
- Map에 저장된 모든 key 객체를 반환 - Collection values()
- Map에 저장된 모든 value 객체를 반환
Map이 Collection처럼 동작
Map의 주요 메서드를 살펴보면 Collection 형태로 반환하는 것을 볼 수 있다.
entrySet, keySet, values는 모두 Set을 반환하거나 Collection을 반환한다.
Map에서 제공하는 이 메서드를 통해 컬렉션을 제공하고, 이 반환값으로 컬렉션 인터페이스를 사용할 수 있게 된다.
제일 위에 '구조와 상속 관계'에 key를 가져와 iterator에 넣어 그 값을 하나씩 순회하는 방법으로 접근한다는 문장을 적었다. Map으로 직접 동작하는 것은 아니지만, Map이 반환하는 그 Collection을 이용해서 동작한다. 이 덕분에 Map은 Collection을 상속받지 않았지만, Collection처럼 동작하며 Collection의 메서드를 사용할 수 있게 된다.
컬렉션 프레임워크 전체 구조

reference
InpaDev. 「Java Collections Framework 종류 💯 총정리」. https://inpa.tistory.com/entry/JCF-🧱-Collections-Framework-종류-총정리#map_인터페이스
TREE BLOG. 「JCF - 자바 컬렉션 프레임워크의 종류」. https://gray-tree.tistory.com/entry/JCF-자바-컬렉션-프레임-워크
도도팩토리. 「[JAVA] Java Collection Framework (JCF)의 이해」.https://dodo-factory.tistory.com/entry/JAVA-Java-Collection-Framework-JCF의-이해
'Language > JAVA' 카테고리의 다른 글
[JAVA] 예외 처리(Exception Handling) 하는 이유와 방법 알아보기 (0) | 2025.01.15 |
---|---|
응집도(Conhension)와 결합도(Coupling), 그리고 캡슐화의 중요성 (0) | 2025.01.14 |
[자바] 자바 가상 머신, JVM(Java Virtual Machine) 자세히 이해하기 (0) | 2025.01.13 |
객체 지향 5대 원칙 - SOLID 이해하기 (0) | 2025.01.10 |
객체 지향 프로그래밍(Object-Oriented-Programming) 자세히 이해하기 (0) | 2025.01.08 |