[Java] Collection Framework

dustle·2023년 6월 26일

자바 컬렉션 프레임워크는 데이터 크기를 미리 알 수 없는 경우에도 유연하게 관리할 수 있도록 동적 크기를 지원하며, 상황에 맞는 자료구조 선택을 통해 성능 특성을 최적화할 수 있도록 설계되었습니다.

컬렉션은 제네릭 타입이 참조 타입(Object 계열)만 허용하기 때문에 primitive 타입은 직접 저장할 수 없고, 오토박싱을 통해 Wrapper 타입으로 변환되어 저장됩니다.

컬렉션 프레임워크는 크게 Collection 인터페이스와 Map 인터페이스로 나뉩니다.
ListSet 인터페이스를 구현한 컬렉션 클래스들은 공통부분이 많기 때문에, 공통된 부분을 모은 Collection 인터페이스로 상속 되어있습니다. Map 인터페이스 컬렉션들은 두개의 데이터를 묶어 한쌍으로 다루기 때문에 Collection 인터페이스와 따로 분리되어 있다.

List

순서가 있고 중복이 허용됩니다.
크기가 가변적입니다.
인덱스로 데이터 접근이 가능합니다.
중간 삽입/삭제 시 내부 배열 복사가 발생하여 성능 비용이 큽니다.

구현 클래스

  • ArrayList
    • 배열을 기반으로 데이터를 저장
    • 데이터 검색이 빠름
    • 데이터 삽입, 삭제가 느림
  • LinkedList
    • 양방향 포인터 구조
    • 검색이 느림
    • 데이터의 중간 삽입 삭제가 빈번할 경우 빠른 성능
    • 스택, 큐, 덱(Deque) 구현에 활용되는 자료구조
  • Vector
    • 배열을 기반으로 데이터를 저장
    • 동기화(synchronized) 가 적용된 스레드 안전 컬렉션
    • ArrayList보다 성능이 느림 (동기화 오버헤드)
    • 레거시 클래스(구버전 자바와의 호환성을 위해 남음)
  • Stack
    • 배열을 기반으로 데이터를 저장
    • LIFO (Last In First Out)
    • Vector를 상속한 클래스
    • push / pop / peek 연산 제공
    • 동기화 지원 (Vector 기반)
    • 현재는 Deque(ArrayDeque) 사용이 권장됨

Queue

FIFO (First In First Out) 구조를 가집니다.

구현 클래스

  • LinkedList
    • Queue 와 List 인터페이스를 동시에 상속 받음
  • PriorityQueue
    • 우선 순위 큐
    • 원소에 우선 순위를 부여하여 우선 순위가 높은 순으로 정렬되고 꺼내짐
    • 네트워크 제어나 작업 스케쥴링에 사용
    • Comparable 인터페이스를 구현해야 함(compareTo())
    • 내부적으로 배열 기반 이진 힙(Binary Heap) 구조를 사용하여 우선순위를 유지
    • 힙 구조 특성상 요소 비교가 필수이기 때문에 null 요소를 허용하지 않음
  • ArrayDeque
    • Double-Ended Queue 스택과 큐를 합쳐놓은 것
    • Deque의 구현체로 ArrayDeque 와 LinkedList 등이 있음
    • 원형 배열 구조에서 null 을 빈 슬롯 표시로 사용하기 때문에 null 요소는 저장되지 않음

Set

중복을 허용하지 않습니다.
데이터 검색이 빠릅니다.
인덱스 접근이 불가능합니다.

구현 클래스

  • HashSet
    • HashMap 구현 (배열 + 노드)
    • PRESENT = new Object; 를 통해 V값을 처리
    • 저장할 때 hasCode() 메소드를 호출하여 해시 코드를 계산
    • 해시 충돌 발생 시 LinkedList 또는 Red-Black Tree 구조로 관리
  • LinkedHashSet
    • 순서를 가지는 Set 자료
    • LinkedHashMap 구현
    • 추가된 순서 또는 최근에 접근한 순서대로 접근 가능
  • TreeSet
    • Red-Black Tree 기반 구현
    • 데이터를 정렬하여 저장

Map

Key&Value 구조이며 Key는 중복을 허용하지 않고 Value는 중복을 허용합니다.
구현체에 따라 평균 O(1) 또는 O(log n) 성능을 가집니다.
인덱스 접근이 불가능합니다.

구현 클래스

  • HashMap
    • 해시 테이블 기반 구현 (배열 + 노드)
    • key의 hashCode() 를 이용해 해시 인덱스 계산
    • 순서 보장이 되지않음
    • thread-safe 하지 않음
    • null 허용
    • resize 시 rehash 발생
    • 동일한 해시 코드를 가졌다면 equals() 메소드를 통해 동일한지 여부 확인
    • 만약 해시 충돌이 일어날 경우 내부적으로 LinkedList 나 Red Black Tree 로 관리해 충돌을 해결함
  • LinkedHashMap
    • HashMap 상속 + 이중 연결 리스트 구조
    • HashMap과 동일한 해시 기반 성능 제공
    • 삽입 순서 또는 접근 순서 유지 가능
      - new LinkedHashMap<>(16, 0.75f, true) -> 접근 순서 유지
    • LRU Cache 구현에 자주 사용됨
  • Hashtable
    • 메서드 단위 synchronized 적용
    • 성능 저하 발생 (동기화 오버헤드)
    • null 허용 X
    • 레거시 클래스
  • TreeMap
    • Red-Black Tree 기반 구현
    • key 기준으로 자동 정렬 유지
    • 정렬 순서에 따라 탐색 가능
    • 기본 연산 시간 복잡도 O(log n)
    • null key 허용 X, null value 허용

시간 복잡도


출처 : https://gist.github.com/psayre23/c30a821239f4818b0709

0개의 댓글