[JDK 뜯어보기] Collection interface

2024. 4. 29. 11:56Spring/Java

본 글은 JDK 17을 기준으로 작성하였습니다.

java.util.Collection

Collection은 그 안에 있는 요소들을 나타낸다. 인터페이스이기 때문에 JDK는 직접적인 구현체를 제공하지는 않지만, Set, List 와 같은 더 구체적인 하위 인터페이스의 구현체들로 구현체를 제공한다.

 

Unmodifiable Collection

Unmodifiable Collection 이라고 해서 반드시 불변인 것은 아니다. 포함되어 있는 요소가 가변적이라면 컬렉션이 가변적일 수 있다. 하지만 모든 요소가 불변이라면 불변 Collection이라고 생각할 수 있다.

Collections.unmodifiableList()

 

우테코 프리코스를 경험하며 위의 메소드를 이용하여 불변 Collection으로 만드려는 것을 많이 봤다. 안에 요소가 가변적이라면 Collection이 가변적일 수도 있다는 것은 처음 알았다.


Iterable interface 를 상속 받는다

Collection 인터페이스는 Iterable 을 상속 받는다. Iterable 은 Collection의 for문 을 이용한 반복 작업을 위해 상속받은 것이다. 내가 만약 어떤 데이터 구조나 커스텀 객체를 만들었을 때 Iterable을 상속받아 iterator() 메소드를 오버라이딩 해주면 해당 객체에 대한 반복 작업을 할 수 있다.

int size()

  • Return : 해당 컬렉션의 요소의 갯수를 반환한다.
  • 요소 갯수가 Integer 범위 보다 크다면 Integer.MAX_VALUE 를 반환한다.
@Contract(pure=true) 는 순수함수 라는 것을 의미한다. (동일한 인자를 주었을 때 항상 같은 값을 리턴 + 외부의 상태에 영향 받지 않는 함수)

boolean isEmpty()

  • Return : 요소가 없으면 true

boolean contains(Object o)

  • Params : 컬렉션에서 존재 여부를 확인할 요소
  • Returns : 컬렉션에 요소가 하나 이상 포함되어 있을 경우

Iterator<E> iterator()

  • Loop를 이용할 수 있게 해준다.
  • 순서가 보장되지 않는다.

Object[] toArray()

  • 모든 요소를 담은 배열로 반환한다.
  • 순서에 대한 보장이 있다면 동일한 순서로 반환해준다.

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

  • 컬렉션의 요소를 저장할 배열이 충분한 크기를 가지면 할당되고 아니면 새 배열이 할당 된다.
String[] y = new String[SIZE];
...
y = x.toArray(y);

 

아래처럼 사용도 가능하다.

 

String[] y = x.toArray(String[]::new);

boolean add (E e)

  • Params : 컬렉션에 추가하려는 요소
  • Returns : 요소가 추가되어 컬렉션이 변경된 경우 true

boolean remove(Object o)

  • Params : 컬렉션에서 제거하려는 요소
  • Returns : 요소가 제거되어 컬렉션이 변경된 경우 true

boolean containsAll(Collection<?> c)

  • Params : 현재 컬렉션에 대해 포함 여부를 확인할 다른 컬렉션
  • Returns : 현재 컬렉션이 지정된 컬렉션의 모든 요소를 포함할 경우 true

boolean addAll(Collection<? extends E> c)

  • Params : 현재 컬렉션에 추가하려는 요소가 포함된 다른 컬렉션
  • Returns : 추가되어 현재 컬렉션이 변경되었으면 true

boolean removeAll(Collection<?> c)

  • Params : 현재 컬렉션에 제거하려는 요소가 포함된 다른 컬렉션
  • Retruns : 제거되어 현재 컬렉션이 변경되었으면 true

boolean removeIf(Predicate<? super E> filter)

  • Params : filter -  제거할 요소를 식별하는 조건을 반환하는 프레디케이트
  • Returns : 한 개 이상의 요소가 제거되었을 경우 true
List<Integer> numbers = new ArrayList<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
numbers.add(5);

numbers.removeIf(number -> number % 2 == 0);

boolean retainAll(Collection<?> c)

  • Params : 현재 컬렉션에서 유지할 요소가 포함된 컬렉션
  • Retruns : 나머지 요소가 제거되어 현재 컬렉션이 변경되었으면 true
  • 현재 컬렉션에서 지정된 컬렉션에 포함되지 않은 모든 요소를 제거

void clear()

  • 컬렉션의 모든 요소 제거

이외에는 equals(), hashcode() 를 통해 객체의 동등성 비교 및 stream 객체로 만들어주는 메소드를 가지고 있다.