컬렉션 프레임워크
- 자바에서 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합
- 즉 데이터를 저장하는 자료구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것
- 컬렉션 프레임워크에서는 데이터를 저장하는 자료구조에 따라 핵심이 되는 주요 인터페이스를 정의해 놓았다.
- 컬렉션 프레임워크의 모든 컬렉션 클래스들은 List, Set, Map 인터페이스 중 하나를 구현하고 있다.
- List와 Set 인터페이스는 모두 Collection 인터페이스를 상속받지만, 구조상의 차이로 인해 Map 인터페이스는 별도로 정의된다.
Collection
- List와 Set 인터페이스의 공통된 부분을 뽑아서 정의한 인터페이스로, Map 인터페이스는 다른 형태로 컬렉션을 다루기 때문에 같은 상속 계층도에 포함되지 않는다.
- Collection 클래스에 저장된 데이터를 읽고 추가하고 삭제하는 등 컬렉션을 다루는데 필요한 가장 기본적인 메서드들을 정의해 놓았다.
List, Set, Map
인터페이스 | 설명 | 구현 클래스 |
List<E> | 순서가 있는 데이터의 집합으로, 데이터의 중복을 허용한다. | Vector, ArrayList, LinkedList, Queue |
Set<E> | 순서가 없는 데이터의 집합으로, 데이터의 중복을 허용하지 않는다. | HashSet, TreeSet |
Map<K, V> | 키와 값의 쌍으로 이루어지는 데이터의 집합으로, 순서가 없다. (키는 중복을 허용하지 않지만, 값은 중복될 수 있다.) |
HashMap, TreeMap, Hashtable, Properties |
List 컬렉션 클래스
ArrayList
- List 인터페이스를 구현한 클래스로, 데이터의 저장순서가 유지되고 중복을 허용한다.
- Object 배열을 이용해서 데이터를 순차적으로 저장하며, 모든 종류의 객체를 담을 수 있다.
- 만약 배열에 더이상 저장할 공간이 없으면 보다 큰 배열을 생성해서 기존의 배열에 저장된 내용을 새로운 배열에 복사한다.
- 따라서 ArrayList를 생성할 때 저장할 요소의 개수를 고려해서 실제 저장할 개수보다 약간 여유있는 크기로 만드는 것이 좋다.
장단점
장점 | - 가장 기본적인 형태의 자료구조로 구조가 간단하며 사용하기 쉽다. - 각 요소들이 연속적으로 메모리 상에 존재하기 때문에 인덱스를 통해 데이터를 빠르게 읽어올 수 있다. (인덱스가 n인 데이터의 주소 = 배열의 주소 + n * 데이터 타입의 크기) |
단점 | - 크기를 변경할 때 새로운 배열을 생성해서 데이터를 복사하는 데 시간이 오래 걸린다. - 배열의 중간에 객체를 추가하거나 삭제하는 경우 다른 데이터들의 위치를 이동시켜야 하므로 시간이 오래 걸린다. |
LinkedList
- 불연속적으로 존재하는 데이터를 서로 연결한 형태의 자료구조로, 단일 연결 리스트의 경우 각 요소(노드)들은 자신과 연결된 다음 노드에 대한 참조와 데이터로 구성되어 있다.
- 단일 연결 리스트는 요소의 저장과 삭제 작업이 다음 요소를 가리키는 참조만 변경하면 되기 때문에 빠르게 처리가 가능하다.
- 하지만 현재 요소에서 이전 요소로 접근하기가 어렵기 때문에, 이전 요소에 대한 참조를 가지는 이중 연결 리스트를 더 많이 사용한다.
연산
삭제 | - 삭제하고자 하는 요소의 이전 요소가 삭제하고자 하는 요소의 다음 요소를 참조하도록 변경한다. - 배열처럼 데이터를 이동하는 과정이 없기 때문에 속도가 매우 빠르다. |
추가 | - 새로운 요소를 생성한 다음 추가하고자 하는 위치의 이전 요소의 참조를 새로운 요소에 대한 참조로 변경하고, 새로운 요소가 그 다음 요소를 참조하도록 변경한다. - 속도가 매우 빠르다. |
조회 | - 불연속적으로 위치한 각 요소들이 서로 연결되어 있기 때문에, 처음부터 n번째 데이터까지 차례대로 따라가야지만 원하는 데이터를 얻을 수 있다. - 저장해야 하는 데이터의 개수가 많아질수록 데이터를 읽어오는 시간이 길어진다. |
Stack과 Queue
Stack 클래스
- Vector 클래스를 상속받아 만들어진 자료구조로, 선형 메모리 공간에 데이터를 저장하면서 후입선출의 시멘틱을 따른다.
- 즉, 제일 마지막에 저장한 데이터를 가장 먼저 꺼내는 구조
Queue 인터페이스
- 클래스로 구현된 스택과 달리 자바에서 큐 메모리 구조는 별도의 인터페이스 형태로 제공된다.
- Queue 인터페이스를 상속받는 하위 인터페이스로는 Deque, BlockingDeque, BlockingQueue, TransferQueue 등이 있다.
- 이러한 인터페이스 중 Deque 인터페이스를 구현한 LinkedList 클래스를 Queue로 가장 많이 사용한다.
- 가장 먼저 저장된 데이터를 가장 먼저 꺼내는 선입선출 구조
PriorityQueue 클래스
- Queue 인터페이스 구현체 중 하나로, 저장한 순서에 관계없이 우선순위가 높은 것부터 꺼낸다.
- 저장공간으로 배열을 사용하며 각 요소를 힙이라는 자료구조의 형태로 저장한다.
Deque 인터페이스
- 한쪽 끝으로만 추가, 삭제할 수 있는 Queue와 달리 양쪽 끝에서 추가, 삭제가 가능하다.
- 즉 스택과 큐를 하나로 합쳐놓은 것과 같다.
- Queue 인터페이스를 상속받으며, 구현체로는 ArrayDeque와 LinkedList 등이 있다.
'Java > Java' 카테고리의 다른 글
Arrays, Collections (0) | 2022.03.28 |
---|---|
Comparable과 Comparator (0) | 2022.03.28 |
Iterator (0) | 2022.03.28 |
Map 컬렉션 클래스 (0) | 2022.03.28 |
Set 컬렉션 클래스 (0) | 2022.03.28 |