본문 바로가기
Programming

JAVA 컬렉션 프레임워크

by 나무수피아는 지식의 가지를 뻗어가는 공간입니다. 2025. 11. 19.
반응형

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

컬렉션 프레임워크는 자바에서 데이터를 효율적으로 저장하고 관리하기 위한 표준화된 구조와 알고리즘의 집합입니다. 자바의 컬렉션은 배열보다 훨씬 유연하며, 다양한 종류의 데이터를 저장하고 처리하는 데 최적화되어 있습니다. 이번 강의에서는 컬렉션의 기본 구조인 List, Set, Map을 중심으로 주요 구현 클래스인 ArrayList, HashSet, HashMap의 사용법과 함께, IteratorGenerics에 대해서도 자세히 학습합니다.


📌 목차

  1. List, Set, Map 구조 이해
  2. ArrayList 사용법
  3. HashSet과 중복 제거
  4. HashMap의 키-값 저장 방식
  5. Iterator와 Generics

🔹 1. List, Set, Map 구조 이해

자바 컬렉션 프레임워크는 크게 세 가지 주요 인터페이스로 나눌 수 있습니다. 각 인터페이스는 데이터를 저장하는 방식과 특징이 다르며, 상황에 맞게 적절히 사용해야 합니다.

  • List: 데이터의 순서를 유지하며 중복을 허용합니다. 예를 들어 ArrayList는 배열처럼 인덱스를 사용해 빠르게 접근할 수 있습니다.
  • Set: 데이터의 순서를 보장하지 않으며, 중복을 허용하지 않습니다. 대표적으로 HashSet이 있어 유일한 값만 저장할 때 사용합니다.
  • Map: 키(key)와 값(value)의 쌍으로 데이터를 저장하는 구조입니다. 키는 중복될 수 없으며, 값을 빠르게 조회할 수 있도록 해줍니다. 대표적으로 HashMap이 있습니다.

이 세 가지 구조는 각각 장단점이 있으며, 데이터의 특성과 필요에 따라 적절한 컬렉션을 선택하는 것이 중요합니다.


🔹 2. ArrayList 사용법

ArrayList는 가장 많이 사용되는 List 구현체로, 배열 기반으로 동작합니다. 크기가 자동으로 늘어나며, 인덱스를 이용한 빠른 접근이 장점입니다. 또한 중복 데이터를 허용하기 때문에, 같은 값이 여러 번 저장될 수 있습니다.

import java.util.ArrayList;

public class ArrayListExample {
    public static void main(String[] args) {
        ArrayList<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Apple");  // 중복 허용

        for (String fruit : fruits) {
            System.out.println(fruit);
        }
    }
}

출력:
Apple
Banana
Apple

위 예제에서 볼 수 있듯이, ArrayList는 중복된 데이터를 그대로 저장하며, 순서대로 출력됩니다. 인덱스를 활용해 특정 위치에 접근하거나 삽입, 삭제도 쉽게 할 수 있습니다.


🔹 3. HashSet과 중복 제거

HashSet중복을 허용하지 않는 Set 인터페이스 구현체입니다. 내부적으로 해시 함수를 이용해 데이터를 저장하기 때문에, 저장 순서가 유지되지 않고, 중복된 데이터는 자동으로 걸러집니다.

import java.util.HashSet;

public class HashSetExample {
    public static void main(String[] args) {
        HashSet<String> names = new HashSet<>();
        names.add("Alice");
        names.add("Bob");
        names.add("Alice"); // 중복 저장되지 않음

        for (String name : names) {
            System.out.println(name);
        }
    }
}

출력 예시:
Bob
Alice (순서는 보장되지 않음)

HashSet은 데이터의 중복을 자동으로 제거해 줍니다. 단, 저장 순서를 보장하지 않으므로 순서가 중요한 경우에는 사용하지 않는 것이 좋습니다.


🔹 4. HashMap의 키-값 저장 방식

HashMap은 Map 인터페이스를 구현한 대표적인 컬렉션으로, 키와 값 쌍으로 데이터를 저장합니다. 키는 중복될 수 없으며, 같은 키로 데이터를 다시 저장하면 기존 값이 덮어씌워집니다.

import java.util.HashMap;

