자바 Java

Collection 과 Map (왜 Map 은 Collection 을 extends 하지 않을까?)

leexx 2023. 10. 5. 23:58

 

Collection Interface

다양한 자료구조들의 부모(?) 이며 iterable 하다 (순회할 수 있다, Iterable 인터페이스를 extends 했다). 그리고 하나의 값만 추가할 수 있다. 여기

 

 

Collection interface 를 extends 한 자료구조들 

출처는 https://techvidvan.com/tutorials/java-collection-framework/, 이미지를 클릭하면 이동합니다

그림에서 알 수 있듯이, 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