개발자 노트

Collection 정리 - Collection Interface 본문

컴퓨터 언어/Java

Collection 정리 - Collection Interface

jurogrammer 2022. 7. 6. 23:10

관련 글

Collection이란?

elements들의 그룹을 나타냅니다.

Collection interface

가장 일반화된 collections를 전달하는데 사용됩니다.

예 - HashSet의 conversion consturctor

public HashSet(Collection<? extends E> c) {
    map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
    addAll(c);
}

주어진 collection의 elements를 지닌 HashSet을 생성하는 생성자입니다.

List든, Set이든 HashSet에 옮겨 담고 싶은 elements를 지닌 Collection이기만 하면 되니까 Collection type으로 선언된 것이죠.

Collection interface의 메서드

아주 기본적인 연산을 정의하고 있습니다.

  • int size()
  • boolean isEmpty()
  • boolean contains(Object element)
  • boolean add(E element)
  • boolean remove(Object element)
  • Iterator<E> iterator()

또한, 모든 collection에 대해 동작하는 method도 정의하고 있죠.

  • containsAll(Collection<?> c)
  • boolean addAll(Collection<? extends E> c)
  • boolean removeAll(Collection<?> c)
  • boolean retainAll(Collection<?> c)
  • void clear()

array operations를 위한 메서드

  • Object[] toArray()
  • <T> T[] toArray(T[] a)

Stream API를 위한 method

  • Stream<E> stream()
  • Stream<E> parallelStream()

Collection 메서드 동작들은 생각하는 그대로!

elements group이 있다면 어떤 동작을 원할까요?

  • elements들이 얼마나 있니?
    • size, isEmpty
  • 주어진 element가 존재하니?
    • contains
  • group으로 부터 element를 추가하거나 삭제
    • add, remove
  • group의 elements들을 조회하기
    • iterator

add, remove method의 설계

중복이든 아니든 일반적으로 사용될 수 있도록 설계되었습니다.

add method 호출한 뒤 collection에 element가 추가되었다? (collection에 변화가 생겼다.) → true 반환

이미 있었다. (collection에 변화가 없다) → false 반환

Traversing Collections

Aggregate Operations

stream과 aggregate를 통해 collection 조회가 가능합니다.

myShapesCollection.stream()
.filter(e -> e.getColor() == Color.RED)
.forEach(e -> System.out.println(e.getName()));
String joined = elements.stream()
    .map(Object::toString)
    .collect(Collectors.joining(", "));

Collections framework의 Bulk Operation과의 차이점

  • stream api는 immutable하다.

for-each Construct

간단하게 collection을 순회할 수 있습니다.

for (Object o : collection)
    System.out.println(o);

Iterators

collection을 순회하면서 삭제까지 할 수 있습니다!

public interface Iterator<E> {
    boolean hasNext();
    E next();
    void remove(); //optional
}
  • hasNext
    • elements가 더 있다면 true, 없다면 false 반환
  • next
    • interation에서 다음 element 반환
  • remove
    • next에 의해 반환된 elements 중 마지막 element를 삭제
    • next 호출 마다 반드시 1번만 호출되어야 하며, 더 호출될 경우 exception을 던짐.

Iterator.remove 만이 collection을 순회하는 중에 collection을 안전하게 수정할 수 있는 유일한 방법

Iterator를 사용해야 하는 경우

  • 현재 element를 삭제할 때. for-each는 삭제불가. 즉, filtering에는 for-each를 사용하면 안됨
  • 병렬적으로 여러 collection을 순회할 때.

임의의 Collection을 filtering하는 코드

static void filter(Collection<?> c) {
    for (Iterator<?> it = c.iterator(); it.hasNext(); )
        if (!cond(it.next()))
            it.remove();
}

Collection interface Bulk Operations

BulkOperation은 모든 Collection에 대해 동작합니다.

target Collection: 메서드 호출하는 collection

specified Collection: 메서드 호출시 전달하는 argument

종류

  • containsAll
    • target Collection이 specified Collection에 있는 elements를 모두 가지고 있는 경우 true를 반환합니다.
  • addAll
    • specified Collecition의 모든 elements를 target Collection에 추가합니다.
  • removeAll
    • target Collection에 존재하는 specifiec Collection의 elements를 삭제합니다.
  • retainAll
    • specified Collection에 존재하지 않은 element들을 모두 삭제합니다. (교집합의 원소만 남긴다는 의미)
  • clear
    • Collection의 모든 elements를 삭제합니다.

이것저것

  • addAll, removeAll, retainAll methods는 target Collection이 수정됬을 경우 true를 반환합니다.
  • collection에서 1개의 원소를 삭제하는 코드
    • c.removeAll(Collections.singleton(e));
  • null element 삭제하는 방법
    • c.removeAll(Collections.singleton(null));

Collection Interace Array Operations

toArray method는 collections와 older APIs간의 bridge로써 제공됩니다.

(old APIs는 arrays를 input으로 받습니다.)

Collection의 elements들을 array로 변환시켜줍니다.

simple form

Object[] a = c.toArray();

Object 타입의 배열을 반환합니다.

complex form

String[] a = c.toArray(new String[0]);

caller가 output array의 runtime type을 결정합니다. 이 코드에선 c가 Collection<String> 으로, String element만 존재한다고 알 수 있기 때문에 String array를 반환하도록 new String[0] 을 argument로 제공합니다.

반응형

'컴퓨터 언어 > Java' 카테고리의 다른 글

stream api - peek  (0) 2022.12.13
Collection 정리 - Set Interface  (2) 2022.07.14
Collection 정리 - Implementations  (0) 2022.07.04
Collections정리 - Interfaces  (0) 2022.06.30
Collection 정리  (0) 2022.06.30
Comments