티스토리 뷰

언어/Java

[Java]컬렉션(Collection) 프레임워크에 대하여

꼬마우뇽이(원종운) 2022. 1. 6. 16:01

컬렉션 프레임워크란

데이터 그룹을 다루고 표현하기 위한 단일화된 구조(architecture)를 의미합니다. 

 

왜 등장하였는가?

JDK 1.2 이전까지는 Properties, Hashtable, Vector와 같이 데이터 그룹을 다루고 표현하는 클래스들이 존재하였지만, 단일화된 구조를 가지지 않고 서로 다른 구조와 방식으로 작동하여서 표준화된 방법으로 일관적으로 사용하기 어려웠습니다.

 

그러한 불편함을 개선하기 위하여 구조를 통일하고 비슷한 기능을 하는 클래스들을 추상화하여 설계함으로써 불편함을 개선하게 되었습니다.

 

주요 인터페이스들에 대하여

1. List 인터페이스

순서가 있는 데이터의 그룹에 대하여 데이터의 중복을 허용하는 컬렉션을 위한 인터페이스입니다.

 

구현 클래스들과 상속 계층도

List 인터페이스의 구현 클래스와 상속 계층도

구현 클래스인 Vector, Stack, ArrayList, LinkedList 모두 List 인터페이스가 제공하여야 하는 기능을 제공합니다. 다만 각 구현 클래스들은 순서 있는 데이터의 그룹을 구현하고 연산을 제공하는 방법에 차이가 있습니다.

 

LinkedList 클래스는 더블 연결 리스트를 사용하여 구현됩니다.

나머지 Vector, Stack, ArrayList 클래스들은 배열을 사용하여 구현됩니다.

 

그러면 궁금점이 생길 수 있습니다. 중복된 코드를 제거하기 위하여 추상화된 컬렉션 프레임워크를 제공하는 것인데, 동일하게 구현된 Vector, Stack, ArrayList 3개의 클래스나 제공하는 것은 불필요하지 않냐라는 생각을 할 수 있습니다.

 

Vector 클래스는 자바에서 대표적으로 잘못 설계된 클래스이며, 하위 호환성을 위해 남겨두었습니다. Stack 클래스는 스택이라는 자료 구조를 제공하기 위해 Vector 클래스가 존재하던 시절 Vector 클래스를 확장하여 만들어졌지만 큰 단점들이 존재하여 사용을 안 하는 것이 좋습니다.

 

Stack 클래스를 왜 사용하면 안 되는지와 그러면 무엇을 사용하여야 하는지도 차후 알아보도록 하겠습니다. 후자에 대한 답을 미리 공개하자면 ArrayDeque 클래스를 사용하면 됩니다. ArrayDequeue는 Deque(Double-Ended Queue)를 배열을 통하여 구현 클래스입니다.

 

순서 있는 데이터 그룹을 다루고 싶다면 ArrayList 클래스와 LinkedList 클래스 중 하나를 사용하자

 

2. Map 인터페이스

(키, 값) 형태의 데이터의 그룹에 대하여 키의 중복을 허용하지 않는 컬렉션을 위한 인터페이스입니다. 하나의 키에는 하나의 값만이 지정될 수 있습니다.

 

구현 클래스들과 상속 계층도

Map 인터페이스의 구현 클래스와 상속 계층도

구현 클래스인 Hashtable, HashMap, WeakHashMap, LinkedHashMap, TreeMap 모두 Map 인터페이스가 제공하여야 하는 기능을 제공합니다. 다만 각 구현 클래스들은 (키, 값) 형태의 데이터 그룹을 구현하고 연산을 제공하는 방법에 차이가 있습니다.

 

Hashtable 클래스는 하위 호환성을 위해 존재합니다.

HashMap 클래스는 Java 7 까지는 Seperate Chaining 기법을 사용하였고, Java 8부터는 Seperate Chaining을 사용하되, 데이터가 많아지면 Linked List가 아닌 Tree로 재구축하여 사용하고, 적어지면 다시 LinkedList를 사용하여 구현됩니다.

