Collection Framework

|

 Collection Framework

 Program을 구현할 때 가장 빈번하게 사용되는 항목중의 하나인 Collection객체는 같은 유형 객체 또는 서로 다른 유형의 객체를 저장 할 수 있는 자료구조를 말한다.

 

  1. Collection의 특징

    • Collection의 자료구조의 크기는 가변적이다. 저장한 만큼 자동으로 크기가 증가한다.
      배열의 경우 최초에 할당한 크기만큼의 자료를 저장할 수 있지만 Collection 객체의 경우 최초 크기를 할당할 필요가 없다.
    • 배열의 단점을 보완한다
      배열의 단점 : 데이터 저장을 위한 크기를 최초에 할당하므로 할당된 크기 이상의 데이터를 저장할 수 없으며, 할당된 크기보다 저장되는 데이터가 적은 경우 메모리 낭비를 초래한다. 또한, 같은 유형의 기본 자료형이나 같은 유형의 참조 자료형 만을 저장할 수 있다.
    • 기본 자료형 자체를 Collection에 저장할 수는 없으므로 기본 자료형을 관리하는 Wrapper 클래스 계열의 객체로 바꾸어 저장한다

       

  2. Collection을 관리하는 Interface 및 Class

    Collection과 관련한 Interface 및 Class는 java.util Package에 존재한다.

    다음에 나오는 내용은 Collection을 관리하는 Interface 및 Class를 정의한 것이다. (Collection과 관련한 내용의 Class Diagram은 jcf.pdf 참조)

    Collec1.gif

     위의 그림에서 보는 것과 같이 Java에서 제공하는 Collection Interface는 크게 Collection과 Map으로 구성되어 있으며 Collection은 다시 Set과 List로 구분되어져 있다.

    또한, 아래 Class Diagram 에서 볼 수 있듯이 Collection 인터페이스를 구현한 클래스들과 연계해서 편리하게 저장된 요소(Element)들을 다룰 수 있는 2가지 인터페이스가 있다.
    Collec2.gif

    • Collection Interface 관련 Class
      - List : 순서가 있는 데이터의 집합,  중복이 가능하다.          ex) ArrayList, LinkedList, Stack, Vector
      - Set  : 순서가 없는 데이터의 집합, 중복이 불가능하다.        ex) HashSet, TreeSet
      - Map : Key와 Value의 pair로 이루어진 데이터의 집합         ex) HashMap,HashTable, TreeMap, Properties
    • Map 의 특징
      - List, Set과는 달리 Map의 경우 저장되는 객체의 순서가 지정되지 않는다.
      - Key의 경우 중복이 허용되지 않는다. Key를 중복하여 지정하는 경우 마지막에 입력된 객체 값을 가진다.
      - Value는 중복을 허용한다.
      - 일반적으로 Collection 객체를 이용하여 검색을 하는 경우에는 Map을 많이 사용한다.
  3. Collection 구현 Class

    • Vector와 ArrayList
      - 일반적으로 Program 구현시 Collection Framework를 사용하는 경우 가장 많이 사용하는 Collection 객체이다. Vector와 ArrayList의  
        경우 Object 배열을 이용해서 데이터를 순차적으로 저장한다.
        Vector와 ArrayList의 경우 순서가 있고 중복이 가능한 List 인터페이스를 구현한다는 공통점을 가지고 있으며, Vector는 멀티쓰레드에
        동기화 되어 있으나, ArrayList는 그렇지 않다는 차이점을 가지고 있다
      - ArrayList의 경우 비효율적인 메모리 사용의 경우가 있다.
    • LinkedList
      - 배열은 크기를 변경할 수 없고, 비순차적 데이터 추가, 삭제에 시간이 많이 걸린다.
        이런 단점을 보완하기 위해 LinkedList가 고안되었다. LinkedList의 각 Node들은 다음 Node에 대한 참조와 데이터로 구성되어 있다.
      - LinkedList는 ArrayList에 비하여 접근시간(Read Time)은 느리나 Object의 추가, 삭제는 ArrayList에 비하여 빠른 속도를 보인다.
        그러나, 데이터가 많을수록 접근성이 떨어지는 단점을 가진다.
    •  Stack과 Queue
      - Stack - Last In First Out(LIFO)
      - Queue - First In First Out(FIFO
      - 자바에서는 스택을 Stack클래스로 구현하여 제공하고 있지만, 큐는 Queue 인터페이스로만 정의해 놓고 클래스를 제공하지 않았다.
        대신 Queue 인퍼페이스를 구현한 클래스를 사용하면 된다.
      - 사용예
      Stack st = new Stack();
      Queue q = new LinkedList();
      /* 추가 */
      st.push("0");
      st.push("1");
      q.offer("0");
      q.offer("1");
      /* 삭제 */
      st.pop(); // 맨 위에 저장된 객체를 꺼낸다.
      q.poll();      // queue에서 꺼내온다. 비어있으면 null
      q.remove(); // queue에서 꺼내온다. 비어있으면 예외발생
      /* 맨 위에 저장된 객체반환 */
      st.peek();
      q.peek();   // stack과 queue가 모두 동일하다.
    • Enumeration, Iterator
      - Enumeration와 Iterator 모두 컬렉션에 저장된 요소를 접근하는데 사용하는 인터페이스
      - 사용예
      List list = new ArrayList();
      Iterator it = list.iterator();
      while(it.hasNext()){
         System.out.println(it.next());
      }
    • HashSet
      - Set 인터페이스를 구현한 가장 대표적인 컬렉션이다. 순서는 없지만 중복을 허용하지 않는다.
        저장순서를 유지하고자 한다면 LinkedHashSet을 사용해야 한다.
      - 사용예
      Set set = new HashSet();
      set.add("abc");
    • HashTable과 HashMap
      - HashMap과 HashTable 모두 Map 인터페이스를 구현한 Collection Class이다. 일반적인 사용방법은 둘 모두 동일한 방법으
        로 구현할 수 있다. HashMap과 HashTable의 차이점은 HashMap은 HashMap 이 unsynchronized 하고 null 값을 허용
        한다는 차이점이 있다.
      - 일반적으로 Multi Thread 환경이 아닌 경우에는 HashTable 보다는 새로운 버전인 HashMap을 사용할 것을 권한다.
      - 멀티스레드 환경이 필요한 경우에는 HashTable을 사용하여야 한다.
      - Map은 다음과 같은 특징을 가진다.
        . 키(key)와 값(value)을 묶어서 하나의 데이터로 저장한다는 특징을 갖는다.
        . 키 - 키는 유일해야 한다.
        . 값 - 데이터의 중복을 허용한다.
      - 사용방법
      HashMap map = new HashMap();
      map.put(KEY, VALUE);      // 추가
      map.remove(KEY);          // 삭제

       

  4. 자주 사용되는 컬렉션 객체들의 퍼포먼스 표

    • Set 객체
      - HashSet : 동기화 안됨. 가장 빠른 집합. HashMap 보다 느리지만 Set 인터페이스를 구현하고 있다. HashMap 은 Set 이
                  아니라 Map 이다.
      - TreeSet : 동기화 안됨. HashSet보다 느리다. 차례대로 키를 사용할 수 있다. (키가 정렬됨)  
    • Map 객체
      - HashMap : 동기화 안됨.  가장 빠른 매핑.
      - Hashtable : 동기화 됨.  HashMap 보다 느리지만 동기화한 HashMap 보다 빠르다.
      - TreeMap : 동기화 안됨.  Hashtable 과 HashMap 보다 느리다. 차례대로 키를 사용할 수 있다. (키가 정렬됨)
    • List 객체
      - ArrayList : 동기화 안됨.  가장 빠른 리스트.
      - LinkedList : 동기화 안됨.  다른 리스트보다 느리지만 큐로 이용했을 경우 더 빠를 수도 있다. 느린 이유는 ArrayList나
                     Vector, Stack 과 달리 array 계열이 아니기 때문.
      - Vector : 동기화 됨.  ArrayList 보다 느리지만 동기화한 ArrayList 보다 빠르다.
      - Stack : 동기화 됨.  Vector 와 동일한 속도. LIFO 큐 기능을 제공한다.

       

  5. 참고자료

    jcf.pdf

    JavaCollectionsFramework.pdf

'Document' 카테고리의 다른 글

자바에서 예외처리  (0) 2008.07.17
Java Collection 중 자주 사용하는 것  (0) 2008.07.15
List, Map,Set  (0) 2008.07.15
Spring Framework Document  (0) 2008.07.14
Substance look&feel 사용법  (0) 2008.07.14
And