Dico

[Java] Collection Framework

Collection Framework

데이터 군을 저장하는 클래스들을 표준화한 설계

컬렉션 Collection :  다수의 데이터. 데이터 그룹

프레임웍 Framework :  표준화된 프로그래밍 방식.

장점

컬렉션, 다수의 데이터를 다루는 데 필요한 다양하고 풍부한 클래스들을 제공한다.

인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화되어 있어 사용이 쉽다.

재사용성이 높은 코드를 작성할 수 있다.

핵심 인터페이스

컬렉션을 크게 3가지의 타입으로 나누어 각 컬렉션을 다루는 데 필요한 기능을 가진 3개의 인터페이스를 정의.

interface특징구현 클래스
List  순서가 있는 데이터의 집합. 데이터의 중복 허용.   ArrayList, LinkedList, Stack, Vector 등
Set  순서를 유지하지 않는 데이터의 집합.
  데이터의 중복 금지.
  HashSet, TreeSet 등
Map  순서를 유지하지 않는, 키와 값의 쌍으로 이루어진 데이터의 집합
  키 중복 금지, 값 중복 허용.
  HashMap, TreeMap, Hashtabal, Properties 등
  • 키 Key

     데이터 집합 중에서 어떤 값(value)을 찾는 데 열쇠(key)가 된다는 의미에서 붙여진 이름

     따라서 중복을 허용하지 않는다.

  • Map 인터페이스

     List, Set과 전혀 다른 형태로 컬렉션을 다루기 때문에 같은 상속계층도에 포함되지 못했다.

컬렉션 프레임웍의 명명법

컬렉션 프레임웍의 모든 컬렉션 클래스들은 List, Set, Map 중의 하나를 구현하고 있으며,

구현한 인터페이스의 이름이 클래스의 이름에 포함되어 있어 이름만으로도 클래스의 특징을 알기 쉽다.

  • 예외 :  Vector, Stack, Hashtable, Properties

     컬렉션 프레임웍이 만들어지기 이전부터 존재하던 것이기 때문에 컬렉션 프레임웍의 명명법을 따르지 않는다.

     호환을 위해 설계를 변경해서 남겨두었지만 사용하지 않는 것이 좋다.

     대신에 ArrayList와 HashMap을 사용하자.

interface Collection

List와 Set의 조상.

인터페이스 List와 Set을 구현한 컬렉션 클래스들의 공통된 부분들을 모아서 정의한 인터페이스.

컬렉션 클래스에 저장된 데이터를 읽고, 추가하고 삭제하는 등 컬렉션을 다루는 데 가장 기본적인 메서드들을 정의.

반환 타입이름설명
  boolean  add(E e)  지정된 객체(o)의 객체들을 컬렉션에 추가
  boolean  addAll(Collection<? extends E> c)  지정된 컬렉션(c)의 객체들을 컬렉션에 추가
  void  clear()  Collection의 모든 객체를 삭제
  boolean  contains(Object o)  지정된 객체(o)의 객체들이 컬렉션에 포함되어 있는지 확인
  boolean  containsAll(Collection<?> c)  지정된 컬렉션의 객체들이 컬렉션에 포함되어 있는지 확인
  boolean  equals(Object o)  동일한 컬렉션인지 비교
  int  hashCode()  컬렉션의 hash code를 반환
  boolean  isEmpty()  컬렉션이 비어있는 지 확인
  Iterator  iterator()  컬렉션의 Iterator를 얻어서 반환
  boolean  remove(Object o)  지정된 객체를 삭제
  boolean  removeAll(Collection<?> c)  지정된 컬렉션에 포함된 객체들을 삭제
  boolean  retainAll(Collection<?> c)  지정된 컬렉션에 포함된 객체만을 남기고 다른 객체들은 컬렉션에서 삭제
  int  size()  Collection에 저장된 객체의 개수를 반환
  Object[]  toArray()  컬렉션에 저장된 객체를 객체배열(Object[])로 반환
  T[]  toArray(T[] a)  지정된 배열에 컬렉션의 객체를 저장해서 반환
  • 반환 타입이 boolean인 메서드들은 작업을 성공하거나 사실이면 true, 그렇지 않으면 false를 반환한다.
  • E

     특정 타입. 지네릭스(Generics)에 의한 표기.

     이 외에도 T, K, V를 사용하는 경우도 있다. 모두 Object 타입이라고 이해해두자.

interface List

저장 순서를 유지한다.

중복 가능하다.

구현클래스 :  Vector ← Stack, ArrayList, LinkedList

