[Java] 컬렉션 프레임워크

션션·2026년 1월 28일

Java

목록 보기
8/10
post-thumbnail

1. 자료구조와 컬렉션 프레임워크

자료구조의 분류

데이터를 효율적으로 다루기 위한 저장 방식인 자료구조는 크게 두 가지로 나뉩니다.

  • 정적 자료구조 (Static): 배열처럼 크기가 고정된 구조.
  • 동적 자료구조 (Dynamic): 리스트, 스택, 큐처럼 상황에 따라 크기가 변하는 구조.

컬렉션 프레임워크란?

자바에서는 이러한 동적 자료구조를 표준화하여 제공하는데, 이를 컬렉션 프레임워크라고 합니다.

  • 제네릭(Generic) 지원: 타입 안정성을 보장합니다.
  • 표준화: 인터페이스를 통해 일관된 메서드(add, remove, size 등)를 사용합니다.

2. 핵심 인터페이스 계층도

컬렉션 프레임워크는 크게 Collection 인터페이스와 Map 인터페이스로 나뉩니다.

인터페이스별 특징 비교

인터페이스순서 유지중복 허용주요 구현체
ListOOArrayList, LinkedList
SetXXHashSet, TreeSet
MapX (Key)Value만 허용HashMap, TreeMap

3. List 계열: 순서와 중복의 허용

ArrayList vs LinkedList

가장 많이 비교되는 두 클래스입니다. 내부 구조에 따른 성능 차이를 이해하는 것이 핵심입니다.

  • ArrayList: 배열 기반. 인덱스 접근()이 매우 빠르지만, 중간에 데이터를 삽입/삭제할 경우 기존 데이터들을 밀거나 당겨야 하므로 성능이 저하됩니다.
  • LinkedList: 노드(객체) 기반. 각 노드가 앞뒤 주소를 가집니다. 삽입/삭제 시 주소값만 변경하면 되므로 빠르지만, 특정 요소를 찾으려면 처음부터 훑어야 합니다().

💡 핵심 요약: 데이터 조회가 많으면 ArrayList, 삽입/삭제가 빈번하면 LinkedList!


4. Set 계열: 고유함의 보장

중복을 절대 허용하지 않는 주머니 같은 구조입니다.

  • HashSet: 순서를 보장하지 않습니다. 해시 알고리즘을 사용하여 검색 속도가 매우 빠릅니다.
  • 주의: 해시 값이 같다고 무조건 같은 객체는 아닙니다. equals() 메서드를 통한 추가 확인이 필요할 수 있습니다.
  • LinkedHashSet: 이름 그대로 '연결된' HashSet입니다. 삽입 순서를 유지합니다.
  • TreeSet: 이진 탐색 트리(Red-Black Tree) 구조입니다. 데이터가 자동으로 정렬되어 저장됩니다. (단, null 저장 불가)

5. Map 계열: Key-Value 쌍

키(Key)와 값(Value)으로 이루어진 구조입니다. 학번(Key)-이름(Value) 관계를 생각하면 쉽습니다.

  • HashMap: 가장 보편적인 Map. 순서를 보장하지 않습니다.
  • 해시 충돌(Collision): 서로 다른 키가 같은 해시 값을 가질 경우, 내부적으로 체이닝(Chaining) 방식을 사용하여 연결 리스트로 관리합니다.
  • TreeMap: 키를 기준으로 자동 정렬합니다. null 키를 허용하지 않습니다.

6. 객체 정렬 (Comparable & Comparator)

사용자 정의 객체(예: Student 클래스)를 정렬할 때는 기준이 필요합니다.

1) Comparable: "나 스스로 정렬 기준을 가질래"

클래스 내부에 직접 구현하며, compareTo 메서드를 오버라이딩합니다.

public class Product implements Comparable<Product> {
    private String name;
    private int price;

    @Override
    public int compareTo(Product other) {
        // 가격 기준 오름차순 정렬
        return Integer.compare(this.price, other.price);
    }
}

2) Comparator: "외부에서 별도의 기준을 줄게"

익명 클래스나 람다(Lambda)를 사용하여 1회성 정렬이나 다양한 기준을 적용할 때 유용합니다.

// 람다를 이용한 가격 내림차순 정렬 예시
Collections.sort(productList, (p1, p2) -> Integer.compare(p2.getPrice(), p1.getPrice()));

0개의 댓글