검수요청.png검수요청.png

자바 컬렉션

위키원
greenwood26 (토론 | 기여)님의 2020년 8월 28일 (금) 16:23 판 (반복자(Iterator) 인터페이스)
이동: 둘러보기, 검색

자바 컬렉션(Java Collection)이란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미한다. 즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것이다.[1]

자바 컬렉션 구조

개요

자바에서 대용량의 데이터를 추가/삭제하면서 처리가 필요할 때 사용한다.[2] 자바 초기에는 벡터(Vector), 스택(Stack), 해시테이블(HashTable)등의 컬렉션 클래스만 제공했으나, 자바 1.2 이후 표준적인 방식으로 컬렉션을 다루기 위한 컬렉션 프레임워크(Collection FrameWork)가 등장하였다. 모든 컬렉션 클래스명은 구현한 인터페이스 명이 포함되어있어서 바로 클래스의 특징을 알 수 있다. 예를 들어 HashMap 클래스는 Map 인터페이스에 해시(Hash)알고리즘을 이용하여 구현한 것이다. 단, 벡터, 스택, 해시 테이블 처럼 컬렉션 프레임워크 이전부터 존재하던 컬렉션 클래스(Legacy Class)는 이러한 명명법을 따르지 않는다.[3] 주요 인터페이스에는 리스트(list) 인터페이스, 세트(set) 인터페이스, 맵(Map) 인터페이스 등이 있으며 이 중에서 리스트와 세트 인터페이스는 모두 컬렉션 인터페이스를 상속받지만, 구조상의 차이로 인해 맵 인터페이스는 별도로 정의된다. 따라서 리스트 인터페이스와 세트인터페이스의 공통된 부분을 컬렉션 인터페이스에서 정의하고 있다.[1]

특징[3]

장점

  • 별도로 컬렉션 클래스를 구현하는 것보다 이미 구현되어 있는 것을 사용함으로써 코딩 시간을 감소시킬 수 있다.
  • 컬렉션 프레임워크들은 잘 테스트 되고 검증되어 있으므로 코드 품질을 보장한다.
  • JDK에 포함된 컬렉션 프레임워크들을 사용하여 코드 유지보수 시간을 감소시킬 수 있다.
  • 재사용할 수 있고 상호 운용성이 보장된다.

구성요소

  • 컬렉션 인터페이스 : 모든 컬렉션 인터페이스는 java.util패키지에 있다.
  • 컬렉션 클래스 : 모든 컬렉션 클래스는 java.util 또는 java.util.concurrent 패키지에 있다.
  • 컬렉션 알고리즘 : 검색, 정렬, 셔플 같은 기능을 제공한다.

컬렉션(Collection) 인터페이스 그룹[3]

컬렉션 인터페이스들은 제네릭으로 표현되어 컴파일 시점에서 객체의 타입을 검사하기 때문에 런타임 에러를 줄이는 데 도움이 된다. 예를 들어 런타임 시 발생하는 ClassCastException을 컴파일 시점에서 찾아낼 수 있다. 또한, 클래스 캐스팅을 하지 않아도 되므로 코드를 좀 더 깔끔하게 유지할 수 있다. 컬렉션 인터페이스는 직접적인 수현은 제공하지 않으며 모든 컬렉션 클래스가 구현해야 하는 메소드들을 포함하고 있다. 아래는 Collection 인터페이스에서 제공하는 주요 메소드이다.

컬렉션 인터페이스 메소드[1]
메소드 설명
boolean add(E e) 해당 컬렉션에 전달된 요소를 추가함
void clear() 해당 컬렉션의 모든 요소를 제거함 (선택적 기능)
boolean contains(Object o) 해당 컬렉션이 전달된 객체를 포함하고 있는지 확인함
boolean equals(Object o) 해당 컬렉션과 전달된 객체가 같은지 확인함
boolean isEmpty() 해당 컬렉션이 비었는지를 확인함
Iterator<E> iterator() 해당 컬렉션의 반복자(iterator)를 반환함
boolean remove(Object o) 해당 컬렉션에서 전달된 객체를 제거함 (선택적 기능)
int size() 해당 컬렉션의 요소의 총 개수를 반환함
Object[] toArray() 해당 컬렉션의 모든 요소를 Object타입의 배열로 반환함

리스트(list) 인터페이스

