JAVA/JAVA 기초

Java Collection(List, Set, Map, Queue) Framework

임베디드 친구 2024. 10. 8. 20:55
반응형

자바 컬렉션 프레임워크(Java Collection Framework)는 데이터를 효율적으로 저장, 검색 및 수정하기 위한 다양한 자료 구조와 알고리즘을 제공하는 자바 플랫폼의 핵심 요소입니다. 이를 통해 개발자는 복잡한 데이터 구조를 손쉽게 구현하고 관리할 수 있으며, 코드의 가독성을 높이고 유지보수를 용이하게 할 수 있습니다.

이 글에서는 자바 컬렉션 프레임워크의 주요 구성 요소와 각각의 인터페이스에 대해 설명하고, 실습 코드와 함께 활용 방안을 소개합니다. 글의 목차는 다음과 같습니다.

1. 자바 컬렉션 프레임워크 소개

자바 컬렉션 프레임워크는 데이터를 효율적으로 관리하기 위해 설계된 표준 라이브러리로, 다양한 자료 구조와 알고리즘을 포함하고 있습니다. 컬렉션 프레임워크는 인터페이스와 클래스의 형태로 제공되며, 이들을 통해 데이터를 저장, 검색, 수정, 삭제 등의 작업을 손쉽게 수행할 수 있습니다.

컬렉션 프레임워크는 개발자가 각 자료 구조의 구현 방식을 이해하지 않아도, 인터페이스를 사용하여 표준화된 방식으로 데이터를 처리할 수 있도록 돕습니다. 또한 각 자료 구조의 특성에 따라 메모리 사용량, 성능, 정렬 방식 등이 다르기 때문에, 특정 작업에 맞는 최적의 자료 구조를 선택하여 사용할 수 있습니다.

2. 컬렉션 프레임워크의 주요 구성 요소

자바 컬렉션 프레임워크는 크게 다음 네 가지 주요 인터페이스로 구성됩니다.

  • List: 순서가 있는 데이터를 저장하며 중복을 허용합니다. ArrayList, LinkedList, Vector 등이 대표적인 구현 클래스입니다.
  • Set: 순서가 없고 중복을 허용하지 않는 데이터를 저장합니다. HashSet, TreeSet 등이 구현 클래스입니다.
  • Map: 키(Key)와 값(Value) 쌍으로 데이터를 저장하며, 키는 중복을 허용하지 않습니다. HashMap, TreeMap, LinkedHashMap 등이 있습니다.
  • Queue: 선입선출(FIFO, First-In-First-Out) 방식으로 데이터를 처리합니다. LinkedList, PriorityQueue 등이 있습니다.
    이제 각 인터페이스와 그 구현 클래스를 자세히 살펴보겠습니다.

3. List 인터페이스

List 인터페이스는 순서가 있는 데이터를 저장하는 자료 구조입니다. 각 데이터는 인덱스(0부터 시작)를 통해 접근할 수 있으며, 중복된 요소를 허용합니다. 대표적인 구현 클래스는 ArrayList와 LinkedList가 있습니다.

  • ArrayList
    ArrayList는 가변 크기의 배열로 구현된 자료 구조로, 데이터를 저장할 때마다 동적으로 크기가 늘어납니다. 이로 인해 ArrayList는 임의의 위치에 빠르게 접근할 수 있으나, 중간에 요소를 삽입하거나 삭제할 때는 많은 데이터를 이동시켜야 하므로 성능이 저하될 수 있습니다.
import java.util.ArrayList;
import java.util.List;

