BACK/JAVA

[JAVA] 컬렉션 프레임워크 정리

연듀 2023. 2. 15. 17:06

 

컬렉션 프레임 워크란?

 

  • 여러 개의 데이터 묶음 자료를 효과적으로 처리하기 위해 구조화된 클래스 또는 인터페이스의 모음

컬렉션의 특성에 따라 크게 List, Set, Map으로 나눌 수 있고 메모리의 입출력 특성에 따라 기존 컬렉션 기능을 확장한 Stack, Queue가 있다.

Map의 경우 Collection 인터페이스를 상속받고 있지 않지만 Collection으로 분류된다.

 

 

 

1. List<E> 컬렉션 인터페이스

 

  • 배열과 반대로 저장 공간의 크기가 동적으로 변화(메모리 동적 할당)
  • 데이터의 추가, 변경, 삭제 등 가능
  • 내부에 이미 클래스가 구현되어 있어 직접 인터페이스를 구현할 필요가 없음
  • 구현 클래스(ArrayList<E>, Vector<E>, LinkedList<E>..)를 이용하면 List<E> 객체 생성 가능
  • 구현 클래스(자식 클래스) 내부에는 메서드들이 구현되어 있음

 

ArrayList<E> 구현 클래스

  • List<E> 인터페이스를 구현한 구현 클래스
  • 배열처럼 수집한 원소를 인덱스로 관리하며 저장 용량을 동적 관리
  • 데이터를 위치 정보(인덱스)와 값으로 저장
  • 데이터 삽입, 삭제 시 해당 데이터 이후 모든 데이터가 복사되므로 빈번한 삭제, 삽입이 일어나는 경우에는 부적합하다.
  • 검색의 경우는 인덱스의 데이터를 가져오면 되므로 빠르다.

 

Vector<E> 구현 클래스

  • ArrayList 와 동일한 기능 수행
  • 주요 메서드가 동기화 메서드로 구현돼 있어 멀티 쓰레드에 적합
  • 무겁고 많은 리소스를 차지하므로 싱글쓰레드에서는 ArrayList를 쓰는 것이 효율적

 

LinkedList<E> 구현 클래스

  • ArrayList 처럼 메서드를 동기화하지 않아 싱글 쓰레드에서 사용하기에 적합
  • 저장 용량을 매개변수로 갖는 생성자가 없어 객체 생성 시 저장 용량 지정 불가능
  • 양방향 포인터 구조로 앞뒤 객체의 정보를 저장, 모든 데이터가 서로 연결된 형태로 관리
  • 데이터의 삽입, 삭제 시 해당 노드의 주소지만 바꾸면 되므로 삽입, 삭제가 빈번한 데이터에 적합하다.
  • 양옆의 정보만을 갖고 있기 때문에 순차적으로 검색을 진행하여 검색 속도가 느리다.

 

ArrayList와 LinkedList의 성능 비교

  • 특정 인덱스에 데이터 삽입 시
    • ArrayList: 밀려나는 모든 데이터의 인덱스를 수정해야 함
    • LinkedList: 값이 추가된 위치의 앞 뒤 데이터 정보만 수정하면 됨
  • 특정 인덱스 위치의 값을 가져올 때
    • ArrayList: 데이터 자체가 인덱스 번호를 가지고 있어 빠르게 찾을 수 있음
    • LinkedList: 앞 부터 차례대로 인덱스의 위치를 찾아야함

데이터 추가/삭제 시 LinkedList, 데이터 검색 시 ArrayList 사용하는 것이 효율적

 

 

 

2. Set<E> 컬렉션 인터페이스

 

  • 인덱스 정보를 포함하고 있지 않은 집합의 개념과 같은 컬렉션
  • 데이터를 구분할 수 있는 방법이 데이터 그 자체
  • 동일한 데이터의 중복 저장을 허용하지 않음
  • List 메서드와 비교해 인덱스가 포함된 메서드가 모두 사라진 형태

 

HashSet<E> 구현 클래스

  • 저장 용량을 동적 관리
  • 저장 순서를 유지하지 않는 데이터의 집합
  • 기본 생성자로 생성시 기본 값 16, 데이터 개수가 많아지면 동적 증가
  • 입력 순서와 다르게 출력될 수 있음
  • 중복 확인 메커니즘: 해시 코드 동일한지 확인 -> equals() 결과가 true인지 확인

 

LinkedHashSet<E> 구현 클래스

  • HashSet의 자식 클래스로 HashSet의 모든 기능에 데이터 간의 연결 정보만을 추가로 갖는 컬렉션
  • 입력 순서의 정보를 갖고 있어 출력 순서가 입력 순서와 동일(저장 순서를 유지)
  • 중간에 데이터 추가하거나 특정 순서의 값을 가져오는 것은 불가능

 

TreeSet<E> 구현 클래스

  • Set의 기능에서 정렬 및 검색 기능 추가
    • TreeSet<E>으로 선언해야 부모 인터페이스인 SortedSet, NavigableSet에서 추가된 정렬및 검색 메서드 호출 가능
  • 데이터를 입력 순서와 상관없이 크기순으로 출력
  • 저장되는 모든 객체는 크기 비교의 기준이 제공돼야 함
    • Comparable<T> 제네릭 인터페이스 구현하는 방법
    • 객체를 생성하면서 생성자 매개변수로 Comparator<T> 객체를 제공 하는 방법

 

 

3. Map<K, V> 컬렉션 인터페이스

  • List, Set이 Collection<E> 인터페이스를 상속받는 반면, 별도의 인터페이스로 존재
  • Key와 Value 한 쌍으로 데이터를 저장
  • Key는 중복 저장 불가, Value는 중복 가능

 

HashMap<K, V>

  • Key 값 중복 허용 x, 입출력 순서 불일치
  • 단일 쓰레드에 적합
  • Key값을 HashSet으로 구현한 Map 객체
  • key값 중복 여부는 hashCode()값, equals() true인지 비교

 

HashTable<K, V>

  • Key 값 중복 허용 x, 입출력 순서 불일치
  • 주요 메서드가 동시화 메서드로 구현돼 멀티 쓰레드에 안정성을 가짐

 

LinkedHashMap<K, V>

  • HashMap의 기본적인 특성에 입력 데이터의 순서 정보를 추가로 갖는 컬렉션
  • 입출력 순서 일치
  • Key를 LinkedHashSet으로 관리

 

TreeMap<K, V>

  • Map의 기본 기능에 정렬 및 검색 기능이 추가된 컬렉션
  • NavigableMap<E>, SortedMap<E> 인터페이스의 자식 클래스
  • 입력 순서와 관계없이 데이터를 Key 값의 크기 순으로 저장(오름차순)

 

 

4. Stack <E> 컬렉션 클래스

 

  • 5개의 컬렉션 중 유일한 클래스로 자체적으로 객체 생성 가능
  • Vector 클래스의 자식 클래스로 후입선출 자료구조를 구현한 컬렉션

 

5. Queue<E> 컬렉션 인터페이스

 

  • LinkedList가 Queue 인터페이스의 구현 클래스
  • 선입선출 구조를 가짐