리스트(list) 인터페이스는 순서가 있는 컬렉션이며 중복 요소를 포함할 수 있다. 인덱스로 모든 요소에 접근할 수 있으며, List 인터페이스로 구현된 클래스는 ArrayList, LinkedList, Vector, Stack이 있다. 추가로 연결 리스트(LinkedList) 인터페이스도 있으며 그냥 리스트가 가지는 삽입, 삭제 시 성능문제를 보완하기 위해 사용한다.

리스트 인터페이스 메소드[4]
메소드 설명
boolean add(E e) 해당 리스트에 전달된 요소를 추가함 (선택적 기능)
void add(int index, E e) 해당 리스트의 특정 위치에 전달된 요소를 추가함 (선택적 기능)
void clear() 해당 리스트의 모든 요소를 제거함 (선택적 기능)
boolean contains(Object o) 해당 리스트가 전달된 객체를 포함하고 있는지 확인함
boolean equals(Object o) 해당 리스트와 전달된 객체가 같은지 확인함
E get(int index) 해당 리스트의 특정 위치에 존재하는 요소를 반환함
boolean isEmpty() 해당 리스트가 비었는지를 확인함
Iterator<E> iterator() 해당 리스트의 반복자(iterator)를 반환함
boolean remove(Object o) 해당 리스트에서 전달된 객체를 제거함 (선택적 기능)
boolean remove(int index) 해당 리스트에서 특정 위치에 존재하는 요소를 제거함. (선택적 기능)
E set(int index, E e) 해당 리스트의 특정 위치에 존재하는 요소를 전달받은 객체로 대체함 (선택적 기능)
int size() 해당 리스트의 요소의 총 개수를 반환함
Object[] toArray() 해당 리스트의 모든 요소를 Object타입의 배열로 반환함

세트(set) 인터페이스

세트(Set) 인터페이스는 중복 요소를 포함할 수 없으며 랜덤 액세스를 허용하지 않으므로, iterator 또는 foreach를 이용하여 요소를 탐색할 수 있다. Set 인터페이스로 구현된 클래스는 HashSet, TreeSet, LinkedHashSet 이 있다. 추가로 정렬된 세트(Sorted Set) 인터페이스는 요소를 오름차순으로 유지하는 세트(set)이다. 정렬된 세트 인터페이스로 구현된 클래스는 TreeSet이 있다.

세트 인터페이스 메소드[5]
메소드 설명
boolean add(E e) 해당 집합(set)에 전달된 요소를 추가함.(선택적 기능)
void clear() 해당 집합의 모든 요소를 제거함
boolean contains(Object o) 해당 집합이 전달된 객체를 포함하고 있는지를 확인함
boolean equals(Object o) 해당 집합과 전달된 객체가 같은지를 확인함
boolean isEmpty() 해당 집합이 비어있는지를 확인함
Iterator<E> iterator() 해당 집합의 반복자(iterator)를 반환함
boolean remove(Object o) 해당 집합에서 전달된 객체를 제거함(선택적 기능)
int size() 해당 집합의 요소의 총 새수를 반환함
Object[] toArray() 해당 집합의 모든 요소를 Object타입의 배열로 반환함

큐(queue) 인터페이스

큐(Queue) 인터페이스는 처리하기 전에 요소를 보유하는 데 사용된다. 기본 컬렉션 작업 외에도 Queue는 삽입, 추출 및 검사 작업을 제공한다. 일반적으로 Queue는 요소를 FIFO 방식으로 정렬하며 예외에는 우선순위가 높은 것부터 출력하는 우선순위 큐가 있다. Queue 인터페이스로 구현된 클래스는 Priority Queue, Linkedlist, Dequeue등이 있다. Deque인터페이스는 양쪽 끝에 요소 삽입 및 제거를 지원하며 Double ended Queue의 약자이며 데크라고 읽는다. Deque 인터페이스로 구현된 클래스는 ArrayDeque가 있으며 Java SE 6부터 지원되는 ArrayDeque 클래스는 스택과 큐 메모리 구조를 모두 구현하는 데 가장 적합한 클래스이다.

큐 인터페이스 메소드[6]
메소드 설명
boolean add(E e) 해당 큐의 맨 뒤에 전달된 요소를 삽입하고 만약 삽입에 성공하면 true를 반환하고, 큐에 여유공간이 없어 삽입에 실패하면 illegalStateException을 발생시킴
E element() 해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환함
boolean offer(E e) 해당 큐의 맨 뒤에 전달된 요소를 삽입함
E peek() 해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 반환하고 만약 큐가 비었으면 null을 반환함
E poll() 해당 큐의 맨 앞에 있는(제일 먼저 저장됨) 요소를 반환하고, 해당 요소를 큐에서 제거함, 만약 큐가 비어있으면 null을 반환함
E remove() 해당 큐의 맨 앞에 있는(제일 먼저 저장된) 요소를 제거함

