본문 바로가기

JAVA/Collection

Collection 이란?

자바에서 컬렉션 프레임워크(collection framework)란 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합을 의미합니다

즉, 데이터를 저장하는 자료 구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것입니다.

 

Collection Framework 계층 구조

 

Collection 상세, 상속 구조

  • java.util.Collection 인터페이스 그룹
    1. java.util.List : List 자료 구조 ( ordered, sequential )
    2. java.util.Set : Set 자료 구조 ( unique element )
    3. java.util.SortedSet : 정렬된 set
    4. java.util.NavigableSet
    5. java.util.Queue : Queue 자료 구조 (한쪽에서 삽입, 반대에서 추출)
    6. java.util.Deque : Deque 자료 구조 (FIFO , FILO 모두 지원)
  • java.util.Map 인터페이스 그룹
    1. java.util.SortedMap : key ascending order로 정렬된 map
    2. java.util.NavigableMap
  • Collection의 클래스들
    1. ArrayList : 동적 리스트
    2. LinkedList : 연결 리스트
    3. ArrayDeque : 동적 리스트를 이용한 Deque 구현
    4. TreeSet : Tree 구조로 set 구현
    5. HashSet : Hash table
    6. LinkedHashSet : 삽입 순서로 iteration 될 수 있는 HashSet
    7. TreeMap : Tree를 사용하여 Map 구현
    8. HashMap : Hash table을 이용해 Map 구현
    9. LinkedHashMap : 삽입 순서로 iteration 될 수 있는 HashMap

[자료 구조 관점] 

: 계층 구조가 아닌 자료 구조 관점에서 Collection Framework가 제공하는 자료구조는 크게 4가지로 구분한다.

  • List : 순서가 있는 자료구조
  • Set : 순서가 없고 중복이 없는 집합 자료구조(Set)
  • Map : 검색이 용이하도록 key/value 쌍으로 저장하는 자료구조
  • Sorted : 정렬이 되어서 저장하는 특수한 자료구조

각 자료 구조에 대해 살펴보면

[List]

: 객체를 인덱스로 관리하고 저장시 자동 인덱스가 부여된다. 인덱스로 다양한 기능 수행

 

  • 함수

  • ArrayList
    • 가변적인 리스트를 인덱스로 관리한다.
  • Vertor
    • ArrayList와 동일 구조, 저장할 객체 타입을 파라미터로 표기하고 기본 생성자를 호출한다.
    • Vector는 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 실행 할 수 없다.
  • LinkedList
    • 인덱스로 관리하지 않고 인접 참조를 링크해서 체인처럼 관리한다.
    • 데이터가 삭제됫을때 ArrayList같은 경우 모든 인덱스가 변해야 하지만 LinkedList는 앞 뒤 링크만 변경된다 따라서 빈번한 객체 삽입과 삭제가 일어나는 곳에서 좋은 성능을 발휘한다.

[Set]

: 저장 순서를 보장하지 않음, 중복 저장 불가, 하나의 null 만 저장가능

  • 함수

  • HashSet
    • 객체들은 순서를 보장하지 않고 중복 저장하지 않는다. 
    • 동일한 객체란 같은 인스턴스가 아니라 hashCode가 같은 것을 의미
    • HashSet에 저장하는 경우 같은 문자열을 갖는 객체는 동등한 객체로 간주되는데 hashCode()의 리턴 값을 같게, equals()의 리턴 값은 true가 나오게 만들었다.
  • LinkedHashSet
    • 중복된 데이터를 저장할 수 없다. 입력된 순서대로 데이터를 관리한다.
  • TreeSet
    • 이진 트리를 기반으로 한 컬렉션이다.
    • TreeSet에 객체를 저장하면 자동으로 정렬되는데 부모 값과 비교하여 낮은 것은 왼쪽 자식 노드, 큰 것은 오른쪽 자식 노드에 저장된다.
    • 문자열을 찾을 때 NavigableSet<E> set = treeSet.subSet(E 시작객체,boolean 시작 객체의 포함여부, E 끝 객체, Boolean 끝 객체의 포함 여부)

[Map]

: key(중복 불가)와 value(중복 가능)으로 구성된 객체를 저장하는 구조를 갖는다. 동일한 키로 저장하면 기존의 값은 수정된다. 

Map

K(key)와 V(value)는 제네릭이고 기본 자료형(int,double,boolean 등) 은 사용할 수 없고 클래스나 인터페이스 타입만 가능하다.

 

  • HashMap
    • Map 컬렉션의 대표적인 구현 클래스이다. 동기화를 보장하지 않는다(비동기화),null 허용
  • HashTable
    • HashMap과 동일한 사용법을 갖는다. 차이점은 동기화를 보장한다. (멀티스레드에서는 HashTable을 사용해야하고, 단일 스레드에서는 HashMap을 사용하는게 유리), null를 허용하지 않음
  • LinkedHashMap
    •  HashMap은 put통해 데이터를 넣을때 순서가 지켜지지 않는데 이걸 보안했다.
  • TreeMap
    • key와 value을 한 쌍으로 하는 데이터를 이진 검색 트리의 형태로 저장한다. 이진 검색 트리는 데이터를 추가,삭제 등의 기본 동작 시간이 매우 빠르다. TreeMap 클래스는 NavigableMap 인터페이스를 기존의 이진 검색 트리의 성능을 향상시킨 Red-Black Tree로 구현한다. 

참고 : m.blog.naver.com/heartflow89/221002846073

coding-factory.tistory.com/557?category=758267