Java/Java 를 파헤쳐보자

[Java 파헤쳐보기] JCF 소개

동구름이 2024. 4. 11. 08:45

JCF

JCF(Java Collections Framework)란 자바에서 데이터 구조를 구현하고 관리하기 위한 클래스와 인터페이스의 모음입니다. 쉽게 말해 자료 구조 종류의 형태를 자바 클래스로 구현한 모음집이라 볼 수 있습니다.

 자바에서는 JCF를 통해 C언어와는 다르게 자료구조를 사용하기 위해서 직접 구현을 하는 것이 아니라, 인스턴스화를 해서 사용 가능합니다.

 

 JCF는 크게 Collection 인터페이스와 Map 인터페이스로 나뉘게 됩니다. 기능적으로 공통된 부분이 많은 것끼리 모으다보니, 두 가지로 나뉘게 된 것입니다.

 

 최상위의 Iterable 클래스는 하나의 데이터를 순회할 수 있는 특성이 있습니다. 하지만 Map 인터페이스는 두 개의 데이터를 한 쌍으로 다루는 특성이 있기 때문에 따로 분리되어있습니다.

 

 그리고 위 그림에서 보이듯, 대부분의 컬렉션 클래스들의 이름에 구현 인터페이스의 이름이 포함되는 것을 볼 수 있습니다. 하지만  Vector, Hashtable과 같이 포함되지 않는 클래스들이 있는데, 이것은 컬렉션 프레임 워크 이전에 만들어진 클래스들로 호환을 위해 남겨진 것입니다. 

 

 

이번 포스팅에서는 상위 인터페이스인 Iterable, Collection 만 간단히 알아보고, 이후 포스팅에서 각각의 클래스들에 대해 정리해보겠습니다.

 

Iterable 인터페이스

 

Iterable 인터페이스는 JCF의 최상위 인터페이스 입니다. 자료를 순회하는 Iterator 객체를 관리하는 인터페이스입니다.

package java.lang;

import java.util.Iterator;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;

public interface Iterable<T> {
    /**
     * Returns an iterator over elements of type {@code T}.
     *
     * @return an Iterator.
     */
    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

 

 인터페이스 내부 코드는 위와 같습니다. Iterator 객체를 다루는 것을 볼 수 있고, 두 개의 메서드를 볼 수 있습니다.

 

첫째로 forEach() 메서드는 함수형 프로그래밍 전용 루프 메서드입니다. 

 

그리고 spliterator() 메서드가 조금 생소하지만,  Spliterator 인터페이스를 다루는 메서드입니다.  Spliterator는 Iterator 처럼 탐색 기능을 제공하지만, 병렬 작업에 특화된 인터페이스입니다. 이것에 대한 내용은 이후, 병렬 스트림 동작에 대해 따로 포스팅을 할 예정입니다.

 

 

 

Collection 인터페이스

Collection 인터페이스는 List, Queue, Set에 상속을 하는 가장 상위 컬렉션 타입입니다.

 

Collection 인터페이스에서는 다양한 종류의 자료형을 받아 자료의 삽입, 삭제, 탐색 기능을 제공합니다.

 

public interface Collection<E> extends Iterable<E> {

    int size();
    boolean isEmpty();
    boolean contains(Object o);
    Iterator<E> iterator();
    Object[] toArray();
    <T> T[] toArray(T[] a); 

    boolean add(E e);
    boolean remove(Object o);
    boolean containsAll(Collection<?> c);
    boolean addAll(Collection<? extends E> c);
    boolean removeAll(Collection<?> c);

    default boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator<E> each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }

    boolean retainAll(Collection<?> c);
    void clear();
    boolean equals(Object o);
    int hashCode();

    @Override
    default Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, 0);
    }
    default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }
    default Stream<E> parallelStream() {
        return StreamSupport.stream(spliterator(), true);
    }
}

 

실제 코드를 열어보면 위와 같습니다. Iteratable을 상속 받는 것을 볼 수 있습니다.

 

그리고 add, remove, contains 등의 삽입, 삭제, 탐색 기능과 관련된 메서드가 있습니다.

 

 

 

참고자료

https://inpa.tistory.com/entry/JCF-%F0%9F%A7%B1-Collections-Framework-%EC%A2%85%EB%A5%98-%EC%B4%9D%EC%A0%95%EB%A6%AC#java_collection_framework

https://devbksheen.tistory.com/entry/%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94-Spliterator-%EC%9D%B8%ED%84%B0%ED%8E%98%EC%9D%B4%EC%8A%A4%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

[10분 테코톡] ⚾️ 제이온의 JCF

https://www.youtube.com/watch?v=SLifMOhW1VA