(Map) 인터페이스[3]

맵(map) 인터페이스는 키와 값을 매핑한다. 중복 키가 존재할 수 없으며 각 키는 하나의 값만 매핑할 수 있다. 맵의 기본 연산은 put, get, containsKey, containsValue, size, isEmpty 등이 있다. 맵(map) 인터페이스로 구현된 클래스는 HashMap, TreeMap, LinkedHashMap 등이 있다. 추가로 정렬된 맵(Sorted Map) 인터페이스는 매핑을 오름차순의 키 순서로 유지하는 Map이며 정렬된 맵 인터페이스로 구현된 클래스는 TreeMap이 있다.

해시맵 인터페이스 메소드[7]
메소드 설명
void clear() 해당 맵의 모든 매칭을 제거함
boolean containsKey(Object key) 해당 맵이 전달된 키를 포함하고 있는지를 확인함
boolean containsValue(Object value) 해당 맵이 전달된 값에 해당하는 하나 이상의 키를 포함하고 있는지를 확인함
V get(Object key) 해당 맵에서 전달된 키에 대응하는 값을 반환함, 만약 해당 맵이 전달된 키를 포함한 매핑을 포함라고 있지 않으면 null을 반환함
boolean isEmpty() 해당 맵이 비어있는지를 확인함
Set<K> keySet() 해당 맵에 포함되어 있는 모든 키로 만들어진 Set 객체를 반환함
V put(K key, V value) 해당 맵에 전달된 키에 대응하는 값으로 특정 값을 매핑함
V remove(Object key) 해당 맵에 전달된 케에 대응하는 매핑을 제거함
boolean remove(Object key, Object value) 해당 맵에서 특정 값에 대응하는 특정 키의 매핑을 제거함
V replace(K key, V value) 해당 맵에서 전달된 키에 대응하는 값을 특정 값으로 대체함
boolean replace(K key, V oldValue, V newValue) 해당 맵에서 특정 값에 대응하는 전달된 키의 값을 새로운 값으로 대체함
int size() 해당 맵의 매핑의 총 개수를 반환함
트리맵 인터페이스 메소드[7]
메소드 설명
Map.Entry<K,V> ceilingEntry(K key) 해당 맵에서 전달된 키와 같거나, 전달된 키보다 큰 키 중에서 가장 작은 키와 그에 대응하는 값의 엔트리를 반환함, 만약 해당하는 키가 없으면 null을 반환함
K ceilingKey(K key) 해당 맵에서 전달된 키와 같거나, 전달된 키보다 큰 키 중에서 가장 작은 키를 반환함, 만약 해당하는 키가 없으면 null을 반환함
void clear() 해당 맵(map)의 모든 매핑(mapping)을 제거함.
boolean containsKey(Object key) 해당 맵이 전달된 키를 포함하고 있는지를 확인함.
boolean containsValue(Object value) 해당 맵이 전달된 값에 해당하는 하나 이상의 키를 포함하고 있는지를 확인함.
NavigableMap<K,V> descendingMap() 해당 맵에 포함된 모든 매핑을 역순으로 반환함.
Set<Map.Entry<K,V>> entrySet() 해당 맵에 포함된 모든 매핑을 Set 객체로 반환함
Map.Entry<K,V> firstEntry() 해당 맵에서 현재 가장 작은(첫 번째) 키와 그에 대응하는 값의 엔트리를 반환함.
K firstKey() 해당 맵에서 현재 가장 작은(첫 번째) 키를 반환함.
Map.Entry<K,V> floorEntry(K key) 해당 맵에서 전달된 키와 같거나, 전달된 키보다 작은 키 중에서 가장 큰 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함.
K floorKey(K key) 해당 맵에서 전달된 키와 같거나, 전달된 키보다 작은 키 중에서 가장 큰 키를 반환함. 만약 해당하는 키가 없으면 null을 반환함.
V get(Object key)

해당 맵에서 전달된 키에 대응하는 값을 반환함. 만약 해당 맵이 전달된 키를 포함한 매핑을 포함하고 있지 않으면 null을 반환함.

