KAKAO.GG
백엔드

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

65870717953200389e7820de
2024. 9. 10.
조회 84
#Java 컬렉션 프레임워크, 자바 collection, 자바 List, 자바 Set, 자바 Queue, 자바 Map

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 값을 허용하지 않습니다.