[210112] java collection
Collection Framework
컬렉션 프레임워크(Collection Framework)
컬렉션 프레임워크는 오브젝트의 집합을 구현하며, 다른 클래스를 저장하는 목적으로 사용된다. interface를 통해서 제공된다.
컬렉션 프레임워크를 사용했을 때의 장점
먼저, 자바에서 제공하는 자료구조와 알고리즘을 그대로 사용할 수 있으므로 직접 프로그래밍을 할 필요가 줄어든다. 컬렉션 프레임워크에서 제공하는 자료구조나 알고리즘은 높은 수준으로 구현되어 있다. 그리고, 다형성을 통해 인터페이스를 바꿔서 상속하면서 각각의 인터페이스에 대한 다양한 구현을 할 수 있다. 기본 인터페이스를 베이스로 한 재사용도 가능하다.
컬렉션 프레임워크는 다음을 포함한다.
- Collection interface: set, list, map같은 다른 차입의 collection을 묘사한다.
- General-purpose implementations(일반적 목적의 구현) : collection 인터페이스에 대한 주 구현 제공
- Legacy implementations : vector나 hashtable 같은 출시가 빨랐던 collection class에 대해서 collection 인터페이스를 새로 장착하였다.
- Special-purpose implementations(특수한 목적 구현) : 구현은 특수한 상횡의 사용에 대해 설계되어 있다. 구현들은 기본적이지 않은 수행 특징, 사용 제한, 혹은 행동을 제공한다.
- Concurrent implementations(공존하는 구현) : 구현은 공통적인 사용을 위해 설계된다.
- Wrapper implementations(래퍼 구현) : 동기화나 다른 구현 같은 기능을 추가한다.
- Abstract implementations(추상 구현) : custom 구현을 가능하게 하기 위해서 collection interface를 불완전하게 구현한다.
- Algorithms : list 정렬과 같은, collection에 관한 유용한 기능을 수행하는 정적 메소드
- Infrastructure (기초 시설) : collection 인터페이스에 대해 필수적인 지원을 제공하는 인터페이스
- Array Utilities (배열 유틸리티) : 원시적인 타입과 참조 객체의 배열에 대한 유틸리티 함수. 엄밀히 말하자면, collection framework의 일부분이 아니라, collection framework와 의존하는 몇몇 같은 기초시설과 동시에 자바 플랫폼에서 추가된 기능이다.
Collection Interfaces
collection interface는 2개의 그룹으로 나눠진다. 가장 대중적인 인터페이스는 java.util.Collection으로, 인터페이스를 상속받는 자식은 아래와 같다.
- java.util.Set
- java.util.SortedSet
- java.util.NavigableSet
- java.util.Queue
- java.util.concurrent.BlockingQueue
- java.util.concurrent.TransferQueue
- java.util.Deque
- java.util.concurrent.BlockingDeque
다른 collection interface는 java.util.Map을 기초로 한다. Map은 엄밀히 말하면 collection이 아니다. 하지만, 이 인터페이스도 collection을 조절할 수 있게 해주는 collection-view operations를 포함하고 있다. Map의 자식은 아래와 같다.
- java.util.SortedMap
- java.util.NavigableMap
- java.util.concurrent.ConcurrentMap
- java.util.concurrent.ConcurrentNavigateMap
Collection Framework에 관련된 용어
설명 | O | X |
Collection 수정 메소드(add, remove, clear 등)를 호출할 수 있는가? | modifiable | unmodifiable |
생성 후에 Collection object의 상태 변경이 가능한가? | mutable | immutable |
리스트의 요소가 변경될 때 크기도 변경되는가? | variable-size list | fixed-size list |
리스트가 인덱싱을 지원하는가? | random access list | sequential access list |
Collection 구현
interface | Hash Table | Resizale Array | Balanced Tree | Linked List | HashTable + LinkedList |
Set | HashSet | TreeSet | LinkedHashSet | ||
List | ArrayList | LinkedList | |||
Deque | ArrayDeque | LinkedList | |||
Map | HashMap | TreeMap | LinkedHashMap |
collection은 크게 list, set, map으로 나눌 수 있다.
List : 순서가 있는 컬렉션이며 중복 값을 저장할 수 있다.
- ArrayList : 주로 쓰이는 리스트로 기본적인 성능을 보장한다.
- LinkedList : linked list를 사용해서 요소를 저장한다. ArrayList와 비교했을 때 저장, 삭제가 빠르지만 검색이 느리다.
- Vector : 컬렉션 프레임워크가 나오기 전에 사용하던 List interface이다.
Set : 중복 값을 저장하지 않는 컬렉션이다.
- HashSet : hash table에 요소를 저장한다.
- TreeSet : 레드-블랙 트리 구조로 요소를 저장한다. 값을 기준으로 정렬이 되어서 저장되므로 HashSet보다 느리다.
- LinkedHashSet : linked list와 함께 hash table을 구현한 것으로 삽입 순서에 따라 요소를 저장한다.
Map : key-value 구조로 오브젝트를 저장하는 컬렉션이다. 중복 key를 저장하지 않는다. HashMap, TreeMap, LinkedHashMap이 있으며 상세 사항은 Set과 유사하다.
- 참고자료
docs.oracle.com/javase/8/docs/technotes/guides/collections/index.html
docs.oracle.com/javase/tutorial/collections/interfaces/index.html
en.wikiversity.org/wiki/Java_Collections_Overview
www.tcpschool.com/java/java_collectionFramework_list
www.codejava.net/java-core/collections/overview-of-java-collections-framework-api-uml-diagram