자바 컬렉션 프레임워크 핵심 정리 List Set Map과 동기화 전략

JV-ST-16calendar_today2026-02-05 18:37#Java #Level1

컬렉션 프레임워크의 목적

컬렉션 프레임워크는 자료구조와 사용 규칙을 분리하기 위한 표준 구조입니다.

  • 분리의 의미입니다.
    • 인터페이스로 사용 규칙을 통일합니다.
    • 구현체로 성능과 특성을 분리합니다.

Collection 인터페이스의 역할

Collection은 대부분 컬렉션의 공통 규약입니다.

객체의 집합을 다루는 기본 인터페이스입니다.

  • 대표 공통 동작입니다.
    • add
    • remove
    • size
    • iterator

컬렉션 계열의 큰 분류

자주 쓰는 분류는 List, Set, Map입니다.

  • List입니다.

    • 순서가 있음
    • 중복 허용
  • Set입니다.

    • 중복 허용하지 않음
    • 순서 보장하지 않음
  • Map입니다.

    • key value 구조
    • Collection 계열과는 별도 인터페이스입니다.
    • key는 중복 불가입니다.
    • value는 중복 가능입니다.

List 인터페이스 핵심

List는 순서 기반 접근을 지원합니다.

index로 원소에 접근할 수 있습니다.

  • 주요 메서드입니다.
    • boolean add(E)
    • void add(int index, E)
    • E get(int index)
    • E remove(int index)
    • boolean contains(Object)
    • boolean isEmpty()
    • int size()

ArrayList의 특성

ArrayList는 동적 배열 기반 자료구조입니다.

내부적으로 배열을 사용합니다.

  • 장점입니다.

    • index 기반 접근이 빠릅니다.
    • 조회 중심 워크로드에 유리합니다.
  • 단점입니다.

    • 중간 삽입과 삭제 비용이 큽니다.
    • 요소를 밀거나 당기는 작업이 필요합니다.

LinkedList의 특성

LinkedList는 노드가 연결된 구조입니다.

배열처럼 연속된 메모리 구조가 아닙니다.

  • 구조 특징입니다.

    • 이전 노드와 다음 노드 참조를 저장합니다.
  • 장점입니다.

    • 삽입과 삭제가 빠릅니다.
    • 노드 연결만 변경합니다.
  • 단점입니다.

    • index 접근이 느립니다.
    • 처음 또는 끝부터 순차 탐색이 필요합니다.

Vector의 위치

Vector는 오래된 List 구현체입니다.

주요 메서드가 synchronized로 동기화되어 있습니다.

  • 특징입니다.
    • thread-safe 성질을 제공합니다.
    • 동기화 오버헤드가 큽니다.

“현재는 거의 사용하지 않음”이라는 요약은 방향성이 맞습니다.
다만 완전히 사라진 것은 아니고 레거시 호환성에서 남아 있습니다. (레거시 코드에서 발견되는 경우가 많습니다)


Set 인터페이스 핵심

Set은 중복을 허용하지 않는 집합입니다.

객체의 순서를 보장하지 않습니다.

  • 주요 메서드입니다.
    • boolean add(E)
    • boolean remove(Object)
    • boolean contains(Object)
    • boolean isEmpty()
    • int size()
    • Iterator iterator()

HashSet의 특성

HashSet은 중복 제거 용도로 자주 씁니다.

내부적으로 HashMap을 사용합니다.

  • 내부 동작 요약입니다.

    • 요소를 HashMap의 key로 저장합니다.
    • 순서가 보장되지 않습니다.
  • 동일성 판단 기준입니다.

    • equals()
    • hashCode()
  • 중요한 규칙입니다.

    • equals()만 재정의하면 위험합니다.
    • hashCode()가 다르면 같은 객체로 인식되지 않을 수 있습니다.
    • equals()hashCode()는 반드시 함께 재정의해야 합니다.
  • 동시성 특성입니다.

    • 기본적으로 thread-safe가 아닙니다.

TreeSet의 특성

TreeSet은 정렬된 상태로 저장합니다.

내부적으로 트리 구조를 사용합니다.

  • 정렬 기준이 필요합니다.
    • Comparable
      • 객체 자체의 기본 정렬 기준입니다.
    • Comparator
      • 외부에서 정렬 기준을 주입합니다.

Map 인터페이스 핵심

Map은 key value 구조입니다.

key는 중복될 수 없습니다.

value는 중복될 수 있습니다.

Map은 “키 중복 금지” 관점에서 Set 성격을 일부 가집니다.


