버미

자바 컬렉션 프레임 워크 (Java Collections Framework) 본문

Language/Java

자바 컬렉션 프레임 워크 (Java Collections Framework)

Bum_2 2024. 6. 24. 20:49

Java Collections Framework

 

자료 구조 종류의 형태들을 자바 클래스로 구현한 모음집이다.

자바에서 제공하는 Collection은 크게 3가지(List, Queue, Set)로 나뉘어있다.

 

 

자료구조 분류

 

자료구조를 분류하는 것은 다양할 수 있지만, 대표적으로 분류되는 선형 자료구조와 비선형 자료구조로 나눌 수 있다.

 

  1. 선형 자료구조
    선형 자료구조는 데이터가 일렬로 연결된 형태이다. int[] 배열과 비슷하다고 생각하면 쉽다.
    대표적으로 리스트(List), 큐(Queue), 덱(Deque)이 있다.
  2. 비선형 자료구조
    각 요소가 여러개의 요소와 연결된 형태이다. 
    대표적으로는 그래프(Graph), 트리(Tree)가 있다.

이 외에 두 가지 분류에 해당하지 않는 자료구조가 있는데 집합(Set)이 있다. 집합의 경우는 연결된 형식이 아니며 Table에 가까운 구조다.  

 

 


Map을 Collection이라고 보는 분이 있다. 하지만 Java에서는 Map을 Collection이라고 보지 않는다. 
Map의 특징인 Mapping을 Collections이라고 보기 어렵고 그 역도 마찬가지다. 그래서 의도적으로 Collections Interface를 상속하지 않았다.

- 참고
docs.oracle.com/javase/8/docs/technotes/guides/collections/designfaq.html#a14

 


Iterable 인터페이스

 

Collection의 요소를 순회할 때 필요한, 이터레이터 객체를 관리하는 인터페이스

메서드 설명
default void forEach(consumer<? super T>action) 함수형 프로그래밍 전용 루프 메서드
iterator<T> iterator() 컬렉션에서 이터레이터를 구현
default Spliterator<T> splierator() 파이프라이닝 관련 메소드

 


 

Collection 인터페이스

 

리스트(List), 셋(Set), 큐(Queue)가 상속하는 인터페이스.

업캐스팅으로 다양한 종류의 컬렉션 자료형을 받아 자료를 삽입하거나 삭제, 탐색 기능을 할 수 있다.(다형성)

 

메서드 설명
boolean add(Ojbect o)
boolean addAll(Collection c)
지정된 객체(o) 또는 Collection(c)의 객체들을 Collection에 추가
boolean contrains(Object o)
boolean containsAll(connection c)
지정된 객체(o) 또는 Collection의 객체들이 Collection에 포함되어 있는지 확인
boolean remove(Object o)
boolean removeAll(collection c)
지정된 객체 또는 지정된 Collection(c)에 포함된 객체들을 삭제
boolean retainAll(Collection c) 지정된 Collection(c)에 포함된 객체만 남기고 나머지 객체는 Collection(c)에서 삭제
removeAll의 반대다.
Collection에 변화가 있으면 true 없으면 false를 반환
void clear() Collection의 모든 객체를 삭제
boolean equals(Object o) 같은 Collection인지 비교
int hashCode() Collection의 hash code를 반환
boolean isEmpty() Collection이 비어있는지 확인
iterator iterator() Collection의 iterator를 얻어서 반환 (상위 iterable 인터페이스를 상속)
int size() Collection에 저장된 객체의 개수를 반환
Object[] toArray() Collection에 저장된 객체를 객체배열(Object[])로 반환
Object[] toArray(Object[] a) 지정된 배열에 Collection의 객체를 저장해서 반환

 

JDK 1.8부터는 함수형 프로그래밍을 위해 parallelStream, removeIf, stream, forEach 디폴트(default) 메서드가 추가되었다.

Collection 인터페이스의 메서드를 보면 요소(객체)에 대한 추가, 삭제, 탐색은 다형성 기능으로 사용할 수 있지만, 데이터를 get 하는 메서드는 보이지 않는다. 왜냐하면 각 컬렉션 자료형 마다 구현하는 자료 구조가 달라서 최상위 타입으로 조회하기 어렵기 때문이다.

 


 

리스트(List)

 

List 인터페이스는 전형적인 선형 자료구조로 주로 순서가 있는 데이터 목록으로 이용할 수 있도록 만들어진 인터페이스다. 배열과 같이 요소의 개수가 고정적이지 않고 동적 크기를 갖도록 한다.