public class HashMapExample {
    public static void main(String[] args) {
        HashMap<String, Integer> scores = new HashMap<>();
        scores.put("Tom", 90);
        scores.put("Jane", 85);
        scores.put("Tom", 95);  // 기존 값 덮어쓰기

        System.out.println("Tom 점수: " + scores.get("Tom"));
    }
}

출력: Tom 점수: 95

위 예제처럼 동일한 키 "Tom"으로 두 번 값을 넣으면, 마지막에 넣은 값이 저장됩니다. 키를 이용해 빠르게 값에 접근할 수 있어, 데이터 조회에 매우 효율적입니다.


🔹 5. Iterator와 Generics

자바 컬렉션을 다룰 때 가장 기본이 되는 도구 중 하나가 Iterator입니다. Iterator는 컬렉션 요소를 순차적으로 접근할 수 있도록 도와줍니다. 그리고 Generics는 컴파일 시 타입을 체크해 타입 안정성을 높여줍니다. 즉, 코드 작성 시 타입 캐스팅 없이도 안전하게 컬렉션을 사용할 수 있습니다.

import java.util.*;

public class IteratorGenericsExample {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("Java");
        list.add("Python");

        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            System.out.println(it.next());
        }
    }
}

Iterator는 hasNext() 메서드로 다음 요소의 존재 여부를 확인하고, next() 메서드로 다음 요소를 반환합니다. Generics 덕분에 String 타입으로 안전하게 사용할 수 있습니다.


🔹 6. 컬렉션 활용 팁과 주의사항

컬렉션 프레임워크를 사용할 때는 데이터의 특성과 처리 요구사항을 명확히 이해하는 것이 중요합니다. List는 순서와 중복이 중요할 때, Set은 중복 제거가 필요할 때, Map은 키-값 쌍 관리가 필요할 때 적합합니다.

또한, 컬렉션은 모두 객체 타입만 저장할 수 있으므로, 기본형 타입(int, char 등)은 래퍼 클래스(Integer, Character 등)를 사용해야 합니다. 컬렉션의 크기나 성능 요구사항에 따라 ArrayList 대신 LinkedList, TreeSet 등 다른 구현체를 선택할 수도 있습니다.

멀티스레드 환경에서는 동기화가 적용된 VectorCollections.synchronizedList() 등을 활용하거나, ConcurrentHashMap 같은 병렬 처리용 컬렉션을 사용하는 것이 좋습니다.


🔹 7. 자바 8 이후의 컬렉션 변화와 람다 활용

자바 8부터는 컬렉션과 람다 표현식을 결합해 훨씬 간결하고 직관적인 코드 작성을 할 수 있습니다. 예를 들어, forEach 메서드로 간단히 컬렉션을 순회할 수 있고, stream() API를 활용해 필터링, 매핑, 집계 등의 작업도 쉽게 처리합니다.

import java.util.ArrayList;

public class StreamExample {
    public static void main(String[] args) {
        ArrayList<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Banana");
        fruits.add("Cherry");
        fruits.add("Apple");

        fruits.stream()
              .distinct()
              .filter(fruit -> fruit.startsWith("A"))
              .forEach(System.out::println);
    }
}

출력:
Apple

위 코드는 스트림 API로 중복 제거(distinct())와 특정 조건(filter())을 적용해 "A"로 시작하는 과일 이름만 출력합니다. 이처럼 자바 8 이후 컬렉션 활용법은 더욱 강력하고 편리해졌습니다.


🔹 8. 정리

자바의 컬렉션 프레임워크는 매우 유연하고 강력한 데이터 처리 도구입니다. List, Set, Map의 특성과 용도를 이해하고, 각각의 구현체를 적절히 선택해 사용하는 것이 핵심입니다. 또한, Iterator와 Generics를 활용해 안전하고 효율적인 코드 작성을 할 수 있으며, 자바 8 이상의 기능을 접목하면 생산성을 크게 높일 수 있습니다.

앞으로 실무에서 컬렉션을 능숙하게 다룰 수 있도록, 다양한 예제를 통해 직접 코딩하고 응용해 보는 연습이 중요합니다.

반응형

'Programming' 카테고리의 다른 글

JAVA 파일 입출력 (File I/O)  (54) 2025.11.21
JAVA 문자열 처리  (58) 2025.11.20
JAVA 예외 처리  (59) 2025.11.18
JAVA 객체지향 프로그래밍 (OOP)  (60) 2025.11.17
JAVA 패키지와 접근제한자  (38) 2025.11.16