자바 컬렉션 프레임워크(Collection Framework)란?
컬렉션(Collection) 이란?
자바에서 컬렉션이란 여러 객체(데이터)를 담을 수 있는 자료구조, 다수의 데이터 그룹 또는 집합을 의미한다.
프레임워크(Framework)란?
복잡하게 설명할 수 있지만 간단하게 표준화된 프로그래밍 방식을 의미한다.
그렇다면 컬렉션 프레임워크(Collection Framework)는?
데이터 그룹을 저장하는 클래스들을 표준화한 설계이다. JDK 1.2 버전부터 java.util 패키지에서 지원하기 시작하였고 이전에는 Vector, Properties, Stack, Hash Tables, Dictionary와 같은 것들이 존재하였으나 통일성이 없고 표준화된 인터페이스가 존재하지 않았다.
컬렉션 프레임워크는 아래와 같은 같은 장점을 통해 객체지향적이고 재사용성이 높은 코드를 작성할 수 있도록 도와준다.
- 일관된 API: List, Queue, Set, Map 등의 인터페이스를 제공하고 이를 구현하는 클래스를 제공한다.
- 프로그래밍 노력 감소 / 프로그램 속도 및 품질 향상: 추상화 개념이 성공적으로 구현되어 있으며 자료구조, 알고리즘을 구현하기 위한 코드를 직접 작성할 필요 없이 이미 구현된 컬렉션 클래스를 목적에 맞게 선택하여 사용하면 된다. 또한 제공되는 API 코드는 검증과 최적화가 되어있다.
- 가변적인 공간 제공: 고정적인 저장 공간을 제공하는 배열에 대비되는 특징이다.
컬렉션 프레임워크 계층 구조
컬렉션 인터페이스는 크게 List, Queue, Set으로 3가지 상위 인터페이스로 분류할 수 있으며 여기에 추가로 Map의 경우 컬렉션 인터페이스를 상속받고 있지 않지만 컬렉션으로 분류된다.
리스트 (List)
순서가 있는 데이터 집합으로 데이터 중복을 허용한다.
- ArrayList
- 배열을 이용하여 만든 리스트로 대표적인 컬렉션 클래스이다.
- 기본 크기는 10이지만 원소가 늘어나면 더 큰 배열에 옮긴다.
- 특정 원소 조회가 많은 경우 사용하는 것이 좋다.
- 단방향 포인터 구조로 인덱스로 조회가 가능하기 때문에 인덱스만 안다면 빠르게 조회가 가능하다.
- 삽입/삭제 시 뒤에 데이터를 뒤로 밀거나 앞으로 당겨야하므로 느리다. (O(N))
- LinkedList
- 노드와 포인트를 이용하여 만든 리스트이다.
- 특정 원소를 조회하는 경우 첫 노드부터 순회해야하기 때문에 ArrayList에 비해 느리다.
- 조회보다 삽입/삭제가 많은 경우 사용하는 것이 좋다.
- 양방향 포인터 구조로 삽입/삭제 시 포인터를 끊고 새로운 노드에 연결만하면됨으로 빠르다. - 스택, 큐, 양방향 큐등을 만들기 위한 용도로 쓰인다.
- Vector
- ArrayList와 비슷하게 배열로 만들어진 리스트로 과거의 대용량 처리를 위해 사용하였다.
- thread-safe하다는 특징을 가지고 있어 비교적 성능이 좋지 않고 무거워 잘 쓰이지 않는다.
- Stack
- LIFO(Last-In-First-Out) 특성을 가지는 자료구조이다.
- 들어올 때 Push, 나갈 때는 Pop이라는 용어를 사용한다.
큐(Queue)
처을 들어온 원소가 처음으로 나간다는 FIFO(First-In-First-Out)이라는 특징을 가진다.
- PriorityQueue
- 우선순위를 가지는 큐로 들어온 순서가 아닌 부여된 우선순위에 따라 높은 순으로 먼저 반환한다.
- Deque
- 양쪽으로 넣고 뺴는 것이 가능한 큐 자료구조이다.
집합(Set)
순서가 없는 데이터 집합으로 데이터 중복을 허용하지 않는다.
- HashSet
- 가장 빠른 임의 접근 속도를 가진다.
- 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출하고 같다면 equals()로 두 객체를 비교하여 동등성을 판단한다.
- LinkedHashSet
- 중복을 허용하진 않지만 순서를 가진다.
- TreeSet
- 중복을 허용하지 않고 순서도 없다. 그러나 정렬이 되어있다.
- 이진트리를 기반으로한 Set 컬렉션이다.
맵(Map)
Key - Value 쌍으로 이루어진 데이터의 집합으로 순서는 유지되지 않으며 키(Key)의 중복을 허용하지 않으나 값(Value)의 중복은 허용한다.
- HashMap
- 키와 값을 가지고 순서는 없다.
- 키는 중복을 허용하지 않지만 값은 중복이 가능하다.
- 키와 값에 Null을 허용한다.
- 동기화를 보장하지 않는다.
- HashTable
- HashMap과 동일한 특징을 가지지만 thread-safe하여 동기화를 지원한다.
- get(), put(), remove() 등에 sycronized라는 키워드가 붙어있다.
- HashMap과 동일한 특징을 가지지만 thread-safe하여 동기화를 지원한다.
- LinkedHashMap
- 들어온 순서대로 순서를 가지는 Map이다.
- TreeMap
- 키를 기준으로 정렬이 되어 저장되는 Map이다.
- 이진트리를 기반으로 한 Map이다. 부모 키값을 비교하여 낮은 건 왼쪽 높은 건 오른쪽에 Map.Entry를 저장한다.
- 저장시간이 다른 자료 구조에 비해 오래 걸린다.
글을 마치며
다양한 자료구조를 지원하는 만큼 종류도 특징도 다양한 컬렉션 프레임워크의 클래스들.
대부분 급할 때는 특성을 생각하지 않고 익숙한 클래스를 사용하게 된다는 아주 슬픈 사실이 있어서 주요 특징들은 알아두면 그때그때 최악의 선택을 하지 않는데는 도움이 될 것이라고 생각한다. 워낙 자바 프로그래밍에서 빠질 수 없는 필수적인 요소이기 때문에 잘 정리해두면 두고두고 유용한 지식이 될 것이다😊
참고 자료 및 사이트