* 아래 링크를 참고하여 번역 및 추가 정리 하였습니다.
https://www.geeksforgeeks.org/collections-in-java-2/
Java Collection Framework 계층구조
Collection Framework
1. Collection Interface
Collection 프레임워크에는 모든 인터페이스가 특정 유형의 데이터를 저장하기 위해 사용되는 여러 인터페이스(List, Set, Map, …) 등이 포함되어 있다. 또한 Collection 인터페이스는 Iterable 인터페이스를 상속받고 있으므로 모든 컬렉션 인터페이스와 클래스는 Iterable을 implement한다.
Collection 인터페이스는 다른 모든 컬렉션 인터페이스들에서 사용하는 데이터 추가, 삭제와 같은 기본 메소드들을 모두 포함한다.
// Collection.class
public interface Collection<E> extends Iterable<E> {
// ...
}
2. Iterable Interface
Iterable 인터페이스는 iterator 메서드를 가지고 있으며 collection 반복자를 제공한다.
// Iterable.class
public interface Iterable<T> {
/**
* Returns an iterator over elements of type {@code T}.
* @return an Iterator.
*/
Iterator<T> iterator();
// ...
}
3. List Interface
Collection 인터페이스의 자식 인터페이스로, 데이터의 중복을 허용하고 순서를 지키는 collection이다. ArrayList, Vector, Stack과 같이 다양한 클래스로 구현되어 있다. List interface에 대해서는 다음 포스팅에 자세히 다룰 것이기 때문에 여기서는 간단히 정리해보려고 한다.
1) ArrayList
ArrayList는 자바에서 동적 배열을 제공한다. 자바의 기본 배열(ex - int[] arr = new int[3])보다는 느릴 수 있으나 element의 추가/삭제 등의 조작이 빈번하게 일어나는 경우 유용하게 사용된다. 데이터 타입은 primitive type이 아닌 wrapper class를 사용해야 한다.
2) LinkedList
LinkedList 클래스는 LinkedList 데이터 구조의 구현체로 ArrayList와는 다르게 구현되어 있다. 데이터가 연속된 구조에 저장되지 않고 포인터와 주소를 이용한 선형 자료구조에 의해 저장된다.
3) Vector
Vector 클래스는 자바에서 동적 배열을 제공하며, ArrayList와 내부적으로는 동일하게 구현되어 있다. 다만 차이점은 Vector는 동기화되어 있기 때문에 thread-safe하며, ArrayList는 동기화되어 있지 않다.
4. Stack Interface
Stack 클래스는 Stack 데이터 구조의 구현체이며 LIFO(Last In First Out), 즉 후입선출형 자료구조이다.
Vector 클래스를 상속하기 때문에 동기화되어 있어 thread-safe하나 non thread-safe하거나 더 빠른 자료구조를 원할 경우 ArrayDequeue로 대체할 수 있다.
Stack<String> stack = new Stack<String>();
stack.push("First");
stack.push("Second");
stack.push("Third");
while(!stack.isEmpty()) {
System.out.print(stack.pop() + " ");
}
// 실행결과
Third Second First
5. Queue Interface
Queue는 FIFO(First In First Out), 즉 먼저 들어간 element가 먼저 나오는 선입선출형 자료구조이다. 선착순과 같이 순서가 중요한 자료구조가 필요할 경우 사용된다.
PriorityQueue, ArrayDequeue 등 다양한 구현체들이 있으며, 그 중 PriorityQueue가 가장 많이 사용된다.
1) PriorityQueue
기본적으로 큐는 선입선출 알고리즘을 따르지만, 큐의 엘리먼트들을 우선순위에 따라 정렬하고 싶을 경우 PriorityQueue를 사용한다. 아무것도 정의하지 않았을 때 기본적으로 제공되는 정렬 알고리즘을 따르며, 정렬 기준을 변경하고 싶을 경우 Comparator를 이용하여 커스텀할 수 있다.
PriorityQueue<Integer> pq = new PriorityQueue<Integer>();
pq.add(30);
pq.add(17);
pq.add(25);
while(!pq.isEmpty()) {
System.out.println(pq.poll());
}
6. Set Interface
7. Sorted Set Interface
8. Map Interface
'백엔드' 카테고리의 다른 글
[Java] Covariant Return Type이란? (0) | 2022.07.15 |
---|---|
[Java] Collection - 2. ArrayList와 Vector (0) | 2022.07.06 |
[Java] Collection.stream().forEach() 와 Collection.forEach() 의 차이 (0) | 2022.06.27 |
[Java] 2. Garbage Collection - GC의 과정 및 종류 (0) | 2022.06.24 |
[Java] 1. Garbage Collection이란? GC의 핵심 및 과정 (0) | 2022.06.24 |
댓글