JAVA

자바 컬렉션 프레임워크

국자집사 2024. 12. 10. 17:38

[ 목차 ]

    컬렉션 프레임워크란?

    컬렉션(Collection)이란?

    • 정의: 컬렉션은 객체의 그룹(데이터 그룹)을 나타낸다. 즉, 데이터를 모아 관리하는 컨테이너 역할을 한다.
    • : 학생 목록, 상품 카탈로그, 사용자 데이터 등.
    • 특징:
      • 데이터를 저장, 검색, 삭제, 수정하는 데 사용.
      • 다양한 데이터 구조를 지원하여 유연한 데이터 관리 가능.

    프레임워크(Framework)란?

    • 정의: 소프트웨어 개발을 위한 표준화된 구조와 도구의 집합.
    • 특징:
      • 코드 재사용성과 개발 생산성을 높임.
      • 일정한 설계 원칙과 가이드라인을 제공하여 유지보수가 쉬움.

     

    컬렉션 프레임워크란?

    • 정의: 컬렉션을 효과적으로 관리하기 위한 데이터 구조와 알고리즘의 표준화된 집합.
    • 목적:
      • 데이터 그룹 관리(삽입, 삭제, 탐색 등)를 간단하고 일관된 방식으로 처리.
      • 다양한 데이터 구조 및 알고리즘을 제공하여 효율적 데이터 관리.
    • 특징:
      • 표준화된 인터페이스 제공.
      • 다양한 데이터 구조 및 알고리즘 구현체 포함.
      • 제네릭(Generic) 지원으로 타입 안정성과 재사용성 보장.

    이미지 출처: https://www.ict.social/java/collections-and-streams-in-java/java-collections-framework


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

    컬렉션 프레임워크는 크게 인터페이스, 구현 클래스, 알고리즘으로 구성된다.

     

    1. 인터페이스 (Interfaces)

    컬렉션 프레임워크의 핵심 인터페이스는 다음과 같다:

    1. Iterable : 컬렉션을 순회(iterate)하는 기능 제공, for-each 루프를 지원.
    2. Collection : 모든 컬렉션의 공통 기능 정의.
    3. List : 순서를 유지하며, 인덱스를 통해 접근 가능.
    4. Set : 중복을 허용하지 않음.
    5. Queue : FIFO(First-In-First-Out) 방식으로 데이터 관리.
    6. Map : 키-값 쌍 데이터를 관리. 컬렉션 인터페이스와는 별도로 설계됨.
    7. SortedSet & SortedMap : 정렬된 데이터를 관리.
    8. NavigableSet & NavigableMap : 정렬된 데이터에 탐색 기능 추가.

    2. 구현 클래스 (Classes)

    1. List 구현체:
      • ArrayList: 배열 기반, 인덱스 접근에 유리.
      • LinkedList: 노드 기반, 삽입/삭제에 유리.
      • Vector: 동기화된 ArrayList.
      • Stack: LIFO(Last In First Out) 방식으로 동작.
    2. Set 구현체:
      • HashSet: 해시 기반, 중복 제거.
      • TreeSet: 정렬된 순서로 관리.
      • LinkedHashSet: 삽입 순서를 유지.
    3. Map 구현체:
      • HashMap: 키-값 쌍 관리, 빠른 검색.
      • TreeMap: 키 순서대로 정렬.
      • LinkedHashMap: 삽입 순서를 유지.
      • Hashtable: 동기화된 HashMap.
    4. Queue 구현체:
      • PriorityQueue: 우선순위 기반 데이터 관리.
      • LinkedList: 큐와 리스트 모두로 활용 가능.
      • ArrayDeque: 스택 및 큐로 활용 가능한 덱(Deque) 구현체.
    5. Concurrent 컬렉션 클래스:
      • 멀티스레드 환경에서 동시성을 보장하며 기본 컬렉션 클래스의 확장된 형태.
      • ConcurrentHashMap: 특정 버킷 단위로 락을 걸어 동시성을 보장.
      • CopyOnWriteArrayList: 쓰기 작업 시 기존 데이터를 복사하여 동시성 문제 해결.
      • BlockingQueue: 멀티스레드 환경에서 생산자-소비자 패턴 구현에 유용.

    3. 알고리즘 (Algorithms)

    컬렉션 프레임워크는 데이터 조작을 위한 다양한 알고리즘을 제공한다:

    • 정렬(Sorting): Collections.sort()를 사용하여 컬렉션 정렬.
    • 검색(Search): Collections.binarySearch()로 이진 검색 수행.
    • 셔플(Shuffle): Collections.shuffle()로 컬렉션 요소를 무작위로 섞기.
    • 최소값/최대값: Collections.min()Collections.max()를 통해 최소/최대 요소 찾기.
    • 반복자 동작: Collections.unmodifiableCollection()을 사용하여 읽기 전용 컬렉션 생성.

     


     

    인터페이스별 특징과 주요 메서드

    1. Iterable

    • 특징:
      • 컬렉션을 순회(iterate)하는 기능 제공.
      • for-each 루프에서 사용 가능.
    • 주요 메서드:
      • iterator(): 컬렉션의 반복자 반환.

    2. Collection

    • 특징:
      • 모든 컬렉션의 공통 기능 정의.
    • 주요 메서드:
      • add(E e): 요소 추가.
      • remove(Object o): 요소 삭제.
      • size(): 컬렉션 크기 반환.
      • contains(Object o): 특정 요소 포함 여부 확인.

    3. List

    • 특징:
      • 순서가 있는 데이터 관리.
      • 인덱스 기반 접근 가능.
    • 주요 메서드:
      • get(int index): 특정 위치의 요소 반환.
      • set(int index, E element): 특정 위치의 요소 수정.
      • indexOf(Object o): 특정 요소의 첫 번째 인덱스 반환.

    4. Set

    • 특징:
      • 중복을 허용하지 않는 데이터 관리.
    • 주요 메서드:
      • add(E e): 요소 추가.
      • remove(Object o): 요소 삭제.

    5. Queue

    • 특징:
      • FIFO(First-In-First-Out) 방식으로 데이터 관리.
    • 주요 메서드:
      • offer(E e): 요소 추가.
      • poll(): 첫 번째 요소 반환 및 삭제.
      • peek(): 첫 번째 요소 반환.

    6. Map

    • 특징:
      • 키-값 쌍으로 데이터를 관리하며, 효율적인 검색과 업데이트를 제공.
      • 컬렉션 인터페이스를 상속받지 않음. 이는 Map이 단순한 데이터 그룹이 아닌, 키-값 관계를 중심으로 동작하기 때문.
    • 주요 메서드:
      • put(K key, V value): 키-값 추가.
      • get(Object key): 특정 키에 대한 값 반환.
      • remove(Object key): 키-값 삭제.
    • 왜 Map은 컬렉션 인터페이스를 상속받지 않는가?
      • Map은 키-값 쌍 데이터를 관리하는 구조로, Collection과는 다른 데이터 관리 체제을 가진다.
      • Map의 데이터는 키를 기준으로 고유하며, 이는 단순히 요소를 추가하고 제거하는 Collection 인터페이스와는 다른 설계 철학을 반영한다.

    7. SortedSet

    • 특징:
      • 요소를 정렬된 상태로 유지.
    • 주요 메서드:
      • first(): 가장 작은 요소 반환.
      • last(): 가장 큰 요소 반환.
      • subSet(E fromElement, E toElement): 특정 범위의 요소 반환.

    8. SortedMap

    • 특징:
      • 키를 정렬된 상태로 유지.
    • 주요 메서드:
      • firstKey(): 가장 작은 키 반환.
      • lastKey(): 가장 큰 키 반환.
      • headMap(K toKey): 특정 키보다 작은 범위의 데이터 반환.

    9. NavigableSet

    • 특징:
      • 정렬된 데이터에 탐색 기능 추가.
    • 주요 메서드:
      • lower(E e): 특정 요소보다 작은 값 반환.
      • higher(E e): 특정 요소보다 큰 값 반환.
      • ceiling(E e): 주어진 값 이상인 최소값 반환.

    10. NavigableMap

    • 특징:
      • 키에 대한 탐색 기능 추가.
    • 주요 메서드:
      • lowerEntry(K key): 특정 키보다 작은 키-값 쌍 반환.
      • higherEntry(K key): 특정 키보다 큰 키-값 쌍 반환.
      • ceilingEntry(K key): 주어진 키 이상인 최소 키-값 쌍 반환.

     


    Concurrent 컬렉션 클래스

    • 특징:
      • 멀티스레드 환경에서 동시성을 보장하도록 설계된 컬렉션 클래스이다.
      • synchronized 키워드로 락을 거는 기존 동기화 컬렉션보다 더 나은 성능 제공한다.
      • 데이터 무결성을 유지하며, 높은 동시성 처리 성능을 제공한다.
    • Concurrent 컬렉션의 종류:
      • ConcurrentHashMap: 키-값 데이터에 대해 동시성을 보장하며, 특정 버킷에만 락을 걸어 성능 저하를 최소화.
      • CopyOnWriteArrayList: 쓰기 작업 시 기존 데이터를 복사하여 동시성 문제를 방지.
      • BlockingQueue: 생산자-소비자 패턴에 유용하며, 쓰레드가 안전하게 대기하거나 데이터 접근 가능.
      • ConcurrentSkipListMap: 정렬된 데이터와 동시성 제어가 필요한 경우 사용.

     

    • 성능 비교: Synchronized 컬렉션 vs Concurrent 컬렉션:
      • Synchronized 컬렉션:
        • Collections.synchronizedMap, Collections.synchronizedList 등을 통해 동기화를 제공.
        • 단일 락을 사용하여 모든 쓰레드 접근을 순차적으로 처리하므로 성능이 낮음.
      • Concurrent 컬렉션:
        • 락의 범위를 세분화하거나 락 없이 동시성을 보장하는 방식(MVCC 등)을 사용.
        • 멀티스레드 환경에서 높은 처리량 제공.
    • 안정성 확보 방법:
      • Concurrent 컬렉션은 동시성을 보장하지만, 데이터의 논리적 무결성을 보장하려면 추가적인 관리가 필요할 수 있다.
      • 예를 들어, computeIfAbsent 메서드를 사용하여 데이터 생성 로직을 원자적으로 처리.

    • 사용 사례:
      • ConcurrentHashMap: 대규모 키-값 데이터 관리.
      • CopyOnWriteArrayList: 읽기 작업이 많은 환경에서 변경 작업이 드문 경우.
      • BlockingQueue: 멀티스레드 기반의 작업 큐, 생산자-소비자 모델.
    • 결론:
      • Concurrent 컬렉션은 동기화 컬렉션보다 더 나은 성능을 제공하며, 멀티스레드 환경에서 안전하고 효율적인 데이터 처리를 지원한다.
      • 적절한 동시성 전략을 선택하여 안정성과 성능의 균형을 맞추는 것이 중요하다.

     


    컬렉션 프레임워크를 보완하는 정렬 인터페이스

    1. Comparable

    • 정의: 객체 간의 자연 정렬을 정의하는 인터페이스.
    • 주요 메서드:
      • compareTo(T o): 현재 객체와 비교 대상 객체를 비교.
    • 특징:
      • 컬렉션의 요소를 정렬하기 위해 기본적으로 사용됨.
      • 단일 속성 기준으로 정렬.
    • 사용 예시:
     

    2. Comparator

    • 정의: 사용자 정의 정렬을 지원하는 인터페이스.
    • 주요 메서드:
      • compare(T o1, T o2): 두 객체를 비교.
    • 특징:
      • 여러 속성 기준으로 유연한 정렬 가능.
    • 사용 예시:

     


    컬렉션 프레임워크의 장점

    • 코드 간결화: 다양한 데이터 구조와 알고리즘 제공.
    • 재사용성 증가: 표준화된 API로 다양한 작업 가능.
    • 타입 안정성: 제네릭 지원으로 타입 안전성을 보장.
    • 성능 최적화: 특정 작업에 적합한 자료구조 제공.
    • 멀티스레드 환경 지원: Concurrent 컬렉션으로 동시성 문제 해결.

     

    출처

    https://inpa.tistory.com/entry/JCF-%F0%9F%A7%B1-Collections-Framework-%EC%A2%85%EB%A5%98-%EC%B4%9D%EC%A0%95%EB%A6%AC

     

    🧱 Java Collections Framework 종류 💯 총정리

    Java Collection Framework 자바 새내기분들은 컬렉션 프레임워크라는 단어에 뭔가 거창하고 어려운 느낌이 들수 있겠지만, 그냥 자료 구조(Data Structure) 종류의 형태들을 자바 클래스로 구현한 모음집

    inpa.tistory.com

    https://hudi.blog/java-collection-framework-1/

     

    JAVA Collection Framework (1) - 컬렉션 프레임워크란?

    본 포스팅에서는 컬렉션 프레임워크의 개요, 종류, 그리고 구현과 상속의 계층적 구조 등에 대해 개괄적으로 짚어본다. 1. Collection Framework 의 개요 컬렉션 프레임워크는 자바 프로그래밍에서 빠

    hudi.blog

    https://coding-factory.tistory.com/550

     

    [Java] 자바 컬렉션 프레임워크(List, Set, Map) 총정리

    컬렉션 프레임워크란? 배열을 사용하다 보면 여러가지 비효율적인 문제가 생깁니다. 가장 큰 문제점은 크기가 고정적이라는 것입니다. 배열의 크기는 생성할 때 결정되며 그 크기를 넘어가게

    coding-factory.tistory.com

    https://velog.io/@jummi10/Synchronized-Collection-vs-Concurrent-Collection

     

    Synchronized Collection vs Concurrent Collection

    스레드 안정성(Thread-safety) 보장성능(performance)확장성(scalability)스레드 안정성을 확보하는 방법(how they achieve thread-safety)한 번에 하나의 스레드만 객체에 접근하도록 허용한다.synchronized obje

    velog.io

     

    'JAVA' 카테고리의 다른 글

    Garbage Collection  (2) 2025.01.17
    Enum이란?  (1) 2024.11.01
    오버로딩 vs 오버라이딩  (7) 2024.10.23
    자바에서의 Error & Exception  (0) 2024.10.21
    JDK/JRE/JVM 개념  (0) 2024.10.14