public class ArrayListExample {
    public static void main(String[] args) {
        List<String> fruitsList = new ArrayList<>();
        fruitsList.add("사과");
        fruitsList.add("배");
        fruitsList.add("감귤");
        fruitsList.add("수박");

        // Index를 이용한 요소 접근
        for (int i = 0; i < fruitsList.size(); i++) {
            String fruit = fruitsList.get(i);
            System.out.println("Fruit at index " + i + ": " + fruit);
        }

        // 향상된 for문을 이용한 요소 접근
        for (String fruit : fruitsList) {
            System.out.println("Fruit: " + fruit);
        }
    }
}
  • LinkedList
    LinkedList는 노드(Node)로 구성된 자료 구조로, 각 노드는 이전 노드와 다음 노드를 가리키는 참조를 가지고 있습니다. LinkedList는 중간에 데이터를 삽입하거나 삭제할 때 효율적이지만, 임의의 위치에 접근할 때는 모든 노드를 순회해야 하므로 성능이 저하될 수 있습니다.
import java.util.LinkedList;
import java.util.List;

public class LinkedListExample {
    public static void main(String[] args) {
        List<String> fruitsList = new LinkedList<>();
        fruitsList.add("사과");
        fruitsList.add("배");
        fruitsList.add("감귤");
        fruitsList.add("수박");

        // LinkedList의 요소 순회
        for (String fruit : fruitsList) {
            System.out.println("Fruit: " + fruit);
        }

        // 중간에 요소 삽입
        fruitsList.add(2, "딸기");
        System.out.println("After inserting at index 2: " + fruitsList);
    }
}

4. Set 인터페이스

Set 인터페이스는 순서가 없고 중복을 허용하지 않는 자료 구조입니다. 이를 통해 같은 데이터가 두 번 이상 저장되지 않도록 보장할 수 있습니다. 주요 구현 클래스는 HashSet과 TreeSet입니다.

HashSet
HashSet은 해시 테이블을 사용하여 데이터를 저장하며, 해시 알고리즘을 사용하여 빠른 검색과 추가가 가능합니다. 하지만 내부적으로 순서를 유지하지 않기 때문에 데이터를 정렬하여 저장할 수 없습니다.

import java.util.HashSet;
import java.util.Set;

public class HashSetExample {
    public static void main(String[] args) {
        Set<String> fruitsSet = new HashSet<>();
        fruitsSet.add("사과");
        fruitsSet.add("배");
        fruitsSet.add("감귤");
        fruitsSet.add("수박");

        // 중복 요소 추가 시도 (무시됨)
        fruitsSet.add("사과");

        for (String fruit : fruitsSet) {
            System.out.println("Fruit: " + fruit);
        }
    }
}

TreeSet
TreeSet은 이진 트리를 기반으로 데이터를 저장하며, 데이터를 자동으로 정렬된 상태로 유지합니다. 이로 인해 데이터를 검색하거나 범위를 기반으로 작업할 때 유용합니다.

import java.util.Set;
import java.util.TreeSet;

public class TreeSetExample {
    public static void main(String[] args) {
        Set<String> fruitsSet = new TreeSet<>();
        fruitsSet.add("사과");
        fruitsSet.add("배");
        fruitsSet.add("감귤");
        fruitsSet.add("수박");

        // TreeSet은 데이터가 정렬된 상태로 저장된다.
        for (String fruit : fruitsSet) {
            System.out.println("Fruit: " + fruit);
        }
    }
}

5. Map 인터페이스

Map 인터페이스는 키(Key)와 값(Value) 쌍으로 데이터를 저장하는 자료 구조입니다. 키는 중복을 허용하지 않으며, 특정 키를 통해 값에 접근할 수 있습니다. 대표적인 구현 클래스는 HashMap과 TreeMap입니다.

HashMap
HashMap은 해시 맵을 기반으로 데이터를 저장하며, 데이터의 순서가 보장되지 않습니다. 키와 값의 쌍을 이용해 데이터를 빠르게 저장, 검색할 수 있습니다.

import java.util.HashMap;
import java.util.Map;

public class HashMapExample {
    public static void main(String[] args) {
        Map<Integer, String> fruitsMap = new HashMap<>();
        fruitsMap.put(0, "사과");
        fruitsMap.put(1, "배");
        fruitsMap.put(2, "감귤");
        fruitsMap.put(3, "수박");

        // KeySet을 이용한 Map 요소 접근
        for (Integer key : fruitsMap.keySet()) {
            String fruit = fruitsMap.get(key);
            System.out.println("Key: " + key + ", Value: " + fruit);
        }
    }
}

