Java 컬렉션 프레임워크 (Collection Framework)

KUKJIN LEE's profile picture

KUKJIN LEE3개월 전 작성

Java 컬렉션 프레임워크는 데이터를 효율적으로 저장하고 관리하기 위한 데이터 구조알고리즘을 제공하는 일련의 클래스와 인터페이스 집합입니다. 컬렉션 프레임워크를 사용하면 여러 개의 데이터를 한 번에 다룰 수 있으며, 다양한 방법으로 데이터를 추가, 삭제, 검색할 수 있습니다.

 

1. 주요 컬렉션 인터페이스

  • Collection: 가장 기본적인 컬렉션 인터페이스로, 모든 컬렉션 클래스의 부모 인터페이스입니다. 이 인터페이스는 데이터를 추가하고, 삭제하고, 조회하는 기본적인 메서드들을 정의합니다.

  • List: 순서가 있는 요소의 집합을 나타냅니다. 중복된 요소를 허용하며, 인덱스를 사용해 요소에 접근할 수 있습니다.

  • Set: 중복을 허용하지 않는 요소의 집합입니다. 순서가 유지되지 않을 수 있습니다.

  • Queue: 먼저 들어온 요소가 먼저 나가는(FIFO) 자료 구조를 나타냅니다.

  • Map: 키와 값의 쌍으로 데이터를 저장하는 구조입니다. 각 키는 고유해야 하며, 키를 통해 값을 빠르게 검색할 수 있습니다.

 

2. 주요 인터페이스와 구현 클래스

2.1 List 인터페이스

List는 순서가 있는 컬렉션을 나타내며, 중복된 요소를 허용합니다. 인덱스를 기반으로 요소에 접근할 수 있습니다.

  • ArrayList: 배열 기반의 리스트로, 요소를 동적으로 관리합니다. 읽기 속도가 빠르며, 요소의 추가 및 삭제는 느립니다.

  • LinkedList: 연결 리스트 기반의 구현체로, 요소의 추가 및 삭제가 빠르지만 읽기 속도는 상대적으로 느립니다.

  • Vector: ArrayList와 유사하지만, 스레드 안전(thread-safe)을 보장합니다.

  • Stack: LIFO(Last In, First Out) 방식의 자료 구조로, 스택의 동작을 수행합니다.

import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Orange");

        System.out.println(list.get(1)); // Banana 출력
        list.remove("Banana");

        System.out.println(list); // [Apple, Orange] 출력
    }
}

 

2.2 Set 인터페이스

Set은 중복된 요소를 허용하지 않는 컬렉션입니다. 요소의 순서는 유지되지 않을 수 있으며, 주로 고유한 데이터를 관리할 때 사용됩니다.

  • HashSet: 해시 테이블을 사용해 요소를 관리하며, 요소의 순서는 보장되지 않습니다.

  • LinkedHashSet: HashSet과 비슷하지만, 요소가 추가된 순서를 유지합니다.

  • TreeSet: 이진 검색 트리를 사용해 요소를 정렬된 상태로 저장합니다.

import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Orange");
        set.add("Apple"); // 중복 요소 추가 시도

        System.out.println(set); // [Apple, Orange, Banana] 출력 (중복 허용 안됨)
    }
}

 

2.3 Queue 인터페이스

Queue는 FIFO(First In, First Out) 방식을 따르는 자료 구조로, 줄서기와 같은 구조를 구현할 때 사용됩니다.

  • LinkedList: List뿐만 아니라 Queue로도 사용될 수 있습니다.

  • PriorityQueue: 요소들이 우선순위에 따라 정렬되어 관리됩니다.

import java.util.LinkedList;
import java.util.Queue;

public class QueueExample {
    public static void main(String[] args) {
        Queue<String> queue = new LinkedList<>();
        queue.add("Apple");
        queue.add("Banana");
        queue.add("Orange");

        System.out.println(queue.poll()); // Apple 출력 (FIFO 순서)
        System.out.println(queue); // [Banana, Orange] 출력
    }
}

 

2.4 Map 인터페이스

Map은 키와 값의 쌍으로 데이터를 저장하는 자료 구조입니다. 각 키는 고유하며, 이를 통해 빠르게 값을 검색할 수 있습니다.

  • HashMap: 해시 테이블 기반의 Map 구현체로, 요소의 순서를 보장하지 않습니다.

  • LinkedHashMap: HashMap과 유사하지만, 요소가 추가된 순서를 유지합니다.

  • TreeMap: 키를 정렬된 순서로 저장하는 Map 구현체입니다.

import java.util.HashMap;

public class HashMapExample {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("Apple", 1);
        map.put("Banana", 2);
        map.put("Orange", 3);

        System.out.println(map.get("Banana")); // 2 출력
        System.out.println(map); // {Apple=1, Orange=3, Banana=2} 출력
    }
}

 

3. 컬렉션 클래스의 장단점 비교

  • ArrayList vs LinkedList

    • ArrayList는 배열 기반이므로 인덱스를 통한 빠른 접근이 가능하지만, 요소를 추가하거나 삭제할 때 많은 비용이 발생할 수 있습니다.

    • LinkedList는 연결 리스트 기반이므로 요소 추가/삭제가 빠르지만, 인덱스를 통한 접근 속도가 느립니다.

  • HashSet vs TreeSet

    • HashSet은 요소의 순서를 보장하지 않으며, hashCode()equals() 메서드에 의존하여 고유성을 판단합니다.

    • TreeSet은 요소들을 정렬된 상태로 유지하지만, 정렬하는 데 시간이 더 소요됩니다.

  • HashMap vs TreeMap

    • HashMap은 키의 순서를 보장하지 않고, 빠른 검색이 가능합니다.

    • TreeMap은 키를 정렬된 순서로 저장하며, 데이터를 정렬된 상태로 유지해야 할 때 유용합니다.

 

컬렉션 사용 시 유의할 점

  1. Null 값 허용 여부: 일부 컬렉션은 null 값을 허용하지 않을 수 있습니다. 예를 들어, HashSetHashMapnull 값을 허용하지만, TreeSetTreeMapnull 값을 허용하지 않습니다.

New Tech Posts