Chapter 6. Collection Framework
1. Collection Framework
- Data Group(Collection)을 표준화된 Programming 방식(Framework)을 제공하는 여러 Class
- Collection을 다루는데 필요한 다양한 Class를 제공해 Programmer에게 편의를 제공한다.
- Interface와 다형성을 이용한 객체 지향적 설계를 통해 표준화되어 있어 편리하고 재사용성이 높은 Code를 작성할 수 있게 해준다.
- Collection Class Relations
· ArrayList
◦ 배열기반
◦ Data의 추가와 삭제에 불리
◦ 순차적인 추가삭제는 제일 빠름
· LinkedList
◦ 연결기반
◦ Data의 추가와 삭제에 유리
◦ 임의의 요소에 대한 접근성이 좋지 않음
· HashMap
◦ 배열과 연결이 결합된 형태
◦ 추가, 삭제, 검색, 접근성이 뛰어남
◦ 검색에는 최고 성능이 보임
· TreeMap
◦ 연결기반
◦ 정렬과 검색(특히 범위검색)에 적합
◦ 검색 성능은 HashMap보다 떨어짐
· Stack
◦ Vector를 상속받아 구현
· Queue
◦ LinkedList가 Queue Interface를 구현
· Properties
◦ Hashtable을 상속받아 구현
· HashSet
◦ HashMap을 이용해서 구현
· TreeSet
◦ TreeMap을 이용해서 구현
· LinkedHashMap & LinkedHashSet
◦ HashMap과 HashSet에 저장순서 유지기능을 추가
2. Collection Framework's Interfaces
- Collection Framework’s Core Interface
· Collection Framework는 List, Set, Map Interface로 이루어진다.
· List Interface와 Set Interface가 공통된 부분이 많아 Collection이라는 부모 Class를 상속받아 공통된 부분을 처리한다.
· 설명
◦ List
▹ 순서가 있는 Data group
▹ Data 중복 허용
▹ Class
▸ ArrayList
▸ LinkedList
▸ Stack, Vector
◦ Set
▹ 순서가 없는 Data group
▹ Data 중폭 불가
▹ Class
▸ HashSet
▸ TreeSet
◦ Map
▹ Key, Value를 쌍으로 이루는 Data의 Data 집합
▹ 순서는 유지되지 않으며 Key 중복은 허용 불가, Value는 중복 허용한다.
▹ Class
▸ HashMap
▸ TreeMap
▸ Hashtable
▸ Properties
- Interfaces
· Collection Interface
◦ Collection Class에 저장된 Data를 읽고 추가하고 삭제하는 등 Collection을 다루는데 가장 기본적인 Method를 정의해 제공한다.
· List Interface
◦ 중복을 허용하면서 저장 순서가 유지되는 Collection Class를 구현하는데 사용하는 Interface
· Set Interface
◦ 중복을 허용하지 않고 저장 순서가 유지되지 않는 Collection Class를 구현하는데 사용하는 Interface
◦ 대표구현 Class
▹ HashSet
▹ TreeSet
· Map Interface
◦ Key와 Value를 한쌍으로 묶어 저장하는 Collection Class를 구현하는데 사용하는 Interface
◦ 대표 구현 Class
▹ Hashtable
▹ HashMap
▹ LinkedHashMap
▹ SortedMap
▹ TreeMap
· Map.Entry Interface
◦ Map Interface의 내부 Interface로 Map에 저장되는 Key-Value 쌍을 다루기위해 내부적으로 Entry Interface를 정의해 놓았다.
- 동기화(Synchronization)
· Multi-Thread Programming에서는 하나의 객체를 여러 Thread가 동시에 접근할 수 있어 Data의 일관성(Consistency)을 유지하기 위해서는 동기화(Synchronization)가 필요하다.
· Vector와 Hashtable은 자체적으로 동기화 처리가 되어있어 Multi-Thread Programming이 아닌 경우에는 불필요한 기능이 되어 성능을 떨어뜨릴 수 있다.
· ArrayList와 HashMap은 동기화를 자체적으로 처리하지않고 필요한 경우에만 java.util.Collections Class의 동기화 Method를 이용해 동기화 처리가 가능하도록 되어있다.
- Collection 내부의 Data Structure
· Vector & ArrayList
◦ List Interface를 구현하는 Class로 두 Class 모두 Data 저장순서가 유지되고 중복을 허용한다.
◦ 두 Class는 동기화 기능 외에는 구현원리와 기능적인 측면에서 동일하다.
◦ 특징
▹ 공통점
▸ List Interface를 구현하며 저장순서가 유지되고 중복을 허용한다.
▸ Data의 저장 공간으로 배열을 사용
▸ Object 배열을 이용해 Data를 순차적으로 저장
▹ 차이점
▸ Vector : Multi-Thread Programming에 동기화
▸ ArrayList : Multi-Thread Programming에 동기화되어 있지 않음
· LinkedList
◦ 배열의 단점을 보완하기 위해 고안된 자료구조
◦ 배열의 특징
▹ 크기를 변경할 수 없어 크기를 바꾸기 위해서는 새로운 배열을 생성해 데이터를 옮겨야 한다.
▹ 실행 속도를 향상시키기 위해서는 충분히 큰 크기의 배열을 생성해야해 Memory가 낭비된다.
▹ 차례대로 데이터를 추가하고 마지막에서부터 Data를 삭제하는 것은 빠르다.
▹ 배열의 중간에 Data를 추가하기 위해서는 빈 자리를 만들기위해 다른 Data의 위치를 옮겨야 한다.
◦ 배열과 LinkedList 비교
▹ ArrayList는 읽는 시간을 빠르지만 추가/삭제가 느리며 Memory 사용이 비효율적이다.
▹ LinkedList는 각각의 객체마다 주소로 읽어 읽는 시간은 느리지만 추가/삭제가 빠르며 Memory 사용이 효율적이지만 Data가 많을수록 접근성이 떨어진다.
▹ 순차적으로 추가/삭제하는 경우 ArrayList가 LinkedList보다 빠르다.
▹ 중간에 Data를 추가/삭제하는 경우 LinkedList가 ArrayList보다 빠르다.
· Stack & Queue
◦ Stack : LIFO(Last In First Out) 구조로 마지막에 저장된 Data를 가장 먼저 꺼내는 구조
◦ Queue : FIFO(First In First Out) 구조로 처음에 저장한 Data를 가장 먼저 꺼내는 구조
◦ 활용
▹ Stack : 수식계산, 수식괄호검사, Wordprocessor의 undo/redo, Web Brower의 뒤로/앞으로
▹ Queue : 최근 사용 문서, 인쇄작업 대기목록, Buffer
- Collection of Internal Data Access Interface
· Iterator
◦ Collection Framework에서 Collection에 저장된 각 요소에 접근하는 기능을 가지도록 구현된 Interface
◦ Collection Interface에 Iterator를 반환하는 iterator() Method가 정의 되어 있어 Collection의 자식 Interface인 Set과 List에서도 사용가능하다.
◦ Collection에서는 Interator를 이용해 Collection의 요소를 읽어오는 방법을 표준화 했으며 그로 인해 Code의 재사용성을 높이는 것이 가능해졌다.
◦ 주로 반복문(while)을 통해 Collection Class의 요소들을 읽어온다.
◦ next() Method를 통해 단방향으로만 이동가능하다.
◦ Map Interface의 경우
▹ Map Interface와 자식 Class의 경우 Value와 Key를 같이 저장하기 때문에 keySet(), entrySet() Method를 통해 저장해야한다.
▹ Example
1 2 3 4 | Set eSet = map.entrySet(); Iterator list1 = eSet.iterator(); Set kSet = map.keySet(); Iterator list2 = kSet.iterator(); | cs |
· Enumeration
◦ Collection Framework가 등장하기 전 Iterator 대신에 사용되어 왔던 Interface
◦ 이전 Version의 호환성을 남겨두고 있으며 Enumeration보다는 Iterator를 사용하는 것이 좋다.
· ListIterator
◦ Iterator를 상속받아서 기능을 추가한 Interface로 Iterator과 다르게 양방향 이동으로 이동할 수 있다.
◦ List Interace를 구현한 Collection에서만 사용 가능하다.
- HashSet
· Set Interface를 구현한 가장 대표적인 Collection Class로 중복된 요소를 저장하지 않는다.
· HashSet은 저장 순서를 유지 하지 않으며 저장 순서를 유지하고자 한다면 LinkedHashSet을 사용해야한다.
· HashSet은 내부적으로 HashMap을 이용해서 만들어 졌으며 Hashing 기술을 이용해 구현되어 있다.
· HashSet의 hashCode Method Overriding 조건
◦ 실행중인 Application 내의 동일한 객체에 대해서 여러 번 hashCode()를 호출해도 동일한 int값을 반환해야 한다.
◦ equals Method를 이용한 비교에 의해 true를 얻은 두 객체에 대해 각각 hashCode()를 호출해서 얻은 결과가 같아야 한다.
◦ equals Method를 호출했을 때 false를 반환하는 두 객체는 hashCode() 호출에 대해 같은 int 값을 반환하는 경우가 있어도 되지만 Hashing을 사용하는 Collection 성능을 향상시키기 위해서는 다른 int 값을 반환하는 것이 좋다.
- TreeSet
· Binary Search Tree라는 자료구조의 형태로 Data를 저장하는 Collection Class
· Set Interface를 구현했기 때문에 중복된 Data의 저장을 허용하지 않으며 정렬된 위치에 저장되므로 저장순서를 유지하지 않는다.
· Binary Search Tree
◦ 모든 노드는 최대 두 개의 자식 Node를 가질 수 있다.
◦ 왼쪽 자식 Node의 값은 부모 Node의 값보다 작고 오른쪽 자식노드의 값은 부모 Node의 값보다 커야한다.
◦ Node의 추가 삭제에 시간이 걸린다.
◦ 검색과 정렬에 유리하다.
- Comparator & Comparable
· 객체들을 정렬 또는 Binary Search Tree를 구성하는데 필요한 Method를 정의하고 있는 Interface
· Comparable
1 2 3 4 | public interface Comparator { int compare(Object o1, Object o2); boolean equals(Object obj); } | cs |
◦ 기본 정렬기준으로 구현하는데 사용
· Comparator
1 2 3 | public interface Comparable { public int compareTo(Object o); } | cs |
◦ 기본 정렬기준 외에 다른 기준으로 정렬하고자할 때 사용
- HashMap
· Map Interface를 구현하며 Key와 Value를 묶어서 하나의 Entry로 저장하고 Hashing 기능을 사용해 많은 양의 Data를 검색하는데 용이하다.
· 내부에 Inner Class인 Entry를 구성하고 있으며 해당 Entry를 배열로서 구현하고 있다.
· 기능면에서는 Hashtable과 같으나 Hashtable은 Multi-Thread Programming에 동기화되어 있고 HashMap은 Multi-Thread Programming에 동기화되어 있지 않다.
· Data 조건
◦ Key : Collection 내의 Key 중에서 유일해야 한다.
◦ Value : Key와 달리 Data의 중복을 허용
- TreeMap
· Binary Search Tree의 형태로 Key와 Value의 쌍으로 이루어진 Data 저장
· 검색과 정렬에 적합한 Collection Class
- Properties
· Application의 환경설정과 관련된 속성을 저장하는데 사용되며 Data를 FIle로부터 읽고 쓰는 편리한 기능을 제공
· Properties Class를 활용하면 간단한 입출력을 몇 줄의 Code로 쉽게 해결할 수 있다.
'Java > Theory' 카테고리의 다른 글
Chapter 8. Useful Classes II (0) | 2015.08.19 |
---|---|
Chapter 7. Useful Classes I (0) | 2015.08.19 |
Chapter 5. Inner Class (0) | 2015.08.19 |
Chapter 4. java.lang Package (0) | 2015.08.19 |
Chapter 3. Exception Handling (0) | 2015.08.19 |