JAVA 17. 컬렉션(Set)

김창민·2024년 7월 30일

BE

목록 보기
19/50

오라클 컬렉션 스팩

컬렉션을 사용하긴 하지만, 더 자세히 알아보도록 하자.
오라클 문서

위 사진에서 볼 수 있듯 Collection은 우선 Interface이다. 그 하위에 있는 Subinterface도 무지많고, 구현체는 더 많은걸 확인할 수 있다.

구현체를 위주로 한번 살펴보자면 크게 3가지로 볼 수 있는데, Queue와 Deque는 그냥 나눠서 4개로 확인해보자

Set

AbstractSet, ConcurrentSkipListSet, CopyOnWriteArraySet, EnumSet, HashSet, JobStateReasons, LinkedHashSet, TreeSet

요소의 중복을 허용하지 않는 컬렉션이다. null이 최대 한개 포함될 수 있다.

공통 메소드 (몇몇)

add(E e) : 해당 요소를 이 Set에 추가한다.
clear() : 요소 전부 삭제
contains(Object o) : 요소가 해당 Set에 있으면 true 반환
equals(Object o) : 해당 객체와 이 세트가 동일한지 확인
remove(Object o) : 해당 요소를 삭제
toArray() : 이 세트의 모든 요소를 포함하는 배열 반환 -> T[] y = x.toArray(new T[0]);

AbstractSet

Set 인터페이스의 기본 메서드를 구현하는 추상 메서드다.
equals, hashCode, removeAll이 구현되어 있으며, iterator과 size는 추상메서드로 선언되어있다.
이를 이용하면 커스텀 Set구현이 가능하다.

ConcurrentSkipListSet

NavigableSet의 구현체이다. Skip List라는 구조를 기반으로 하며 Comparable에 따라 정렬되거나 Comparator 세트 생성을 통해 정렬 방식 설정이 가능하다.

contains, add, remove의 시간 복잡도가 log(n)이며, 이 작업들을 멀티스레드에서 안전하게 실행된다.

CopyOnWriteArraySet

모든 연산에 Set 내부를 사용하는 구현체이다. 홈페이지 설명으론 다음과 같다.

  • 이 방식은 일반적으로 집합 크기가 작고, 읽기 전용 작업이 변경 작업보다 훨씬 많으며, 탐색 중에 스레드 간 간섭을 방지해야 하는 애플리케이션에 가장 적합합니다.
  • 스레드로부터 안전합니다.
  • 변경 연산( add , set , remove 등)은 일반적으로 기본 배열 전체를 복사해야 하므로 비용이 많이 듭니다.
  • 반복자는 변경 제거 작업을 지원하지 않습니다.
  • 반복자를 통한 순회는 빠르며 다른 스레드의 간섭을 받을 수 없습니다. 반복자는 반복자가 생성될 당시 배열의 변경되지 않은 스냅샷에 의존합니다

EnumSet

Enum타입을 위한 Set이다. 비트 벡터를 이용해서 구현했고, Enum 상수들만 포함할 수 있다.
Enum상수는 개발자가 직접 선언하기 때문에 개수가 고정되어 있어서 비트 필드가 매우 유용하다.

대부분의 연산이 O(1)시간복잡도를 갖을 정도로 성능이 좋고, Enum 타입만 저장이 가능해서 타입 안정성 또한 보장되며, Enum 상수의 선언 순서를 유지해서 순서가 중요할시 유용하다.

생성

EnumSet.allOf(Class<E> elementType): 주어진 Enum 클래스의 모든 상수를 포함한다.
EnumSet.noneOf(Class<E> elementType) : 빈 EnumSet을 생성한다.
EnumSet.of(E e, E... others) : 하나 이상의 상수를 포함하는 EnumSet을 생성
EnumSet.range(E from, E to) : 지정된 범위의 상수를 포함하는 EnumSet 생성

HashSet

hash테이블을 사용해서 요소를 저장하는 Set이다.
해시 테이블을 사용하기 때문에 검색, 추가, 삭제 작업이 O(1)이지만, 해시 충돌시 성능이 저하된다.
다만, 여러 스레드가 해시 세트에 동시에 액세스하면 동기화 되지 않기 대문에 외부 동기화가 필요하다.

JobStateReasons

HashSet을 확장한 열거형이다.
Job의 현재 상태에 해단 추가 정보를 제공하는 열거형 값의 집합인 enum형 Set이다.
Spring Batch의 작업 단위인 Job을 대상으로 한다.

LinkedHashSet

Hash Table + LinkedList를 Set으로 구현했다.
삽입 순서를 유지하며 HastSet의 성능까지 챙겼다. 즉, 검색, 추가, 삭제 작업이 O(1)이지만, 순서 유지로 인해 추가적인 메모리 오버헤드는 발생한다.

TreeSet

Red-Black Tree라는 균형 이진 탐색 트리를 사용해 요소를 저장한다.
이진 탐색 트리 속성에 의해서 검색,추가,삭제 연산이 O(log n) 시간복잡도를 갖는다.

이진 탐색이라 요소가 자동으로 정렬되고 Null이 허용되지 않는다.

profile
일일 회고 : https://rlackdals981010.github.io/

0개의 댓글