WeakHashMap 클래스는 키가 더 이상 사용되지 않을 경우 자동으로 제거됩니다.

LinkedHashMap 클래스는 HashMap 클래스에서 확장하여 저장된 데이터의 순서에 관한 정보를 추가로 저장합니다.

TreeMap 클래스는 이진 검색 트리 자료구조의 성능을 향상한 레드-블랙 트리를 통하여 구현되며 정렬과 범위 검색에 효율적입니다.

 

저장된 데이터의 순서가 중요하다면 LinkedHashMap을, 정렬과 범위 검색이 중요하다면 TreeMap을 사용하자.

그렇지 않다면 HashMap을 사용하자.

 

3. Set 인터페이스

데이터의 중복을 허용하지 않는 컬렉션을 위한 인터페이스입니다.

 

구현 클래스들과 상속 계층도

Set 인터페이스의 구현 클래스와 상속 계층도

구현 클래스인 HashSet, LinkedHashSet, TreeSet 모두 Set 인터페이스가 제공하여야 하는 기능을 제공합니다. 다만 각 구현 클래스들은 데이터의 중복을 허용하지 않는 그룹을 구현하고 연산을 제공하는 방법에 차이가 있습니다.

 

HashSet 클래스는 HashMap에서 (키, 값) 중 키를 데이터로, 값은 더미 값으로 채우는 방식으로 구현됩니다.

LinkedHashSet 클래스는 LinkedHashMap에서 (키, 값) 중 키를 데이터로, 값은 더미 값으로 채우는 방식으로 구현됩니다.

TreeSet 클래스는 TreeMap에서 (키, 값) 중 키를 데이터로, 값은 더미 값으로 채우는 방식으로 구현됩니다.

 

또한 LinkedHashSet 클래스와 HashSet, TreeSet 클래스의 차이점은 LinkedHashSet 클래스는 저장된 데이터의 순서를 유지한다는 점이다.

 

데이터의 중복을 허용하지 않고 싶다면 HashSet, LinkedHashSet, TreeSet 클래스를 이용하자.

저장된 데이터의 순서또한 유지하고 싶다면 그중 LinkedHashSet을 이용하자.

 

4. Queue 인터페이스

Queue 자료구조를 구현하는 컬렉션을 위한 인터페이스입니다.

 

구현 클래스들과 상속 계층도

Queue 인터페이스의 구현 클래스와 상속 계층도

구현 클래스인 PriorityQueue, LinkedList, ArrayDeque 모두 Queue 인터페이스가 제공하여야 하는 기능을 제공합니다. 추가로 LInkedList와 ArrayDequeue는 Dequeue 인터페이스가 제공하여야 기능 또한 제공합니다. 다만 각 구현 클래스들이 연산을 제공하는 방법에 차이가 있습니다.

 

PriorityQueue 클래스는 우선순위 큐로 일반적인 큐처럼 선입선출이 아닌, 큐의 원소에게 우선순위를 부여하여, 우선순위에 따라 값을 제거하는 큐이며, Heap을 사용하여 구현되어져있습니다.

 

Deque 인터페이스는 Queue 인터페이스를 확장한 인터페이스로, 한쪽 방향으로 데이터를 삽입하고 한쪽 방향으로 제거하는 단방향이 아닌 양쪽 방향으로 데이터를 삽입하고 제거하는 컬렉션(큐)을 위한 인터페이스입니다.

 

그 구현 클래스로는 LinkedList 클래스와 ArrayDequeu 클래스 있으며 전자의 경우는 더블 연결 리스트로 구현되어있고, 후자의 경우는 배열을 사용하여 구현되어있습니다.

 

우선순위큐가 필요하다면 PriorityQueue를, 그렇지 않다면 LinkedList를 사용하자.

양방향 제어가 필요하다면 ArrayDeque를 사용하자. 또는 스택이 필요할 때 사용하면 좋다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함