즉, 배열의 단점을 보완해 List를 통해 구현된 클래스들은 '동적 크기'를 갖는 배열처럼 사용할 수 있다.

 

메서드 설명
void add(int index, Object element)
boolean addAll(int index, Collection c)
지정된 위치(index)에 객체(element) 또는 컬렉션에 포함된 객체들을 추가한다.
Object remove(int index) 지정된 위치(index)에 있는 객체를 삭제하고 삭제된 객체를 반환한다.
Object get(int index) 지정된 위치(index)에 있는 객체를 반환한다.
Object set(int index, Object element) 지정된 위치(index)에 객체(element)를 저장한다.
int indexOf(Object o) 지정된 객체의 위치(index)를 반환한다. (순방향)
int lastIndexOf(Object o) 지정된 객체의 위치(index)를 반환한다. (역방향)
List subList(int formIndex, int toIndex) 지정된 범위(from ~ to)에 있는 객체를 반환한다.
ListIterator listIterator()
ListIterator listIterator(int index)
List의 객체에 접근할 수 있는 ListIterator를 반환한다.
void sort(Comparator c) 지정된 비교자(c)로 List를 정렬한다.

 

구현 클래스

  • ArrayList
    Object[] 배열을 사용하면서 내부 구현을 통해 동적으로 관리한다. Primitive 배열(ex. int[])과 유사한 형태라고 보면 된다. 즉, 최상위 타입인 Object 타입으로 배열을 생성해서 사용하기 때문에 요소 접근에는 성능이 좋지만, 중간의 요소를 삽입, 삭제하는 경우 중간 그 이후 요소를 한 칸씩 밀거나 당겨야 해서 삽입, 삭제에서는 성능이 좋지 않다.
  • LinkedList
    데이터와 주소로 이루어진 클래스를 만들어 서로 연결하는 방식이다(이중 연결 리스트).
    요소 검색 시 순회에서는 성능이 떨어지나, 해당 노드를 삽입, 삭제 할 경우 해당 노드의 링크를 끊고 연결만 해주면 되기 때문에 삽입, 삭제에서는 성능이 좋다.
  • Vector
    동기화를 지원해주는 ArrayList이다. 
    Object[] 배열을 사용하여 요소 접근에서 빠른 성능을 보인다. Java Collection Framework가 도입되기 전부터 지원하던 클래스다. 멀티 쓰레드에서는 안전성이 좋지만, 단일 쓰레드 동기화를 하기 때문에 Array List에 비해 성능이 약간 느리다.
  • Stack
    LIFO구조로 Vector 클래스를 상속 받고 있다.

 


큐(Queue)

 

Queue 인터페이스는 선형 자료구조로 주로 순서가 있는 데이터를 기반으로 FIFO를 위해 만들어진 인터페이스다.

Queue는 한쪽 반향으로만(꼬리 쪽) 삽입 삭제가 가능한 반면, Deque는 Double ended Queue라는 의미로 양쪽에서(Head, Tail) 삽입삭제가 가능한 자료구조라고 보면 된다.(Queue에서 확장된 형태) 

 

