본문 바로가기

Java/Theory

Chapter 6. Collection Framework

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