JAVA - Collection Frameworks1

Java

Java 공부를 정리 tag


JDK 8 Collections: Java docs를 공부하며 정리하는 글입니다.


Collection Frameworks

A collection — sometimes called a container — is simply an object that groups multiple elements into a single unit. Collections are used to store, retrieve, manipulate, and communicate aggregate data.

해석해보자면 Collection이란, ‘여러 element를 하나의 단위로 그룹화하는 객체’라는 것이다. 말로만 들으면 와닿지 않을 수 있다. 하지만 우리는 Java로 코딩하면서 이미 Collections 를 많이 사용해봤다.

List<Integer> list = new ArrayList<>();

List객체는 정렬할 때, 그리고 크기가 정해져있지 않은 데이터의 배열을 다룰 때 정말 자주 쓰인다. 이처럼 우리는 이미 Collections에 친숙하다.


Collection Framework : Collections를 나타내고 조작하기 위한 통합 architecture 이다.

모든 Collections Frameworks는 아래 3가지를 포함한다.

  1. Interfaces : collections를 표현하기 위한 abstract data type 이다. Interfaces를 통해 collections가 그들의 세부 표현을 독립적으로 조작할 수 있게 해준다. OOP에서 interface는 대게 계층형이다.
  2. Implementations : Collection interface들의 구현체. 본질적으로 재사용 가능한 data structure.
  3. Algorithms : Collection interface를 구현하는 객체에 대해 검색과 정렬과 같은 유용한 연산을 하는 method가 있다. algorithm는 polymorphic하다고 말할 수 있다. 왜냐면 같은 method가 적절한 Collection interface의 구현체에 사용될 수 있기 때문이다. 본질적으로 algorithm은 재사용 가능한 기능이다.


왜 Java Collection Framework 를 써야 하는가?

그냥 int[][] arr = new int[2][3];과 같이 기존에 있던 것을 계속 쓰면 안되는가?

라고 생각했다. Java docs에는 Collection Frameworks를 쓰면 다음과 같은 장점이 있다고 말한다.

만약 Collection framework가 없다고 해보자. 우리는 int array의 중간에 삽입 연산을 하고 싶다면, 해당 index~끝까지 element를 새로운 배열에 옮기고, 새로운 배열의 해당 index에 삽입하고… 등등 매번 이런 귀찮은 작업을 해야할 것이다. 개발자는 중요한 프로그램의 logic에 집중하고, 이와 같은 나머지 low-level plumbing은 Java Collection Framework가 해준다는 것이다.


Lesson: Interface

collection1_1

사진출처

core collection interfaces는 Java Collections Frameworks의 기반이며 위 그림에서와 같이 다른 type의 collections를 캡슐화 한다.


Note that all the core collection interfaces are generic.

그리고 모든 core collections interfaces generic 이 쓰였다고 한다. 따라서 Collection instance를 선언할 때 반드시 object data type을 명시해줘야 한다. 왜냐하면 compiler가 compile-time 때 collection 안에 적절한 type이 들어갔는지 확인하기 위해서이다. 따라서 run-time에 오류를 줄일 수 있다. 현재 포스팅은 Generic을 다루는게 아니라서 더 자세히는 나중에 포스팅 하도록 하겠다.


collection interfaces 수를 관리하기 위해 Java 는 각 collection type에 대한 별도의 interface를 제공하지 않는다. 대신 각 interfaces의 수정에 관한 동작은 선택이다. 따라서 구현체가 모든 동작을 지원안할 수도 있다. 만약 지원하지 않는 동작이 호출되려고 하면, collection이 UnsupportedOperationException을 던진다고 한다. 따라서 구현체들은 선택적으로 지원하는 동작에 대한 정보를 알려줄 책임이 있다.


다음은 core collections interfaces에 대한 설명이다.


Collection Interface

Collection : 어떤 element type 객체들의 그룹. 객체들의 collections를 전달하기 위해 사용된다. 모든

public static void main(String[] args) {
    Collection<String> collection = new ArrayList<>(Arrays.asList("Hello", "Java", "Collections", "Frameworks"));
    List<String> list = new ArrayList<>(collection);

    for (String element : list) {
      System.out.print(element + " ");
  }
}

간단하게 Collection으로 String 객체들의 collections을 전달해본 코드이다.

Collection Interface는 기본 동작을 수행하는 method를 제공한다.

Collections 전체에 대해 동작하는 method 또한 제공된다.

Array 동작에 관한 추가적인 method도 제공한다.



Traversing Collections

collections를 순회하는데 3가지 방법이 존재한다.


Collection Interface Bulk Operations

이 중에서 addAll(), removeAll(), retainAll()method는 실행결과 해당 Collection에 변화가 생겼다면 모두 return true. 예시도 들어 줬는데 한번 보도록 하자.

Collection<Something> c = new 어떤 collection 구현체;
c.removeAll(Collections.singleton(e));

Collection c에서 e에 해당하는 모든 element를 제거하는 코드이다


Collection Interface Array Operations

toArray() method는 옛날 API와 Collections를 이어주는 다리같은 역할로써 제공된다.


다음 포스팅은 Set Interface부터 이어나가겠다.


Rerference

Java JDK 8 docs - Collections

what is low level plumbing?

effective-java: for-each vs for

Java SE 8 docs: enhanced for(for-each)

Wikipedia