■ 자바는 자료 구조를 제공한다.
자료 구조는 배열과 같이 데이터를 담아 놓고 필요할 때 꺼내어 사용하기 위해서 존재하며 다음과 같이 분류할 수 있다.
- 순서가 있는 목록형(List) [ArrayList, LinkedList]
- 순서가 중요하지 않은 셋형(Set) [HashSet, TreeSet, LinkedHashSet]
- 먼저 들어온 것이 먼저 나가는 큐형(Queue) [LinkedList, PriorityQueue]
- 키-값(key-value)으로 저장되는 맵형(Map) [HashMap, TreeMap, LinkedHashMap
■ java.util.Collection
- List, Set, Queue 타입 구현의 모태가 되는 인터페이스 [ Map 타입 구현은 포함되지 않는다. ]
- Iterable 인터페이스가 확장되어 있다.
- add(), addAll() : 데이터 담기용 메소드
- contains(), containsAll(), isempty(), equals(), size() : 데이터 확인용 메소드
- clear(), remove(), removeAll() : 데이터 삭제용 메소드
■ List 인터페이스는 목록을 저장할 때 사용한다. [크기가 변하는 배열이라고 생각하면 이해하기 쉬움 ]
List 인터페이스
- 각 데이터에 대한 위치가 있다.
- 위치에 있는 데이터를 꺼내거나 지우고, 원하는 위치에 데이터를 저장하는 작업을 할 수 있다.
- 특정 데이터의 중복을 허용한다.
- 순서대로 들어오는 데이터를 담아 둘 때 용이하다.
- Collection 인터페이스를 확장하였다.
- List 인터페이스를 구현한 클래스로는 AbstractList, AbstractSequentialList, ArrayList, AttributeList, CopyOnwriteArrayList, LinkedList, RoleList, RoleUnresolvedList, Stack, Vector가 있으며, 이 중에서 ArrayList, LinkedList가 많이 사용된다.
ArrayList는 아주 많이 사용되기 때문에, 자유 자재로 사용할 수 있도록 필요한 메소드들은 꼭 기억해두자.
List 인터페이스와 그 인터페이스를 구현하고 Vector 클래스를 상속받은 Stack 클래스는 마지막에 추가한 데이터를 먼저 빼는 LIFO(후입선출) 구조가 필요할 때 사용하면 편하니 기억해두자. [ ArrayDeque는 성능 빠르고 쓰레드에는 안전하지 못하는 LIFO 기능제공 / Stack은 성능 느리고 쓰레드에는 안전한 LIFO 기능 ]
■ Collection-Set 인터페이스
Set은 List와 비슷하다. 하지만 데이터의 순서가 중요하지 않다.
Set 인터페이스
- 데이터를 목록 형태로 담아둔다.
- 데이터의 위치는 정해져 있지 않으며, 중복된 데이터가 포함될 수 없다.
- 중복되는 데이터를 없애고, 유일한 값만을 뽑아 내려고 할 때 용이하다.
- contains() 메소드를 사용하여 데이터가 포함되어 있는지를 확인할 때 유용하다.
- Collection 인터페이스를 확장하였다.
- Set 인터페이스를 구현한 클래스로는 AbstractSet, ConcurrentSkipListSet, CopyOnWriteArrySet, EnumSet, HashSet, JobStateReasons, LinkedHashSet, TreeSet이 있으며, HashSet이나 TreeSet이 많이 사용된다.
Set은 주로 중복되는 데이터를 처리하기 위해서 사용된다.[ HasSet, TreeSet 많이 사용 ]
■ Collection-Queue 인터페이스
Queue는 데이터를 순차적으로 처리하기 위한 인터페이스다.
Queue 인터페이스
- FIFO(First In First Out, 선입선출) 구조로 되어 있어, 먼저 들어온 데이터를 처리하기 위해서 꺼내면, 그 뒤에 있던 두 번째 데이터가 맨 앞에 존재하게 된다.
- 데이터가 들어온 순서대로 빨리 처리할 때 용이하다.
- Collection 인터페이스를 확장하였다. 하지만, Collection에 선언된 add(), remove(), element() 메소드를 사용하는 것은 권장하지 않는다.
- offer() : 데이터를 저장할 때 사용
- poll() : 가장 앞에 있는 데이터를 꺼내고, 지운다.
- peek() : 가장 앞에 있는 데이터를 꺼내기만 하고, 지우지는 않는다.
- Queue() 인터페이스를 구현한 클래스로는 AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQeue, LinkedBlockingDeque, LinkedBlockingQueue, LinkedList, PriorityBLockingQueue, PriorityQueue, SynchronousQueue 등이 있으며, 보통 LinkedList가 많이 사용된다.
Queue[LinkedList 많이 사용]는 먼저 들어온 데이터틀 먼저 처리해주는 FIFO 기능(선입선출)을 처리하기 위해 사용된다.
[ 특히, Queue는 여러 쓰레드에서 들어오는 작업을 순차적으로 처리할 때 많이 사용된다. ]
LinkedList[Queue 구조]는 일반적인 배열 타입의 클래스와 다르게 생성자로 객체를 생성할 때 처음부터 크기를 지정하지 않는다. 왜냐하면, 각 데이터들이 앞 뒤로 연결되는 구조(쉽게, 열차구조)이기 때문에, 미리 공간을 만들어 놓을 필요가 없는것이다.
[ 사실 LinkedList는 List 인터페이스뿐만 아니라 Queue와 Deque 인터페이스도 구현하고 있다. ]
■ collection-Map 인터페이스
Map은 중복되지 않는 키(key)와 그 키와 연결되어 있는 값(value)이 쌍으로 묶여 있는 자료 구조이다.
==> 따라서 Collection 인터페이스를 확장하지 않았다.
Map 인터페이스
- key-value 쌍으로 데이터를 관리한다.
- key는 중복되어서는 안되며, value는 key만 다르다면 중복되어도 상관없다.
- Map은 키로 식별할 수 있는 데이터를 담아두고, 데이터의 위치와 상관 없이 키 만으로 쉽게 꺼낼 필요가 있을 때 용이하다.
- put() : 키와 값으로 데이터를 저장할 때 사용한다.
- get() : 키로 데이터를 꺼낼 때 사용한다.
- Map 인터페이스는 부모 인터페이스가 존재하지 않는다.
- Map 인터페이스를 구현한 클래스로는 AbstractMap, Attributes, AuthProvider, ConcurrentHashMap, LinkedHashMap, PrinterStateReasons, Properties, Provider, RenderingHints, SimpleBindings, TabularDataSupport, TreeMap, UIDefaults, WeakHashMap가 있으며, 이 중에서 HashMap, Hashtable, TreeMap을 많이 사용한다.
■ 간단하게 정리 ■
- 배열처럼 목록을 처리하기 위한 List의 대표적인 클래스로는 ArrayList와 LinkedList가 있으며, 보통은 ArrayList를 많이 사용한다.
- List처럼 목록을 처리하기는 하지만, 데이터의 중복이 없고, 순서가 필요 없는 Set의 대표적인 클래스는 HashSet, TreeSet, LinkedHashSet이 있다.
- 데이터가 들어온 순서대로 처리하기 위해서 사용하는 Queue의 대표적인 클래스는 LinkedList와 PriorityQueue 등이 있으며, LinkedList는 List에도 속하고 Queue에도 속하는 특이한 클래스이다.
- Map의 대표적인 클래스에는 HashMap, TreeMap, LinkedHashiMap이 있으며, 사용 용도에 따라 다르겠지만, 대부분 HashMap을 많이 사용한다. Map의 "키"목록은 keySet()메소드를 사용하면 Set 타입의 데이터를 얻을 수 있고, "값"목록은 values()메소드를 통하여 collection타입의 데이터를 얻을 수 있다.
- Collection의 데이터를 처리하기 위해서는 for루프를 사용할 수 있지만, iterator() 메소드를 통하여 Iterator 객체를 얻어 각 데이터를 처리할 수도 있다.