CodeGym /행동 /JAVA 25 SELF /Collection, List, Set, Map 인터페이스: 계층 구조

Collection, List, Set, Map 인터페이스: 계층 구조

JAVA 25 SELF
레벨 27 , 레슨 0
사용 가능

1. Collection 인터페이스란?

Java에서 인터페이스는 계약과 같습니다. 클래스가 인터페이스를 구현하면 그 메서드 모두의 구현을 제공해야 합니다. 인터페이스 자체는 상태를 보관하지 않고 코드를 포함하지 않습니다(정확히 말하면 Java 8부터 default 메서드가 가능하지만, 여기서는 기본 개념이 중요합니다).

Collection은 Java 컬렉션 대부분의 기반 인터페이스입니다. 컬렉션이 할 수 있는 일, 즉 요소 추가, 삭제, 크기 확인, 포함 여부 확인 등을 정의합니다.

public interface Collection<E> extends Iterable<E> {
    int size();
    boolean isEmpty();
    boolean contains(Object o);
    boolean add(E e);
    boolean remove(Object o);
    void clear();
    Iterator<E> iterator();
    // ... 그리고 유용한 메서드가 더 많음
}

핵심 메서드:

  • add(E e) — 요소 추가.
  • remove(Object o) — 요소 삭제.
  • size() — 요소 개수 확인.
  • isEmpty() — 컬렉션이 비어 있는지 확인.
  • contains(Object o) — 요소 포함 여부 확인.
  • clear() — 컬렉션 비우기.
  • iterator() — 순회를 위한 이터레이터 얻기.

왜 Map은 Collection을 상속하지 않을까?

Map은 컬렉션 가운데서도 별도로 취급됩니다. Map은 단순한 요소 집합이 아니라 ‘키 → 값’ 쌍의 집합이기 때문입니다. 계약도 다르고 메서드 집합도 다릅니다. 예를 들어 Map에는 add 메서드가 없고, 추가는 put(key, value)로 수행합니다. 또한 키를 모르고 값의 존재를 확인하는 것은 의미가 없습니다.

2. 컬렉션의 계층 구조

주요 인터페이스의 “트리”는 대략 다음과 같습니다:

                Iterable
                   |
               Collection
               /    |    \
            List   Set   Queue
                          |
                        Deque
  • Iterable — 가장 기본 인터페이스: for-each로 순회할 수 있는 모든 것.
  • CollectionIterable을 확장하여 요소 컬렉션을 다루는 연산을 추가합니다.
  • 세 가지 주요 가지:
    • List — 순서 있는 리스트, 중복 허용.
    • Set — 고유 요소의 집합, 순서는 구현에 따라 다름.
    • Queue — 큐(보통 FIFO); 하위 유형 — Deque(양방향 큐).

한편 Map은 별도로 존재합니다:

                Map
               /   \
         HashMap  TreeMap

계층 구조 시각화(도식)

                            +--------------------+
                            |     Iterable<E>    |
                            +--------------------+
                                     |
                            +--------------------+
                            |   Collection<E>    |
                            +--------------------+
                          /     |         \
                +--------+   +-------+   +-------+
                |  List  |   |  Set |   | Queue |
                +--------+   +-------+   +-------+
                                     |
                                  +------+
                                  |Deque |
                                  +------+

        +--------------------+
        |      Map<K,V>      |
        +--------------------+

3. List: 순서가 있고 중복을 허용하는 컬렉션

List는 다음과 같은 컬렉션입니다:

  • 요소의 순서가 중요합니다(첫째, 둘째, 셋째 …).
  • 동일한 요소(중복)를 허용합니다.
  • 인덱스로 요소를 가져오고(list.get(2)), 교체하며, 임의 위치에 삽입할 수 있습니다.

구현 예: ArrayList — 인덱스 접근이 빠름; LinkedList — 중간에서 자주 삽입/삭제할 때 유리.

import java.util.*;

List<String> shoppingList = new ArrayList<>();
shoppingList.add("우유");
shoppingList.add("빵");
shoppingList.add("치즈");
shoppingList.add("빵"); // 중복 허용!

System.out.println(shoppingList.get(1)); // "빵"

List의 대표 메서드:

  • add(E e), add(int index, E e)
  • get(int index), set(int index, E e)
  • remove(int index), remove(Object o)
  • indexOf(Object o), lastIndexOf(Object o)

4. Set: 고유한 요소의 집합