SortedMap<K,V> headMap(K toKey) 해당 맵에서 전달된 키보다 작은 키로 구성된 부분만을 반환함.
Map.Entry<K,V> higherEntry(K key) 해당 맵에서 전달된 키보다 작은 키 중에서 가장 큰 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함.
K higherKey(K key) 해당 맵에서 전달된 키보다 작은 키 중에서 가장 큰 키를 반환함. 만약 해당하는 키가 없으면 null을 반환함.
Set<K> keySet() 해당 맵에 포함되어 있는 모든 키로 만들어진 Set 객체를 반환함.
Map.Entry<K,V> lastEntry() 해당 맵에서 현재 가장 큰(마지막) 키와 그에 대응하는 값의 엔트리를 반환함.
K lastKey() 해당 맵에서 현재 가장 큰(마지막) 키를 반환함.
Map.Entry<K,V> lowerEntry(K key) 해당 맵에서 전달된 키보다 큰 키 중에서 가장 작은 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함.
K lowerKey(K key) 해당 맵에서 전달된 키보다 큰 키 중에서 가장 작은 키를 반환함. 만약 해당하는 키가 없으면 null을 반환함.
Map.Entry<K,V> pollFirstEntry() 해당 맵에서 현재 가장 작은(첫 번째) 키와 그에 대응하는 값의 엔트리를 반환하고, 해당 엔트리를 맵에서 제거함.
Map.Entry<K,V> pollLastEntry() 해당 맵에서 현재 가장 큰(마지막) 키와 그에 대응하는 값의 엔트리를 반환하고, 해당 엔트리를 맵에서 제거함.
V put(K key, V value) 해당 맵에 전달된 키에 대응하는 값으로 특정 값을 매핑함.
V remove(Object key) 해당 맵에서 전달된 키에 대응하는 매핑을 제거함.
boolean remove(K key, V value) 해당 맵에서 특정 값에 대응하는 특정 키의 매핑을 제거함.
V replace(K key, V value) 해당 맵에서 전달된 키에 대응하는 값을 특정 값으로 대체함.
boolean replace(K key, V oldValue, V newValue) 해당 맵에서 특정 값에 대응하는 전달된 키의 값을 새로운 값으로 대체함.
int size() 해당 맵의 매핑의 총 개수를 반환함.
SortedMap<K,V> subMap(K fromKey, K toKey) 해당 맵에서 fromKey부터 toKey까지로 구성된 부분만을 반환함. 이때 fromKey는 포함되나, toKey는 포함되지 않음.
SortedMap<K,V> tailMap(K fromKey) 해당 맵에서 fromKey와 같거나, fromKey보다 큰 키로 구성된 부분만을 반환함.

기타 인터페이스 그룹

반복자(Iterator) 인터페이스

자바의 컬렉션 프레임워크는 컬렉션에 저장된 요소를 읽어오는 방법을 반복자(iterator) 인터페이스로 표준화하고 있다. 컬렉션 인터페이스에서는 반복자 인터페이스를 구현한 클래스의 인스턴스를 반화하는 iterator() 메소드를 정의하여 각 요소에 접근하도록 하고 있다. 추가로 리스트 반복자(ListIterator) 인터페이스는 반복자 인터페이스를 상속받아 여러 기능을 추가한 인터페이스이다. 반복자 인터페이스는 컬렉션의 요소에 접근할 때 한 방향으로만 이동할 수 있지만, 리스트 반복자 인터페이스는 컬렉션 요소의 대체, 추가, 그리고 인덱스 검색 등을 위한 작업에서 양방향으로 이동하는 것을 지원한다. 단, 반복자 인터페이스는 리스트 인터페이스를 구현한 리스트 컬렉션 클래스에서만 ListIterator() 메소드를 통해 사용할 수 있다.

