Java - Collection 인터페이스와 Collections 클래스의 차이

Collection interface

Interface Collection<E>

타입이 E인 원소를 저장하는 List와 Set 자료구조의 공통점을 뽑아 정의한 인터페이스이다. List와 Set의 구현체는 공통점이 많아 Collection 인터페이스로 추상화 할 수 있었지만 Map 인터페이스는 공통점이 없다.

컬렉션 프레임워크 상속계층

Vector, Stack, Hashtable, Properties와 같은 클래스들은 컬렉션 프레임워크가 만들어지기 전부터 존재했다. 기존 코드들과의 호환성을 위해 남겨놓은 것이기 때문에 굳이 사용하지 않는 것이 좋다.

Collection에 없고 구현체에만 있는 구체적인 메서드가 필요한 게 아니라면 Collection 타입으로 선언하는 것이 좋다. 기존 코드의 수정 없이 여러 구현체들을 일관된 형태로 다룰 수 있기 때문이다.

List

순서가 있는 정보들의 그룹을 추상화 한 것이다. 데이터의 중복을 허용한다.

ArrayList

Vector와 동작 원리가 똑같다. 내부적으로 size(크기)capacity(용량) 정보를 유지하며 데이터는 배열에 저장된다. capacity보다 많은 양의 데이터를 저장해야 할 경우 새로운 메모리 공간을 할당받고 기존의 정보를 모두 새로운 메모리 공간으로 복사하게 된다. 저장할 데이터의 개수에 따라 상당히 효율이 떨어질 수 있다.

Arrays 클래스에는 배열을 다루는데 유용한(utility) static 메서드들이 정의되어 있다.
Arrays.asList() 메서드는 배열 기반 API와 collection 기반 API를 연결하는 기능을 한다. asList() 메서드는 List 타입의 객체(실제로는 ArrayList)를 반환하기 때문이다. 이 반환된 객체를 view라고 하며 크기가 고정된 List이다.

view의 특징

  • view의 원소의 값을 변화시키면 원본 배열의 값도 변하게 된다.
  • view의 크기는 고정이기 때문에 삽입 삭제 연산을 시도할 경우 UnsupportedOperationException 예외가 발생한다.
  • 크기를 변경하고 싶다면 view로부터 ArrayList 객체를 만들면 된다.
    new ArrayList(Arrays.asList(1, 2, 3, 4, 5))
private static void studyList() {
    Integer[] arr = {1, 2, 3, 4, 5};
    List<Integer> list = Arrays.asList(arr);
    list.set(0, 200);
    System.out.println(list);
    try {
        list.add(100);
    } catch (UnsupportedOperationException e) {
        System.out.println("error");
        return ;
    }
    System.out.println(list);
}

/** 실행 결과
 * [200, 2, 3, 4, 5]
 * error
 * /

LinkedList

배열의 단점을 보완하는 자료구조이다. 크기 변화가 쉽고 비순차적인 데이터 삽입 또는 삭제가 쉽다.

LinkedList는 Queue 인터페이스(JDK 1.5)와 Deque 인터페이스(JDK 1.6)를 구현한다.

Queue 인터페이스에는 다음과 같은 메서드들이 정의되어 있다.

  • Object element() - 첫 번째 요소 반환
  • boolean offer(Object o) - 객체를 큐의 끝에 추가
  • Object peek() - 첫 번째 요소 반환
  • Object poll() - 첫 번째 요소를 반환하고 제거한다.

Collections class

Collection들에 대한 연산을 수행하거나 Collection 객체를 반환하는 static 유틸리티 함수들이 정의된 클래스이다.

reference

Comments