Set는 다음과 같은 컬렉션입니다:

  • 각 요소가 고유합니다(중복 없음).
  • HashSet은 저장 순서를 보장하지 않으며, TreeSet은 정렬될 수 있고, LinkedHashSet은 삽입 순서를 유지합니다.

구현 예: HashSet, TreeSet, LinkedHashSet.

import java.util.*;

Set<String> uniqueNames = new HashSet<>();
uniqueNames.add("아냐");
uniqueNames.add("보리스");
uniqueNames.add("아냐"); // 추가되지 않음 — 이미 존재!

System.out.println(uniqueNames.contains("아냐")); // true
System.out.println(uniqueNames.size()); // 2

Set의 대표 메서드:

  • add(E e), remove(Object o)
  • contains(Object o)
  • size(), isEmpty()

5. Map: 키-값 쌍의 컬렉션

Map은 다음과 같은 컬렉션입니다:

  • 각 요소는 키 → 값 쌍입니다.
  • 키는 고유하며, 값은 중복될 수 있습니다.
  • 키로 빠르게 접근합니다.

구현 예: HashMap, TreeMap, LinkedHashMap.

import java.util.*;

Map<String, String> phoneBook = new HashMap<>();
phoneBook.put("아냐", "+19991112233");
phoneBook.put("보리스", "+19994445566");
phoneBook.put("아냐", "+19990001122"); // 아냐의 번호를 덮어쓴다!

System.out.println(phoneBook.get("아냐")); // "+19990001122"
System.out.println(phoneBook.containsKey("보리스")); // true

Map의 대표 메서드:

  • put(K key, V value), get(K key)
  • remove(K key)
  • containsKey(K key), containsValue(V value)
  • keySet(), values(), entrySet()

6. 계층 구조 시각화: 한눈에 보기

간단한 요약 표:

인터페이스 설명 구현 예 핵심 특징
List
순서 있는 리스트
ArrayList, LinkedList
인덱스 접근, 중복 허용
Set
고유 값의 집합
HashSet, TreeSet
오직 고유 요소만
Map
키-값 쌍
HashMap, TreeMap
키는 고유, 값은 제한 없음

도식으로 본 계층 구조:

                Collection
                /    |    \
             List   Set   Queue
                            |
                          Deque

                Map (별도)

7. 어떤 인터페이스를 언제 사용할까

List

  • 요소의 순서가 중요할 때(예: 사용자 활동 내역).
  • 중복이 필요할 때(예: 주문 항목).
  • 인덱스로 빠른 접근/교체가 필요할 때.

Set

  • 고유성이 필요할 때(이메일, 로그인, ID).
  • 순서가 중요하지 않거나, 반대로 자동 정렬된 집합(TreeSet)이 필요할 때.

Map

  • 키와 값을 매핑해야 할 때(ID → 객체, 로그인 → 프로필).
  • 키로 빠른 검색이 필요할 때.
  • 키는 고유해야 하고 값은 고유할 필요가 없을 때.

8. 컬렉션 계층을 사용할 때 자주 하는 실수

실수 1: 변수 선언에서 잘못된 인터페이스 사용. ArrayList<String> list = new ArrayList<>();처럼 작성하면 특정 구현에 강하게 결합됩니다. 더 바람직한 것은 List<String> list = new ArrayList<>(); — 이렇게 하면 구현을 더 쉽게 교체할 수 있습니다.

실수 2: Set에 중복을 추가하고 나타나길 기대함. 이것은 버그가 아니라 특징입니다. Set은 정의상 중복을 저장하지 않습니다. 동일한 값을 다시 넣으면 무시됩니다.

실수 3: Map을 일반 컬렉션처럼 사용. Map은 리스트도 집합도 아닙니다. 순회를 위해 keySet(), values(), entrySet()을 사용하세요.

실수 4: HashSet 또는 HashMap에서 순서를 기대함. HashSetHashMap은 순서를 보장하지 않습니다. 순서가 중요하다면 LinkedHashSet이나 LinkedHashMap을 사용하세요.

실수 5: 고유 요소에 List 사용. 고유성이 필요하다면 Set을 사용하세요. List는 중복을 방지하지 않습니다.

1
과제
JAVA 25 SELF, 레벨 27, 레슨 0
잠금
팔레트에서 색상 찾기 🎨
팔레트에서 색상 찾기 🎨
1
과제
JAVA 25 SELF, 레벨 27, 레슨 0
잠금
게임 인벤토리 추적 🎮
게임 인벤토리 추적 🎮
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION