컬렉션 프레임워크

moon.kick·2025년 2월 20일
0

자바의 컬렉션 프레임워크에서 사용하는 다양한 자료구조를 쉽게 설명해 줄게요. 먼저 표를 해석하는 방법부터 알아보자.


컬렉션 프레임워크 개념 정리

컬렉션 프레임워크는 데이터를 저장하고 관리하는 자료구조 (데이터 구조)를 제공하는데, 주요 인터페이스로 Set, List, Deque, Map이 있다. 각각의 특징을 알아보자.

  • Set (집합): 중복을 허용하지 않는 데이터 저장 방식
  • List (리스트): 순서가 있는 데이터 저장 방식, 중복 가능
  • Deque (덱): 앞뒤 양방향으로 데이터를 넣고 뺄 수 있는 자료구조
  • Map (맵): 키(Key)와 값(Value)을 한 쌍으로 저장하는 자료구조 (딕셔너리와 비슷함)

자료구조 상세 설명

이제 표에 나온 자료구조들을 하나씩 설명해볼게.

1. Set 계열 (중복 없는 데이터 저장)

✔️ HashSet (해시셋)

  • 해시 테이블을 사용해 저장 (즉, 내부적으로 데이터를 빠르게 검색할 수 있도록 정리함)
  • 데이터의 순서를 유지하지 않음
  • contains() 같은 검색 속도가 빠름

✔️ TreeSet (트리셋)

  • 균형 잡힌 트리(레드-블랙 트리)로 데이터를 저장
  • 자동 정렬이 되며, 검색, 추가, 삭제 속도가 일정함
  • 크기 조절 가능 (자동으로 정렬되며 추가/삭제 가능)

✔️ LinkedHashSet (링크드해시셋)

  • 해시 테이블 + 연결 리스트를 사용
  • 데이터 입력 순서를 유지하면서 저장
  • 데이터 추가/삭제는 해시셋보다 약간 느릴 수 있음

2. List 계열 (순서 있는 데이터 저장, 중복 가능)

✔️ ArrayList (배열 리스트)

  • 크기 조절 가능한 배열을 기반으로 동작
  • get(index)빠르게 데이터 접근 가능
  • 하지만 중간에 데이터를 삽입/삭제하면 성능이 떨어짐 (배열을 다시 정리해야 하기 때문)

✔️ LinkedList (연결 리스트)

  • 연결 리스트 구조를 사용 (데이터끼리 연결되어 있음)
  • 중간에 데이터를 삽입하거나 삭제할 때 빠름
  • 하지만 get(index)로 특정 데이터 접근할 때는 속도가 느림 (처음부터 차례대로 찾아야 하기 때문)

3. Deque 계열 (양방향 데이터 처리)

✔️ ArrayDeque (배열 데크)

  • 크기 조절 가능한 배열을 사용해 양쪽에서 데이터를 삽입/삭제할 수 있음
  • addFirst(), addLast()로 앞뒤에서 빠르게 데이터 추가 가능
  • LinkedList보다 빠르고 메모리 사용량이 적음

✔️ LinkedList (연결 리스트) → Deque 기능도 제공

  • LinkedList는 List뿐만 아니라 Deque 기능도 제공
  • 양쪽에서 삽입/삭제할 수 있음 (addFirst(), removeLast() 등)
  • 중간 삽입이 많은 경우 유리하지만, get(index) 속도는 느림

4. Map 계열 (키-값 쌍 저장)

✔️ HashMap (해시맵)

  • 해시 테이블을 사용해 데이터를 저장
  • 키(Key) 중복 불가, 값(Value)은 중복 가능
  • 검색 속도가 빠름
  • 순서를 보장하지 않음

✔️ TreeMap (트리맵)

  • 균형 잡힌 트리(레드-블랙 트리)를 사용해 저장
  • 키 기준으로 자동 정렬됨
  • 검색 속도는 HashMap보다 느릴 수 있지만, 정렬된 상태 유지 가능

✔️ LinkedHashMap (링크드해시맵)

  • 해시 테이블 + 연결 리스트를 사용
  • 입력한 순서를 유지하면서 저장
  • HashMap보다 약간 메모리를 더 사용하지만 순서를 보장하는 장점이 있음

정리 (어떤 경우에 사용하면 좋을까?)

자료구조특징언제 사용하면 좋을까?
HashSet순서 없음, 중복 없음, 검색 빠름데이터 중복 제거할 때
TreeSet자동 정렬, 검색 빠름정렬된 상태로 저장하고 싶을 때
LinkedHashSet입력 순서 유지중복 없이 순서를 유지할 때
ArrayList배열 기반, 빠른 검색조회가 많고, 중간 삽입이 적을 때
LinkedList연결 리스트 기반, 빠른 삽입/삭제삽입/삭제가 많고, 순차 접근할 때
ArrayDeque크기 조절 배열, 양방향 삽입/삭제큐(Queue)처럼 사용할 때
LinkedList (Deque)양방향 삽입/삭제 가능덱(Deque) 기능이 필요할 때
HashMap순서 없음, 검색 빠름키-값 저장, 빠른 검색 필요할 때
TreeMap키 자동 정렬정렬된 데이터 유지할 때
LinkedHashMap입력 순서 유지키-값 저장, 순서를 유지할 때

예제 코드

1. HashSet 예제 (중복 제거)

import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<Integer> set = new HashSet<>();
        set.add(10);
        set.add(20);
        set.add(10);  // 중복 데이터 추가

        System.out.println(set);  // 중복된 10은 한 번만 출력됨
    }
}

2. ArrayList vs LinkedList 속도 비교

import java.util.ArrayList;
import java.util.LinkedList;

public class ListExample {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList = new ArrayList<>();
        LinkedList<Integer> linkedList = new LinkedList<>();

        // ArrayList에 데이터 추가
        for (int i = 0; i < 10000; i++) {
            arrayList.add(i);
        }

        // LinkedList에 데이터 추가
        for (int i = 0; i < 10000; i++) {
            linkedList.add(i);
        }

        // ArrayList의 중간 삽입 속도 측정
        long startTime = System.nanoTime();
        arrayList.add(5000, 100);
        long endTime = System.nanoTime();
        System.out.println("ArrayList 중간 삽입 시간: " + (endTime - startTime) + " ns");

        // LinkedList의 중간 삽입 속도 측정
        startTime = System.nanoTime();
        linkedList.add(5000, 100);
        endTime = System.nanoTime();
        System.out.println("LinkedList 중간 삽입 시간: " + (endTime - startTime) + " ns");
    }
}

결과적으로 LinkedList가 중간 삽입이 더 빠름 (ArrayList는 배열을 이동시켜야 하기 때문)


결론

  • 빠른 검색이 필요하면 HashMap, HashSet, ArrayList
  • 자동 정렬이 필요하면 TreeSet, TreeMap
  • 순서를 유지해야 하면 LinkedHashSet, LinkedHashMap
  • 중간 삽입/삭제가 많으면 LinkedList

이제 자료구조를 이해하고 코드에서 적절한 컬렉션을 사용할 수 있을 거야! 😃

참고문헌 : https://docs.oracle.com/javase/8/docs/technotes/guides/collections/overview.html

profile
@mgkick

0개의 댓글