른록노트

[DataStructure] Collection (Java) 본문

Programming/[DataStructure]

[DataStructure] Collection (Java)

른록 2021. 12. 29. 18:33

1. Collection

Java 11

Module java.base
Package java.util
Interface Collection<E>

Type Parameters:
E - the type of elements in this collection

All Superinterfaces:
Iterable<E>

All Known Subinterfaces:
BeanContext, BeanContextServices, BlockingDeque<E>, BlockingQueue<E>, Deque<E>, EventSet, List<E>, NavigableSet<E>, Queue<E>, Set<E>, SortedSet<E>, TransferQueue<E>

All Known Implementing Classes:
AbstractCollection, AbstractList, AbstractQueue, AbstractSequentialList, AbstractSet, ArrayBlockingQueue, ArrayDeque, ArrayList, AttributeList, BeanContextServicesSupport, BeanContextSupport, ConcurrentHashMap.KeySetView, ConcurrentLinkedDeque, ConcurrentLinkedQueue, ConcurrentSkipListSet, CopyOnWriteArrayList, CopyOnWriteArraySet, DelayQueue, EnumSet, HashSet, JobStateReasons, LinkedBlockingDeque, LinkedBlockingQueue, LinkedHashSet, LinkedList, LinkedTransferQueue, PriorityBlockingQueue, PriorityQueue, RoleList, RoleUnresolvedList, Stack, SynchronousQueue, TreeSet, Vector
public interface Collection<E>
extends Iterable<E>

2. 설명

컬렉션 계층 구조의 루트 인터페이스입니다. 컬렉션은 elements라고 하는 objects 그룹을 나타냅니다.
일부 컬렉션은 중복 요소를 허용하고 다른 컬렉션은 허용하지 않습니다. 일부는 순서가 지정되고 다른 일부는 순서가 지정되지 않습니다.
JDK는 이 인터페이스의 직접적인 구현을 제공하지 않습니다: 이것은 Set 및 List와 같은 보다 구체적인 하위 인터페이스의 구현을 제공합니다. 이 인터페이스는 일반적으로 컬렉션을 전달하고 최대한의 일반성이 필요한 곳에서 컬렉션을 조작하는 데 사용됩니다.

Bag 또는 multiset(중복 요소를 포함할 수 있는 정렬되지 않은 컬렉션)은 이 인터페이스를 직접 구현해야 합니다.
모든 범용 Collection 구현 클래스(일반적으로 하위 인터페이스 중 하나를 통해 간접적으로 Collection 구현)는 두 개의 "표준" 생성자를 제공해야 합니다:빈 컬렉션을 만드는 void(인수 없음) 생성자 및 해당 agument와 동일한 element를 사용하여 새 컬렉션을 만드는 Collection type의 단일 agument가 있는 생성자. 실제로 후자의 생성자는 사용자가 컬렉션을 복사할 수 있도록 하여 원하는 구현 유형의 동등한 컬렉션을 생성합니다. 인터페이스가 생성자를 포함할 수 없기 때문에 이 규칙을 적용할 방법은 없지만 Java 플랫폼 라이브러리의 모든 범용 Collection 구현은 준수합니다.

특정 Methods은 선택 사항으로 지정됩니다. 컬렉션 구현이 특정 작업을 구현하지 않는 경우 UnsupportedOperationException을 throw하는 해당 메서드를 정의해야 합니다. 이러한 메서드는 컬렉션 인터페이스의 메서드 사양에서 "선택적 작업"으로 표시됩니다.

일부 컬렉션 구현에는 포함할 수 있는 요소에 대한 제한이 있습니다. 예를 들어, 일부 구현에서는 null element를 금지하고 일부 구현에서는 해당 element의 type에 제한이 있습니다. 부적격 요소를 추가하려고 하면 확인되지 않은 예외(일반적으로 NullPointerException 또는 ClassCastException)가 발생합니다. 부적격 요소의 존재를 쿼리하려고 하면 예외가 발생하거나 단순히 false를 반환할 수 있습니다. 일부 구현은 전자의 동작을 나타내고 일부는 후자를 나타냅니다. 더 일반적으로, 부적격 요소가 컬렉션에 삽입되지 않는 결과를 가져오는 부적격 요소에 대한 작업을 시도하면 구현 옵션에 따라 예외가 발생하거나 성공할 수 있습니다. 이러한 예외는 이 인터페이스의 사양에서 "선택 사항"으로 표시됩니다.

고유한 동기화 정책을 결정하는 것은 각 컬렉션에 달려 있습니다. 구현에서 더 강력한 보장이 없는 경우 정의되지 않은 동작은 다른 스레드에 의해 변경되는 컬렉션의 메서드 호출로 인해 발생할 수 있습니다. 구현에서 더 강력한 보장이 없는 경우 정의되지 않은 동작은 다른 스레드에 의해 변경되는 컬렉션의 메서드 호출로 인해 발생할 수 있습니다. 여기에는 직접 호출, 호출을 수행할 수 있는 메서드에 컬렉션 전달, 컬렉션을 검사하기위해 기존 iterator를 사용하는 것이 있습니다.

