Java Collection Framework: List, Set, Map, Queue, and Stack

hoon·2025년 1월 21일

JAVA

목록 보기
14/21
타입특징중복 허용순서 보장대표 구현 클래스
List순서가 있는 데이터, 인덱스로 접근 가능OOArrayList, LinkedList, Vector
Set중복 제거, 순서 보장 없음 (일부 예외)XX (HashSet), O (LinkedHashSet)HashSet, LinkedHashSet, TreeSet
Map키-값 쌍 저장, 키는 중복 허용 안 함키: X, 값: OX (HashMap), O (LinkedHashMap)HashMap, LinkedHashMap, TreeMap
Queue선입선출(FIFO), 우선순위 기반 가능OOLinkedList, PriorityQueue
Stack후입선출(LIFO), 동기화 지원 가능OOStack

정리

  • List: 순서와 중복이 중요한 경우.
  • Set: 중복 제거가 필요한 경우.
  • Map: 키-값(Key-Value) 구조로 데이터를 관리할 때.
  • Queue: 선입선출(FIFO) 방식으로 데이터를 처리할 때.
  • Stack: 후입선출(LIFO) 방식으로 데이터를 처리할 때.

1. List

  • 특징:
    • 순서가 있는 데이터의 집합.
    • 중복된 요소를 허용.
    • 인덱스를 기반으로 요소에 접근 가능.
  • 주요 구현 클래스:
    1. ArrayList:

      • 배열 기반으로 구현.
      • 빠른 읽기 속도 (get()).
      • 크기를 동적으로 조절.
      • 삽입/삭제는 느림 (요소 이동 필요).
      • 특징: 데이터 읽기가 많고, 삽입/삭제가 적은 경우 적합.
      List<Integer> list = new ArrayList<>();
      list.add(1);
      list.add(2);
      System.out.println(list.get(0)); // 출력: 1
      
    2. LinkedList:

      • 연결 리스트 기반으로 구현.
      • 빠른 삽입/삭제 속도 (앞/중간/뒤에서).
      • 읽기 속도는 느림 (get()).
      • 특징: 삽입/삭제가 빈번한 경우 적합.
      List<Integer> list = new LinkedList<>();
      list.add(1);
      list.add(2);
      System.out.println(list.get(0)); // 출력: 1
      
    3. Vector:

      • ArrayList와 비슷하지만 스레드 안전.
      • 동기화 지원으로 멀티스레드 환경에서 사용 가능.
      • 동기화로 인해 단일 스레드에서는 비효율적.
      List<Integer> list = new Vector<>();
      list.add(1);
      list.add(2);
      

2. Set

  • 특징:
    • 중복을 허용하지 않는 데이터의 집합.
    • 순서를 보장하지 않거나 특정 규칙에 따라 순서를 유지.
  • 주요 구현 클래스:
    1. HashSet:

      • 해시 기반으로 구현.
      • 순서를 보장하지 않음.
      • 데이터 검색/삽입/삭제가 빠름 (O(1)).
      • 특징: 순서가 중요하지 않고, 중복 제거가 필요할 때 적합.
      Set<Integer> set = new HashSet<>();
      set.add(1);
      set.add(2);
      set.add(1); // 중복 허용하지 않음
      System.out.println(set); // 출력: [1, 2]
      
    2. LinkedHashSet:

      • HashSet과 유사하지만 입력 순서 유지.
      • 삽입한 순서대로 데이터 저장.
      • 특징: 순서를 유지하면서 중복을 제거하고 싶을 때 적합.
      Set<Integer> set = new LinkedHashSet<>();
      set.add(1);
      set.add(2);
      set.add(1); // 중복 허용하지 않음
      System.out.println(set); // 출력: [1, 2]
      
    3. TreeSet:

      • 정렬된 순서로 데이터를 저장.
      • 이진 트리 기반으로 구현.
      • 검색, 삽입, 삭제가 느림 (O(log n)).
      • 특징: 정렬된 데이터가 필요할 때 적합.
      Set<Integer> set = new TreeSet<>();
      set.add(2);
      set.add(1);
      set.add(3);
      System.out.println(set); // 출력: [1, 2, 3]
      

