1. Collection 인터페이스
Collection에 앞서 컬렉션 프레임워크(collection framework)에 대한 이해가 필요하다. 컬렉션 프레임워크란 다수의 객체(컬렉션)를 다루기 위해 자바에서 제공하는 표준화된 프로그래밍 방식이다. 컬렉션 프레임워크에서는 데이터를 저장하는 자료구조에 따라 List, Set, Map 등의 다양한 인터페이스를 정의하고 있다.
Collection은 컬렉션을 다루기 위한 최상위 인터페이스로서 java.util에 정의되어 있다. List, Queue, Set 등이 Collection을 상속하는 반면, Map은 Key, Value라는 별도의 구조를 취하므로 Collection을 상속받지 않는다. 단순하게 생각해서 컬렉션 타입이 여러 개 있고, 이것들이 Collection이라는 인터페이스를 구현함으로써 사용자는 일관된 방식으로 컬렉션을 이용할 수 있다고 생각하면 된다.
public interface Collection<E> extends Iterable<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
boolean add(E e);
boolean remove(Object o);
// ...생략
}
2. Collections 클래스
Collections은 컬렉션에 대한 여러 연산을 지원하는 유틸성 클래스로서 java.util에 정의되어 있다. 이는 Collection과 다르게 인터페이스가 아니라 구체 클래스이며, 모든 메서드가 static으로 구현되어 있다. sort나 search 등의 유용한 연산 외에도 빈 컬렉션을 반환하는 메서드도 제공하므로 컬렉션 프레임워크를 사용할 땐 이를 적절히 활용하는 것이 좋다.
public class Collections {
public static <T>
int binarySearch(List<? extends Comparable<? super T>> list, T key) {
// ...
}
public static <T extends Comparable<? super T>> void sort(List<T> list) {
// ...
}
public static void reverse(List<?> list) {
// ...
}
public static final <T> List<T> emptyList() {
// ...
}
public static final <K,V> Map<K,V> emptyMap() {
return (Map<K,V>) EMPTY_MAP;
}
// ... 생략
}
3. 정리
사실 Collections에서 제공하는 연산은 Collection 인터페이스에 static 메서드로 정의해도 될텐데 왜 별도의 클래스로 분리한 것일까? 이는 Collections 클래스가 인터페이스에 static 메서드가 추가된 Java 8 이전부터 존재했기 때문이다. Java 8 이전의 표준 라이브러리에서는 인터페이스와 관련된 정적 메서드들을 동반 클래스(companion class)에서 제공했으며, Collections가 바로 Collection의 동반 클래스에 해당한다.
4. 참고
'프로그래밍 언어 > Java + Kotlin' 카테고리의 다른 글
[Kotlin] 특정 프로퍼티 Json 직렬화/역직렬화 시 제외시키기 (0) | 2023.11.09 |
---|---|
[Java] 제네릭 타입 소거(Generic Type Erasure)에 대해 알아보자 (0) | 2023.08.02 |
[Java] 생성자 총정리 (0) | 2023.01.06 |
[Kotlin] 코틀린에서 애너테이션 사용하기 (vs 자바) (0) | 2022.12.19 |
[Java] JVM을 통해 알아보는 자바 프로그램 실행방식 (0) | 2022.12.15 |