Collections Framework 인터페이스의 많은 메소드는 equals 메소드로 정의됩니다. 예를 들어, contains(Object o) 메서드에 대한 사양은 다음과 같습니다:"이 컬렉션에 (o==null ? e==null : o.equals(e))와 같은 요소 e가 하나 이상 포함된 경우에만 true를 반환합니다."
이 사양은 null이 아닌 인수 o로 Collection.contains를 호출하면 모든 요소 e에 대해 o.equals(e)가 호출된다는 의미로 해석되어서는 안 됩니다. 구현은 equals 호출을 피하는 최적화를 자유롭게 구현할 수 있습니다. 예를 들면, 먼저 두 요소의 해시 코드를 비교합니다.
(Object.hashCode() 사양은 해시 코드가 같지 않은 두 객체가 같을 수 없음을 보장합니다.)
보다 일반적으로 다양한 Collections Framework 인터페이스의 구현은 구현자가 적절하다고 판단하는 경우 기본 Object 메서드의 지정된 동작을 자유롭게 활용할 수 있습니다.

컬렉션의 재귀 순회를 수행하는 일부 컬렉션 작업은 컬렉션이 직접 또는 간접적으로 포함되는 자체 참조 인스턴스를 제외하고 실패할 수 있습니다. 여기에는 clone(), equals(), hashCode() 및 toString() 메서드가 포함됩니다. 구현은 선택적으로 자체 참조 시나리오를 처리할 수 있지만 대부분의 현재 구현은 그렇게 하지 않습니다.

2.1. View Collections

대부분의 컬렉션은 컬렉션에 포함된 요소의 저장소를 관리합니다. 대조적으로, 뷰 컬렉션 자체는 요소를 저장하지 않지만 대신 실제 요소를 저장하기 위해 backing 컬렉션에 의존합니다. 뷰 컬렉션 자체에서 처리되지 않는 작업은 backing 컬렉션에 위임됩니다. 뷰 컬렉션의 예로는 Collections.checkedCollection, Collections.synchronizedCollection 및 Collections.unmodifiableCollection과 같은 메서드에서 반환되는 래퍼 컬렉션이 있습니다. 뷰 컬렉션의 다른 예로는 List.subList, NavigableSet.subSet 또는 Map.entrySet에서 제공하는 것과 같이 동일한 요소의 다른 표현을 제공하는 컬렉션이 있습니다. backing 컬렉션에 대한 모든 변경 사항은 뷰 컬렉션에서 볼 수 있습니다. 이에 따라 뷰 컬렉션에 대한 모든 변경 사항(변경 사항이 허용되는 경우)은 backing 컬렉션에 기록됩니다. 기술적으로 컬렉션은 아니지만 Iterator 및 ListIterator의 인스턴스는 backing 컬렉션에 대한 수정 사항을 기록하도록 허용할 수도 있으며 경우에 따라 backing 컬렉션에 대한 수정 사항은 반복 중에 Iterator에 표시됩니다.

2.2. Unmodifiable Collections

이 인터페이스의 특정 메소드는 "파괴적"으로 간주되며 작동하는 컬렉션 내에 포함된 개체 그룹을 수정한다는 점에서 "변경자" 메소드라고 합니다. 이 컬렉션 구현이 작업을 지원하지 않는 경우 UnsupportedOperationException을 throw하도록 지정할 수 있습니다. 이러한 메서드는 호출이 컬렉션에 영향을 미치지 않는 경우 UnsupportedOperationException을 throw해야 하지만 반드시 그래야 하는 것은 아닙니다. 예를 들어, add 작업을 지원하지 않는 컬렉션을 고려하십시오. 빈 컬렉션을 인수로 사용하여 이 컬렉션에서 addAll 메서드가 호출되면 어떻게 될까요? 0 요소를 추가해도 효과가 없으므로 이 컬렉션에서 단순히 아무 것도 하지 않고 예외를 throw하지 않는 것이 허용됩니다. 그러나 특정 경우에만 예외를 throw하면 프로그래밍 오류가 발생할 수 있으므로 이러한 경우에는 무조건 예외를 throw하는 것이 좋습니다.

수정할 수 없는 컬렉션은 컬렉션이며, 모든 변경자(mutator) 메서드(위에 정의된 대로)는 UnsupportedOperationException을 throw하도록 지정되었습니다. 따라서 이러한 컬렉션은 해당 컬렉션에 대한 메서드를 호출하여 수정할 수 없습니다. 컬렉션이 적절하게 수정 불가능하려면 이 컬렉션에서 파생된 모든 뷰 컬렉션도 수정 불가능해야 합니다. 예를 들어 List가 수정 불가능한 경우 List.subList에서 반환된 List도 수정할 수 없습니다.