반복자 인터페이스 메소드[8]
메소드 설명
boolean hasNext() 해당 이터레이션(iteration)이 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함.
E next() 이터레이션(iteration)의 다음 요소를 반환함.
default void remove() 해당 반복자로 반환되는 마지막 요소를 현재 컬렉션에서 제거함. (선택적 기능)
리스트 반복자 인터페이스 메소드[8]
메소드 설명
void add(E e) 해당 리스트(list)에 전달된 요소를 추가함. (선택적 기능)
boolean hasNext() 이 리스트 반복자가 해당 리스트를 순방향으로 순회할 때 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함.
boolean hasPrevious() 이 리스트 반복자가 해당 리스트를 역방향으로 순회할 때 다음 요소를 가지고 있으면 true를 반환하고, 더 이상 다음 요소를 가지고 있지 않으면 false를 반환함.
E next() 리스트의 다음 요소를 반환하고, 커서(cursor)의 위치를 순방향으로 이동시킴.
int nextIndex() 다음 next() 메소드를 호출하면 반환될 요소의 인덱스를 반환함.
E previous() 리스트의 이전 요소를 반환하고, 커서(cursor)의 위치를 역방향으로 이동시킴.
int previousIndex() 다음 previous() 메소드를 호출하면 반환될 요소의 인덱스를 반환함.
void remove() next()나 previous() 메소드에 의해 반환된 가장 마지막 요소를 리스트에서 제거함. (선택적 기능)
void set(E e) next()나 previous() 메소드에 의해 반환된 가장 마지막 요소를 전달된 객체로 대체함. (선택적 기능)

컨커런트(Concurrent) 인터페이스

컨커런트(Conccurent) 인터페이스에는 BlockingQueue, TransferQueue, BlockingDeque, ConccentMap, ConccurentNavigableMap 인터페이스 등이 있다.

컴퍼러블(Comparable) 인터페이스[9]

컴퍼러블 인터페이스는 객체를 정렬하는 데 사용되는 메소드인 compareTo() 메소드를 정의하고 있다. 자바에서 같은 타입의 인스턴스를 서로 비교해야만 하는 클래스들은 모두 Comparable 인터페이스를 구현한다. 다라서 Boolean을 제외한 래퍼 클래스나 String, Time, Date 같은 클래스의 인스턴스는 모두 정렬 가능하다. 기본적인 정렬 순서는 작은 값에서 큰 값으로 정렬되는 오름 차순이다.

컴퍼러블 인터페이스 메소드
메소드 설명
int compareTo(T o) 해당 객체와 전달된 객체의 순서를 비교함.

컴퍼레이터(Comparator) 인터페이스[9]

컴퍼레이터 인터페이스는 컴퍼러블 인터페이스와 같이 객체를 정렬하는 데 사용되는 인터페이스 이다. 컴퍼러블 인터페이스를 구현한 클래스는 기본적으로 오름차순으로 정렬되는 반면 컴퍼레이터 인터페이스는 내림차순이나 아니면 다른 기준으로 정렬하고 싶을 때 사용한다. 즉, 컴퍼레이터 인터페이스를 구현하면 오름차순 이외의 기준으로도 정렬할 수 있게된다. 이때 컴퍼레이터 인터페이스를 구현한 클래스에서는 compare() 메소드를 재정의하여 사용하게 된다.

컴퍼레이터 인터페이스 메소드
메소드 설명
int compare(T o1, T o2) 전달된 두 객체의 순서를 비교함.
boolean equals(Object obj) 해당 comparator와 전달된 객체가 같은지를 확인함.
default Comparator<T> reversed() 해당 comparator의 역순인 comparator를 반환함.


각주

  1. 1.0 1.1 1.2 TCP SCHOOL, <컬렉션 프레임워크의 개념>, <<TCP SCHOOL>>
  2. JEONG_AMATEUR, <JAVA 컬렉션 (Vector, ArrayList, LinkedList, Set, Map)>, <<개인 블로그>>, 2017-11-02
  3. 3.0 3.1 3.2 3.3 개발새발!, <자바 컬렉션 프레임워크(Java Collection Framework) 정리>, <<개인 블로그>>, 2018-06-28
  4. TCP SCHOOL, <List 컬렉션 클래스>, <<TCP SCHOOL>>
  5. TCP SCHOOL, <Set 컬렉션 클래스>, <<TCP SCHOOL>>
  6. TCP SCHOOL, <Stack과 Queue>, <<TCP SCHOOL>>
  7. 7.0 7.1 TCP SCHOOL, <Map 컬렉션 클래스>, <<TCP SCHOOL>>
  8. 8.0 8.1 TCP SCHOOL, <Iterator와 ListIterator>, <<TCP SCHOOL>>
  9. 9.0 9.1 TCP SCHOOL, <Comparable과 Comparator>, <<TCP SCHOOL>>

참고자료

같이 보기


  검수요청.png검수요청.png 이 자바 컬렉션 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.