반환타입이름설명
  void  add(int index, E element)  지정된 위치에 객체에 포함된 객체들을 추가
  boolean  addAll(int index, Collection<? extends E> c)  지정된 위치에 컬렉션에 포함된 객체들을 추가
  int  indexOf(Object o)  지정된 객체의 위치를 반환. List의 첫 번째 요소부터 순방향으로 찾음
  int  lastIndexOf(Object o)  지정된 객체의 위치를 반환. List의 마지막 요소부터 역방향으로 찾음
  ListIterator  listIterator(int index)  List의 객체에 접근할 수 있는 ListIterator를 반환
  ListIterator  listIterator()  List의 객체에 접근할 수 있는 ListIterator를 반환
  E  remove(int index)  지정된 위치에 있는 객체를 삭제하고 삭제된 객체를 반환
  E  set(int index, E element)  지정된 위치에 객체를 저장
  void  sort(Comparator<? super E> c)  지정된 비교자로 List를 정렬
  List  subList(int fromIndex, int toIndex)  지정된 범위(from~to)에 있는 객체를 반환

interface Set

저장 순서를 유지하지 않는다.

중복 불가능하다.

구현클래스 :  HashSet, SortedSet ← TreeSet.

interface Map

키(Key)와 값(value)을 하나의 쌍으로 묶어서 저장한다.

키는 중복될 수 없지만 값은 중복 가능하다.

기존에 저장된 데이터와 중복된 키와 값을 저장하면 마지막에 저장된 값이 남는다.

구현클래스 :  Hashtable, HashMap ← LinkedHashMap, SortedMap ← TreeMap

반환 타입이름설명
  void  clear()  Map의 모든 객체를 삭제
  boolean  containsKey(Object key)  지정된 Key객체와 일치하는 Map의 Key객체가 있는 지 확인
  boolean  containsValue(Object value)  지정된 value객체와 일치하는 Map의 value객체가 있는지 확인
  Set<Entry<K, V»  entrySet()  Map에 저장되어 있는 key-value쌍을 Map.Entry타입의 객체로 저장한 Set으로 반환
  boolean  equals(Object o)  동일한 Map인지 확인
  V  get(Object key)  지정한 Key객체에 대응하는 value객체를 찾아서 반환
  int  hashCode()  해시코드를 반환
  boolean  isEmpty()  Map이 비어있는지 확인
  Set  keySet()  Map에 저장된 모든 Key객체를 반환
  V  put(K key, V value)  Map에 있는 value객체를 Key객체에 연결(mapping)하여 저장
  void  putAll(Map<? extends K, ? extends V> m)  지정된 Map의 모든 key-value쌍을 추가
  V  remove(Object key)  지정한 Key객체와 일치하는 key-value객체를 삭제
  int  size()  Map에 저장된 key-value쌍의 개수를 반환
  Collection  values()  Map에 저장된 모든 value객체를 반환
  • values()와 keySet()의 반환 타입

    Map 인터페이스에서 값은 중복이 가능하기 때문에 Collection 타입으로 반환한다.

    키는 중복이 불가능하기 때문에 Set타입으로 반환한다.

interface Map.Entry

Map 인터페이스의 내부 인터페이스(inner interface).

Map에 저장되는 key-value쌍을 다루기 위해 내부적으로 정의해둔 것.

Map인터페이스를 구현하는 클래스에서는 Map.Entry 인터페이스로 함께 구현해야 한다.

반환타입이름설명
  boolean  equals(Object o)  동일한 Entry인지 비교
  K  getKey()  Entry의 key객체를 반환
  V  getValue()  Entry의 value객체를 반환
  int  hashCode()  Entry의 해시코드를 반환
  V  setValue(V value)  Entry의 value객체를 지정된 객체로 변경

Collection Class 특징

Collection특징
  ArrayList  배열 기반. 불연속적인 데이터 추가/삭제 불리. 순차적인 추가/삭제 가장 빠름
  임의의 요소에 대한 접근성이 뛰어남
  LinkedList  연결 기반. 불연속적인 데이터 추가/삭제 유리. 임의의 요소에 대한 접근성이 좋지 않음
  HashMap  배열과 연결이 결합된 형태. 추가, 삭제, 검색, 접근성이 모두 뛰어남. 검색에 최고 성능
  TreeMap  연결 기반. 정렬과 검색(특히 범위 검색)에 적합. 검색 성능은 HashMap보다 떨어짐
  Stack  LIFO(Last In First Out) 방식의 자료. 구조Vector를 상속받아 구현
  Queue  FIFO(First In First Out) 방식의 자료 구조. LinkedList가 Queue 인터페이스를 구현
  Properties  데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공. Hashtable을 상속받아 구현
  HashSet  Set 인터페이스를 구현한 가장 대표적인 컬렉션. HashMap을 이용해서 구현
  TreeSet  TreeMap을 이용해서 구현
  LikedHashMap  HashMap에 저장 순서 유지 기능 추가
  LikedHashSet  HashSet에 저장 순서 유지 기능 추가

참고 서적: 자바의 정석 3판 2