수정할 수 없는 컬렉션이 반드시 변경 불가능한 것은 아닙니다. 포함된 요소가 변경 가능하면 전체 컬렉션은 수정할 수 없더라도 분명히 변경 가능합니다. 예를 들어, 변경 가능한 요소를 포함하는 두 개의 수정 불가능한 List을 고려하십시오. list1.equals(list2)를 호출한 결과는 두 목록이 모두 수정할 수 없는 경우에도 요소가 변경된 후 다음 호출에서 다를 수 있습니다. 그러나 수정할 수 없는 컬렉션에 모든 변경할 수 없는 요소가 포함되어 있으면 사실상 변경할 수 없는 것으로 간주될 수 있습니다.

2.3. Unmodifiable View Collections

수정할 수 없는 뷰 컬렉션은 수정할 수 없는 컬렉션이며 지원(backing) 컬렉션에 대한 뷰이기도 합니다. mutator 메서드는 위에서 설명한 대로 UnsupportedOperationException을 발생시키는 반면 메서드를 읽고 쿼리하는 것은 backing 컬렉션에 위임됩니다. 그 효과는 backing 컬렉션에 대한 읽기 전용 액세스를 제공하는 것입니다. 이는 구성 요소가 사용자에게 내부 컬렉션에 대한 읽기 액세스 권한을 제공하는 동시에 이러한 컬렉션을 예기치 않게 수정하는 것을 방지하는 데 유용합니다. 수정할 수 없는 뷰 컬렉션의 예로는 Collectoins.unmodifiableCollection, Collections.unmodifiableList 및 related 메서드에서 반환된 컬렉션이 있습니다.

backing 컬렉션에 대한 변경은 여전히 가능하며 변경 사항이 발생하면 수정할 수 없는 view를 통해 볼 수 있습니다.
따라서 수정할 수 없는 뷰 컬렉션이 반드시 변경 불가능한 것은 아닙니다. 그러나 수정할 수 없는 뷰의 지원 컬렉션이 사실상 변경 불가능하거나 backing 컬렉션에 대한 유일한 참조가 수정할 수 없는 뷰를 통한 경우 뷰는 효과적으로 변경할 수 없는 것으로 간주될 수 있습니다.

이 인터페이스는 Java Collectoins Framework의 구성원입니다.

Implementation Requirements:
기본 메서드 구현(상속 또는 기타)은 동기화 프로토콜을 적용하지 않습니다. Collection 구현에 특정 동기화 프로토콜이 있는 경우 해당 프로토콜을 적용하려면 기본 구현을 재정의해야합니다.

Since:
1.2

See Also:
Set, List, Map, SortedSet, SortedMap, HashSet, TreeSet, ArrayList, LinkedList, Vector, Collections, Arrays, AbstractCollection

3. 메서드

boolean add(E e) - 이 컬렉션에 지정된 요소가 포함되어 있는지 확인합니다. (선택 작업)
boolean addAll​(Collection<? extends E> c) - 지정된 컬렉션의 모든 요소를 이 컬렉션에 추가합니다. (선택 작업) void clear() - 이 컬렉션의 모든 요소를 제거합니다. (선택 작업) boolean contains​(Object o) - 이 컬렉션에 지정된 요소가 있으면 true를 반환합니다. boolean containsAll​(Collection<?> c) - 이 컬렉션에 지정된 컬렉션의 모든 요소가 포함되어 있으면 true를 반환합니다.
boolean equals​(Object o) - 지정된 개체를 이 컬렉션과 동일한지 비교합니다.
int hashCode() - 이 컬렉션의 해시 코드 값을 반환합니다.
boolean isEmpty() - 이 컬렉션에 element가 없으면 true를 반환합니다.
Iterator iterator() - 이 컬렉션의 요소에 대한 반복자를 반환합니다.
default Stream parallelStream() - 이 컬렉션을 소스로 하여 가능한 병렬 Stream을 반환합니다.
boolean remove​(Object o) - 존재하는 경우 이 컬렉션에서 지정된 요소의 단일 인스턴스를 제거합니다. (선택 작업)
boolean removeAll​(Collection<?> c) - 매개변수 컬렉션에 있는 요소들을 이용해 현재 컬렉션의 같은 요소들을 삭제합니다. (선택 작업) default boolean removeIf​(Predicate<? super E> filter) - 주어진 술어를 만족하는 이 컬렉션의 모든 요소를 제거합니다. boolean retainAll​(Collection<?> c) - 지정된 컬렉션에 포함된 이 컬렉션의 요소만 유지합니다. (선택 작업)
int size() - 이 컬렉션의 요소 수를 반환합니다.
default Spliterator spliterator() - 이 컬렉션의 요소에 대해 Spliterator를 만듭니다.
default Stream stream() - 이 컬렉션을 소스로 하는 순차 Stream을 반환합니다.
Object[] toArray() - 이 컬렉션의 모든 요소를 포함하는 array를 반환합니다.
default T[] toArray​(IntFunction<T[]> generator) - 반환된 배열을 할당하기 위해 제공된 생성기 함수를 사용하여 이 컬렉션의 모든 요소를 포함하는 배열을 반환합니다.
T[] toArray​(T[] a) - 이 컬렉션의 모든 요소를 포함하는 배열을 반환합니다. 반환된 배열의 런타임 유형은 지정된 배열의 런타임 유형입니다.

반응형
Comments