Collection Interface
다양한 자료구조들의 부모(?) 이며 iterable 하다 (순회할 수 있다, Iterable 인터페이스를 extends 했다). 그리고 하나의 값만 추가할 수 있다. 여기
Collection interface 를 extends 한 자료구조들
그림에서 알 수 있듯이, Collection (Interface) 는 Iterable (Interface) 를 extends 하고 있다. 그리고 List, Queue, Set (Interface) 들은 Collection (Interface) 를 extends 하고 있다.
그리고 각각의 구현 클래스 들은 Set, List, Deque 등을 implements 하고 있다.
- List - ArrayList, LinkedList, Vector, Stack
- Queue - PrioritiyQue, Deque, ArrayDeque
- Set - HashSet, LinkedHashSet, SortedSet, TreeSet
- Map - SortedMap, TreeMap, Hashtable, HashMap, LinkedHashMap
왜 Map 은 Collection 을 extends 하지 않을까?
그런데 그림에서도 그렇고, 실제 Map Interface 코드를 봤을 때도 Collection 을 extends 하고 있지 않았다.
왜냐하면, 위에 있듯이... Collection 은 값을 하나씩 저장하는 것이 기본 가정이기 때문이다. 여기
또한 관련해서 카메라 센서쪽 코드를 만드는 친구와 이야기를 나눠보니... Map 은 Iterable 하지 않기 때문에, Collection Interface 를 extends 할 수 없어서 라고 했다. 이것도 좋은 생각이었다.
그렇다면 왜 Map 은 Collection Framework 라는 그림안에 있는걸까? 답은 간단하다, Map Interface 는 Collection Framework 에 속해있기 때문이다.
그렇다면 Collection Framework 와 Collection Interface 는 어떻게 다른걸까?
Collection Framework, Collection Inteface 차이
Collection Inteface
Collection Interface 는 말그대로, Collection Inteface 이다.
관련 메소드로는 이런 것들이 있다.
// Collection interface 의 코드
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);
// 등등...
List, Queue, Set 은 Collection 을 extends 하였다.
따라서 이들의 구현클래스인 ArrayList, ArrayDeque, HashSet 등에서 동일한 이름의 함수를 동일한 방법으로 사용할 수 있다. 왜냐하면, 구현 클래스에서는 부모로 가지는 interface 들을 모두 구현을 해야되기 때문이다. 여기
예시 코드
public class Main {
public static void main(String[] args) {
// List
List<String> myList = new ArrayList<>();
List<String> ll = new LinkedList<>();
myList.add("A");
myList.add("B");
myList.remove("A");
for (String myItem: myList) { // iterable
System.out.println("[myList] myItem = " + myItem);
}
System.out.println("[myList] yList.contains(\"A\") = " + myList.contains("A"));
// Set
Set<String> mySet = new HashSet<>();
mySet.add("A");
mySet.add("B");
mySet.remove("B");
for (String myItem: mySet) { // iterable
System.out.println("[mySet] myItem = " + myItem);
}
System.out.println("[mySet] mySet.contains(\"A\") = " + mySet.contains("A"));
// Queue
Queue<String> myQueue = new ArrayDeque<>();
myQueue.add("A");
myQueue.add("B");
myQueue.remove("A");
myQueue.remove("B");
for (String myItem: myQueue) { // iterable
System.out.println("[myQueue] myItem = " + myItem);
}
System.out.println("[myQueue] myQueue.contains(\"A\") = " + myQueue.contains("A"));
// Map
Map<String, String> myMap = new HashMap<>();
myMap.put("A", "AA");
myMap.put("B", "BB");
myMap.remove("A");
System.out.println("[myMap] A = " + myMap.get("A"));
System.out.println("[myMap] B = " + myMap.get("B"));
System.out.println("[myMap] myMap.containsKey(\"A\") = " + myMap.containsKey("A"));
}
}
[myList] myItem = B
[myList] yList.contains("A") = false
[mySet] myItem = A
[mySet] mySet.contains("A") = true
[myQueue] myQueue.contains("A") = false
[myMap] A = null
[myMap] B = BB
[myMap] myMap.containsKey("A") = false
Collection Framework
import java.util.*;
java.util package 의 하위에 있으면서, 데이터의 저장, 조회, 삭제를 하는 interface 를 통칭해서 Collection Framework 라고 부른다고 한다.
따라서 Map 은 Collection Interface 를 extends 하지 않았지만... java.util package 하위 에 있으며 데이터의 저장, 조회, 삭제 를 하기 때문에 Collection Framework 에 포함되는 것이다.
참고자료
https://memostack.tistory.com/234
https://www.geeksforgeeks.org/collections-class-in-java/
https://www.javatpoint.com/collections-in-java
https://www.programiz.com/java-programming/map
https://techvidvan.com/tutorials/java-collection-framework/
https://stackoverflow.com/questions/5700135/why-does-map-not-extend-collection-interface
'자바 Java' 카테고리의 다른 글
추상 클래스(abstract class) 와 인터페이스(interface) / 확장 / 예시 / 용도의 차이 (0) | 2023.09.28 |
---|---|
Java 의 접근 제어자 - public, protected, default, private 에 대해서 (0) | 2023.09.23 |
왜 자바 애플릿은 지원이 종료되었을까 (0) | 2023.09.22 |
Java 의 역사와 특징 (0) | 2023.09.22 |
[자바의정석] 배열 (0) | 2023.02.12 |