• 다수의 데이터를 쉽고 효과적으로 처리할 수 있는 표준화된 방법을 제공하는 클래스의 집합
  • 데이터를 저장하는 자료구조와 데이터를 처리하는 알고리즘을 구조화하여 클래스로 구현해 놓은 것
  • interface를 사용하여 구현

https://user-images.githubusercontent.com/28971015/117835747-153ad780-b2b3-11eb-9361-7235cd4e66bd.png

장점

  • 이미 구현된 것을 사용함으로써 코딩 시간을 감소시킬 수 있다.
    • 이미 검증되어 있기 때문에 코드 품질을 보장한다.
  • 유지보수 시간을 감소시킬 수 있다.

주요 인터페이스

Collection Interface Group

직접적인 구현은 제공하지 않으며, 모든 컬렉션 클래스가 구현해야 하는 메서드들을 포함하고 있다.

  • boolean add(E e) : 해당 컬렉션에 전달된 요소를 추가
  • boolean remove(Object o) : 해당 컬렉션에서 전달된 객체를 제거
  • void clear() : 해당 컬렉션의 모든 요소를 제거
  • boolean contains(Object o) : 해당 컬렉션이 전달된 객체를 포함하고 있는지
  • boolean equals(Object o) : 해당 컬렉션과 전달된 객체가 같은지
  • boolean isEmpty() : 해당 컬렉션이 비어있는지
  • Iterator<E> iterator() : 해당 컬렉션의 반복자(iterator)를 반환
  • int size() : 해당 컬렉션의 요소의 총 개수를 반환
  • Object[] toArray() : 해당 컬렉션의 모든 요소를 Object 타입의 배열로 반환

List

순서가 있는 데이터의 집합으로, 데이터의 중복을 허용

  • Vector, ArrayList, LinkedList, Stack, Queue

Set

순서가 없는 데이터의 집합으로, 데이터의 중복을 허용하지 않음

  • HashSet, TreeSet

Queue

요소를 FIFO(First-In First-Out) 방식으로 정렬하며 예외에는 우선순위 큐가 있음

  • Priority Queue

Map Interface

Map

키와 값의 한쌍으로 이루어지는 데이터의 집합으로, 순서가 없음, 키는 중복X, 값은 중복O

  • HashMap, TreeMap, Hashtable, Properties

Collection Class

  • 컬렉션 인터페이스에 대한 구현 클래스를 제공하는 것

Collection Framework의 모범 사례

  • 크기(size)가 고정되어 있다면 ArrayList보다 Array를 사용하라.
  • 맵에 삽입된 순서대로 iterate를 하고 싶으면 TreeMap을 사용하는 것이 좋다.
  • 중복을 허용하고 싶지 않으면 Set을 사용하면 된다.
  • 몇몇 컬렉션 클래스들을 초기 용량을 지정할 수 있다. 만약 저장할 요소들의 사이즈를 알 경우에 초기 용량을 지정함으로써 rehashing이나 resizing이 일어나는 것을 회피할 수 있다.
  • 코드를 작성할 때, 구현 클래스가 아닌 인터페이스를 기반으로 작성해야 나중에 구현체를 변경할 때 코드를 재작성하는 수고를 줄일 수 있다.
  • 런타임에 발생할 수 있는 ClassCastException을 회피하려면 항상 제네릭(Generics)을 사용해서 type-safety 한 상태를 유지하라.
  • 맵에 키를 사용할 때 JDK에서 제공하는 immutable 클래스를 사용하여 사용자 클래스에서 hashCode()와 equals() 구현할 필요가 없게 하라
  • 읽기 전용 및 동기화, 빈 컬렉션 등을 만들 때는 자신만의 구현으로 생성하지 말고 Collections에서 제공하는 유틸리티 클래스를 사용하라. 이는 코드 재사용성을 높여주고 안정적이며 유지보수 비용을 줄여 준다.

참고 자료