TreeMap
TreeMap은 이진 트리를 사용하여 데이터를 저장하며, 키를 기준으로 데이터를 정렬된 상태로 유지합니다. 주로 정렬된 데이터를 필요로 하는 경우 사용됩니다.

import java.util.Map;
import java.util.TreeMap;

public class TreeMapExample {
    public static void main(String[] args) {
        Map<Integer, String> fruitsMap = new TreeMap<>();
        fruitsMap.put(3, "수박");
        fruitsMap.put(1, "배");
        fruitsMap.put(2, "감귤");
        fruitsMap.put(0, "사과");

        // TreeMap은 키의 순서대로 정렬되어 데이터를 저장
        for (Integer key : fruitsMap.keySet()) {
            String fruit = fruitsMap.get(key);
            System.out.println("Key: " + key + ", Value: " + fruit);
        }
    }
}

6. Queue 인터페이스

Queue 인터페이스는 선입선출(FIFO) 형태의 자료 구조로, 데이터가 추가되면 큐의 뒤쪽에 추가되고, 데이터가 제거될 때는 앞쪽에서부터 제거됩니다. 대표적인 구현 클래스는 LinkedList와 PriorityQueue가 있습니다.

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

public class QueueExample {
    public static void main(String[] args) {
        Queue<String> fruitsQueue = new LinkedList<>();
        fruitsQueue.add("사과");
        fruitsQueue.add("배");
        fruitsQueue.add("감귤");

        // Queue에서 데이터 꺼내기
        while (!fruitsQueue.isEmpty()) {
            String fruit = fruitsQueue.poll();
            System.out.println("Poll: " + fruit);
        }
    }
}

7. 컬렉션 프레임워크의 장점과 주의사항

자바 컬렉션 프레임워크는 데이터 관리의 표준화, 효율성, 다양한 자료 구조 제공 등의 장점을 가지고 있습니다. 하지만 컬렉션을 사용할 때 주의해야 할 몇 가지 사항이 있습니다.

  1. 동기화 문제: 기본적으로 자바 컬렉션 클래스는 스레드-안전(Thread-safe)을 보장하지 않으므로, 멀티스레드 환경에서는 동기화 처리가 필요합니다. Collections.synchronizedList, synchronizedSet 등의 메서드를 사용하여 동기화된 컬렉션을 사용할 수 있습니다.
  2. 메모리 사용: 각 컬렉션 클래스는 내부적으로 메모리를 할당하여 데이터를 저장하므로, 잘못된 자료 구조를 사용할 경우 불필요한 메모리 낭비가 발생할 수 있습니다. 따라서 작업에 적합한 자료 구조를 선택하여 사용해야 합니다.
  3. 성능: 각 컬렉션 클래스는 삽입, 삭제, 검색 등의 작업에 따라 성능 특성이 다르므로, 성능 최적화를 위해 사용 목적에 맞는 자료 구조를 선택해야 합니다.

8. 결론

자바 컬렉션 프레임워크는 다양한 자료 구조와 알고리즘을 제공하여 데이터 관리 작업을 단순화하고, 코드의 가독성과 유지보수성을 높이는 데 큰 도움을 줍니다. List, Set, Map, Queue 등의 인터페이스와 그 구현 클래스를 적절히 사용하여 프로그램의 성능과 효율성을 극대화할 수 있습니다. 각 자료 구조의 특성을 잘 이해하고, 상황에 맞는 컬렉션을 선택하여 사용해 보세요.

위 글에서는 자바 컬렉션 프레임워크의 주요 인터페이스와 사용 예제, 그리고 주의사항을 살펴보았습니다. 이를 통해 다양한 상황에서 데이터를 효율적으로 처리할 수 있는 능력을 갖추길 바랍니다.

반응형