메소드 설명
boolean add(E e) 요소(e)를 꼬리에 추가. 
큐가 다 찬 경우 IllegalArgumentException 예외를 출력한다.
boolean offer(E e) 요소(e)를 꼬리에 추가. 
큐가 다 차더라도 IllegalArgumentException 예외를 출력하지 않는다.
E peek() 헤드를 삭제하지 않고 검색하여 요소를 반환한다
E pool() 헤드를 검색 및 삭제하면서 요소를 반환한다
void addFirst(E e)
void addLast(E e)
요소(e)를 헤드/꼬리에 추가한다.
큐가 다 찬 경우 IllegalArgumentException 예외를 출력한다.(add(E e)와 같다.
boolean offerFirst(E e)
boolean offerLast(E e)
요소를 헤드/꼬리에 추가한다.(offer(E e)와 같다.)
E peekFirst()
E peekLast()
헤드/꼬리에 있는 요소를 삭제하지 않고 반환한다.(peek()과 같다.)
E pollFirst()
E pollLast()
헤드/꼬리를 검색 및 삭제하면서 요소를 반환한다.
int size() 요소의 개수를 반환한다.

 

구현 클래스

  • LinkedList
    LinkedList는 List와 Deque 인터페이스를 구현한다.
    Deque 또는 Queue를 LinkedList 처럼 node 객체로 연결해서 관리하길 원한다면 LinkedList를 사용하면 된다. 
    ArrayList처럼 Object[] 배열로 관리하길 원한다면 ArrayDeque사용하면 된다. 물론 LinkedList와 ArrayDeque 둘 다 Deque를 구현하고 있고, Deque는 Queue를 상속받기 때문에 Queue로 도 쓰일 수 있다. 
    자바에서 지원하는 컬렉션에서 '일반적인 큐'를 사용하고자 한다면 Linked List로 생성하며 Queue로 선언하면 된다는 것이다.
Queue<T> queue = new LinkedList<>();
Deque<T> queue = new LinkedList<>();

 

  • PriorityQueue
    '데이터 우선순위'에 기반하여 우선순위가 높은 데이터가 먼저 나오는 큐다.
    정렬방식을 지정하지 않는다면 낮은 숫자가 높은 우선순위를 갖는다. 
    PriorityQueue는 주어진 데이터들 중 최댓값, 혹은 최솟값을 꺼내올 때 유용하게 사용할 수 있다. 
    다만, 사용자가 정의한 객체를 타입으로 사용할 경우 반드시 Comparator 또는 Comparable을 통해 정렬 방식을 구현해주어야 한다. 
/* 
T는 객체 타입을 의미하며 기본적으로
Integer, String, Double, Long 같은 Wrapper Class부터
사용자 정의 객체까지 가능하다.
단, primitive type은 불가능하다.
*/
 
ArrayDeque<T> arraydeque = new ArrayDeque<>();
PriorityQueue<T> priorityqueue = new PriorityQueue<>();
 
Deque<T> arraydeque = new ArrayDeque<>();
Deque<T> linkedlistdeque = new LinkedList<>();
 
Queue<T> arraydeque = new ArrayDeque<>();
Queue<T> linkedlistdeque = new LinkedList<>();
Queue<T> priorityqueue = new PriorityQueue<>();

 


 

Set

 

세트는 말 그대로 집합이다. 데이터를 중복해서 저장할 수 없으며, 입력 순서대로의 저장 순서를 보장하지 않는다.

다만 LinkedHashSet은 Set임에도 불구하고 입력 순서대로의 저장순서를 보장하고 있다.

 

메소드 설명
boolean add(E e) 지정된 요소가 없을 경우 추가한다. 
요소가 존재하는 경우 false를 반환한다.
boolean contains(Object o) 지정된 요소가 Set에 있는지 확인한다.
boolean equals(Object o) 지정된 객체와 현재 집합이 같은지 비교한다.
boolean isEmpty() 현재 집합이 비어있을 경우 true, 아닐 경우 false를 반환한다.
boolean remove(Object o) 지정된 객체가 집합에 존재하는 경우 해당 요소를 제거한다.
int size() 요소의 개수를 반환한다.
void clear() 집합에 있는 모든 요소들을 제거한다.
E first() 첫 번째 요소(가장 낮은 요소)를 반환한다.
E last() 마지막 요소(가장 높은 요소)를 반환한다.
SortedSet<E> headSet(E toElement) 지정된 요소(toElement)보다 작은 요소들을 집합으로 반환한다.
SortedSet<E> tailSet(E fromElement) 지정된 요소(fromElement)를 포함하여 큰 요소들을 집합으로 반환한다.
SortedSet<E> subSet(E from, E to) from <= x < to인 요소를 집합으로 반환한다.

 

  • HashSet
    배열에 연결 노드를 결합한 형태. Set의 특징과 같이 입력 순서를 보장하지 않으며, 중복을 허용하지 않는다.
    해쉬로 데디어틔 위치를 특정시켜 빠른 추가, 삭제, 검색을 할 수 있다. 
  • LinkedSet
    입력 순서의 보장을 받고 싶은 경우 사용하는 Set. 
  • TreeSet
    Set의 특징과 같이 입력 순서의 보장을 받지 못하며, 요소의 중복을 허락하지 않는다.
    대신, 데이터의 가중치에 따른 순서대로 정렬된다.
    따라서 TreeSet은 중복되지 않으면서 특정 규칙에 의해 정렬된 형태의 집합을 쓰고 싶을 때 사용한다. 
    특정 구간의 집합 요소들을 탐색할 때 유용하다.
    (Tree 라는 자료구조가 데이터를 일정 순서에 의해 정렬하는 구조다. 거기에 더해진 것이 바로 Set인 중복값 방지 자료구조인 것이다.)

 

상황에 맞는 자료구조를 쉽게 볼 수 있는 보조적인 자료이다.

출처 : http://javabeans.asia

 

'Language > Java' 카테고리의 다른 글

자바 인터페이스와 추상 클래스  (0) 2025.04.17
자바 제네릭(Generics) 개념 & 문법  (0) 2024.06.22