HashMap의 특성

HashMap은 가장 많이 사용되는 Map 구현체입니다.

기본적으로 thread-safe가 아닙니다.

  • key 비교에서 중요한 것들입니다.
    • equals()
    • hashCode()

Hashtable의 위치

Hashtable은 thread-safe Map 구현체입니다.

모든 주요 메서드가 synchronized로 동기화되어 있습니다.

  • 특징입니다.
    • 동기화 비용이 큽니다.
    • 현재는 거의 사용하지 않는 편입니다.

“thread-safe가 필요하면 Hashtable”은 예전 방식에 가깝습니다.
현대 자바에서는 보통 ConcurrentHashMap을 먼저 고려합니다. (세밀한 락 전략을 사용하기 때문입니다)


TreeMap의 특성

TreeMap은 key 기준으로 정렬됩니다.

내부적으로 트리 구조를 사용합니다.

정렬 기준이 필요합니다.


동기화된 컬렉션의 접근

Collections.synchronizedXXX는 기존 컬렉션을 감싸 동기화를 제공합니다.

레거시 방식으로 분류되는 경우가 많습니다.

  • 특징입니다.
    • 전체 락 기반입니다.
    • 동시성 상황에서 성능 저하가 발생할 수 있습니다.

동시성 컬렉션의 접근

java.util.concurrent는 동시성을 고려한 컬렉션을 제공합니다.

대표 예시는 ConcurrentHashMap입니다.

  • 특징입니다.
    • 부분 락 구조를 활용합니다.
    • 동시성 + 성능을 함께 노립니다.

선택 기준 요약

상황별로 선택 기준을 단순화할 수 있습니다.

  • 순서와 중복이 필요합니다.

    • List 계열이 후보입니다.
    • 조회 위주면 ArrayList가 유리합니다.
    • 중간 삽입 삭제가 많으면 LinkedList를 검토합니다.
  • 중복 제거가 핵심입니다.

    • Set 계열이 후보입니다.
    • 빠른 중복 체크면 HashSet입니다.
    • 정렬이 필요하면 TreeSet입니다.
  • key value 매핑이 필요합니다.

    • Map 계열이 후보입니다.
    • 일반적이면 HashMap입니다.
    • 정렬이 필요하면 TreeMap입니다.
  • 멀티스레드에서 공유합니다.

    • 레거시 방식이면 Collections.synchronizedXXX입니다.
    • 동시성과 성능을 함께 보면 ConcurrentHashMap이 우선 후보입니다.
    • 컴파일 타임 체크: 컴파일 단계에서 타입 변수가 실제 타입으로 변환되므로 미리 오류를 방지할 수 있습니다.
  • 사용법 및 제약 사항
    • 선언 방식: 클래스, 인터페이스, 메서드 선언 시 타입 매개변수(<T>)를 기술합니다.
    • 타입 제한: <T extends Parent> 형식을 통해 특정 클래스의 자식 클래스로만 타입을 제한할 수 있습니다.
    • 참조 타입만 가능: int, double 같은 기본 타입(Primitive Type)은 사용할 수 없으며, 반드시 Integer, Double 같은 래퍼 클래스를 사용해야 합니다.
    • static 사용 불가: static 멤버는 인스턴스가 생성되기 전에 메모리에 올라가므로, 인스턴스화 시점에 타입이 결정되는 제네릭 타입 변수를 사용할 수 없습니다.

3. 타입 매개변수 관례

코드의 가독성을 위해 자바에서는 관용적으로 사용하는 알파벳이 있습니다.

약어 의미 설명
T Type 일반적인 타입을 의미합니다.
E Element 리스트 등 요소(Element)를 의미합니다.
K Key Map 등에서 키(Key)를 의미합니다.
V Value Map 등에서 값(Value)을 의미합니다.
N Number 숫자 타입을 의미합니다.
S, U Subsequent 2번째, 3번째 타입을 선언할 때 사용합니다.

4. 제네릭 메서드 (Generic Method)

클래스 전체가 아닌, 특정 메서드 하나에만 제네릭을 적용하고 싶을 때 사용합니다.

  • 선언 형식
    • public static <T> T genMethod(T t) { ... }
  • 특징
    • 메서드 반환 타입 앞에 <T>를 명시하여 해당 메서드 내에서만 사용할 타입임을 선언합니다.
    • 클래스 레벨의 제네릭과 독립적으로 타입을 운영할 수 있어 유연성이 높습니다.