3. Map

  • 특징:
    • 키-값(Key-Value) 쌍으로 데이터를 저장.
    • 키는 중복을 허용하지 않음, 값은 중복 가능.
  • 주요 구현 클래스:
    1. HashMap:

      • 해시 기반으로 구현.
      • 순서를 보장하지 않음.
      • 빠른 검색/삽입/삭제 (O(1)).
      • 특징: 순서가 중요하지 않고, 키-값 쌍이 필요할 때 적합.
      Map<Integer, String> map = new HashMap<>();
      map.put(1, "One");
      map.put(2, "Two");
      map.put(1, "Duplicate"); // 키 중복 시 덮어씀
      System.out.println(map); // 출력: {1=Duplicate, 2=Two}
      
    2. LinkedHashMap:

      • HashMap과 유사하지만 입력 순서 유지.
      • 삽입한 순서대로 데이터 저장.
      • 특징: 순서를 유지하며 키-값 쌍을 저장하고 싶을 때 적합.
      Map<Integer, String> map = new LinkedHashMap<>();
      map.put(1, "One");
      map.put(2, "Two");
      System.out.println(map); // 출력: {1=One, 2=Two}
      
    3. TreeMap:

      • 정렬된 순서로 키를 저장.
      • 이진 트리 기반으로 구현.
      • 검색, 삽입, 삭제가 느림 (O(log n)).
      • 특징: 키의 정렬된 순서가 필요할 때 적합.
      Map<Integer, String> map = new TreeMap<>();
      map.put(2, "Two");
      map.put(1, "One");
      map.put(3, "Three");
      System.out.println(map); // 출력: {1=One, 2=Two, 3=Three}
      

4. Queue

  • 특징:
    • 선입선출(FIFO) 원칙에 따라 동작.
    • 순서를 유지하며, 데이터 삽입과 제거.
  • 주요 구현 클래스:
    1. LinkedList:

      • Queue 인터페이스를 구현.
      • 삽입(offer)과 제거(poll) 작업 지원.
      Queue<Integer> queue = new LinkedList<>();
      queue.offer(1);
      queue.offer(2);
      System.out.println(queue.poll()); // 출력: 1
      
    2. PriorityQueue:

      • 요소를 우선순위 순서에 따라 정렬하여 저장.
      • 기본적으로 최소 힙(Min-Heap) 구조 사용.
      Queue<Integer> queue = new PriorityQueue<>();
      queue.offer(3);
      queue.offer(1);
      queue.offer(2);
      System.out.println(queue.poll()); // 출력: 1
      

5. Stack

  • 특징:
    • 후입선출(LIFO) 원칙에 따라 동작.
    • 요소 삽입(push)과 제거(pop)을 지원.
    • 특징: 재귀적 알고리즘 구현이나 데이터 역순 처리에 적합.
  • 주요 구현 클래스:
    1. Stack:

      • Vector 클래스를 확장한 클래스.
      • 동기화 지원 (멀티스레드 환경에 적합).
      Stack<Integer> stack = new Stack<>();
      stack.push(1);
      stack.push(2);
      System.out.println(stack.pop()); // 출력: 2
      

요약 표

타입구현 클래스특징중복 허용순서 보장
ListArrayList배열 기반, 읽기 빠름OO
LinkedList연결 리스트, 삽입/삭제 빠름OO
VectorArrayList와 유사, 스레드 안전OO
SetHashSet순서 없음, 빠른 검색XX
LinkedHashSet입력 순서 유지XO
TreeSet정렬된 순서XO (정렬 순서)
MapHashMap순서 없음, 빠른 검색키: X, 값: OX
LinkedHashMap입력 순서 유지키: X, 값: OO
TreeMap정렬된 키 순서키: X, 값: OO (정렬 순서)
QueueLinkedList선입선출(FIFO), 일반적인 큐OO
PriorityQueue우선순위 기반OO (우선순위)
StackStack후입선출(LIFO), 동기화 지원OO

결론

  • List: 순서가 중요하고 중복 허용.
  • Set: 중복 제거가 필요하고, 순서를 유지하거나 정렬이 필요할 때.
  • Map: 키-값 쌍을 관리.
  • Queue: 선입선출(FIFO) 방식이나 우선순위 기반 데이터 처리.
  • Stack: 후입선출(LIFO) 방식으로 데이터 처리.

0개의 댓글