[자바의 정석] Ch 11 컬렉션 프레임워크(Collections Framework)

Seri·2024년 7월 14일
1
  • 이 글은 책 <자바의 정석 3판 - 남궁성>을 공부한 내용을 바탕으로 작성한 글입니다.

🌟 컬렉션 프레임워크

데이터 군을 저장하는 클래스들을 표준화한 설계. 데이터를 저장하고 관리하기 위한 표준화된 아키텍처.

  • 컬렉션: 다수의 데이터, 즉 데이터 그룹
  • 프레임워크: 표준화된 프로그래밍 방식
    핵심 인터페이스 3가지는 List, Set, Map이다
  • List: 중복을 허용하면서 저장순서가 유지되는 컬렉션
  • Set: 중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션
  • Map: 키와 값을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는 데 사용된다. 키는 중복될 수 없지만 값을 중복을 허용한다. 기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 마지막에 저장된 값이 남게 된다.

ArrayList

  • Vector와 구현원리와 기능적인 측면에서 동일하다.
  • Object 배열을 이용해서 데이터를 순차적으로 저장한다.
  • 구조가 간단하며 사용하기 쉽고 데이터를 읽어오는데 걸리는 시간이 가장 빠르다.
  • 크기를 변경할 수 없다.
  • 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.

LinkedList

  • 불연속적으로 존재하는 데이터를 서로 연결한 형태
  • 링크드 리스트의 각 요소(node)들은 자신과 연결된 다음 요소에 대한 참조(주소값)와 데이터로 구성되어 있다.
  • 삭제: 배열처럼 데이터를 이동하기 위해 복사하는 과정이 없기 때문에 처리속도가 매우 빠르다.
  • 이동방향이 단방향이기 때문에 다음 요소에 대한 접근은 쉽지만 이전 요소에 대한 접근은 어렵다. 이 점을 보완한 것이 이중 연결리스트이다.

ArrayList vs LinkedList

  1. 순차적으로 추가/삭제하는 경우에는 ArrayList가 LinkedList보다 빠르다.
  2. 중간 데이터를 추가/삭제하는 경우에는 LinkedList가 ArrayList보다 빠르다.
  3. ArrayList는 읽는 시간이 빠르지만 LinkedList는 데이터가 많을수록 접근 시간이 길어진다.

Stack과 Queue

StackQueue
LIFO(Last In First Out)FIFO(First In First Out)
순차적으로 데이터를 추가하고 삭제하는 스택에는 ArrayList와 같은 배열기반의 컬렉션 클래스가 적합하다.ArrayList를 사용하면 데이터를 꺼낼 때마다 빈공간을 채우기 위해 데이터의 복사가 발생하여 비효율적이기 때문에 LinkedList로 구현하는 것이 적합하다.
수식계산, 수식괄호검사, 워드프로게서의 undo/redo, 웹브라우저의 뒤로/앞으로인쇄작업 대기목록, 버퍼(buffer)

PriorityQueue

저장공간으로 배열을 사용하며, 각 요소를 힙이라는 자료구조의 형태로 저장한다. 힙은 이진 트리의 한 종류로 가장 큰 값이나 가장 작은 값을 빠르게 찾을 수 있다.

Deque(Double-Ended Queue)

Queue의 변형으로 한 쪽 끝으로만 추가/삭제할 수 있는 Queue와 달리 DeQueue는 양쪽 끝에 추가/삭제가 가능하다.

Iterator, ListIterator, Enumeration

  • Enumeration은 Iterator의 구버전. Iterator 사용 권장.
  • Iterator는 단방향으로만 이동하기 때문에 컬렉션의 마지막 요소에 다다르면 더 이상 사용할 수 없지만 ListIterator는 양방향으로 이동하기 때문에 각 요소간의 이동이 자유롭다.

Comparator, Comparable

두 객체를 비교한다는 같은 기능을 목적

  • Comparable: 기본 정렬기준을 구현하는데 사용
  • Comparator: 기본 정렬기준 외에 다른 기준으로 정렬하고자 할 때 사용

HashSet

Set 인터페이스를 구현한 가장 대표적인 컬렉션

TreeSet

이진 검색 트리라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스이다. 중복된 데이터의 저장을 허용하지 않으며 정렬된 위치에 저장하므로 저장순서를 유지하지도 않는다.
* 이진 검색 트리(binary search tree)

  • 모든 노드는 최대 두 개의 자식노드를 가질 수 있다.
  • 왼쪽 자식 노드의 값은 부모 노드의 값보다 작고 오른쪽 자식 노드의 값은 부모 노드의 값보다 커야 한다.
  • 노드의 추가 삭제에 시간이 걸린다. (순차적으로 저장하지 않으므로)
  • 검색(범위검색)과 정렬에 유리하다.
  • 중복된 값을 저장하지 못한다.

HashMap, Hashtable

새로운 버전인 HashMap을 사용할 것을 권한다.

해싱과 해시함수

해싱: 해시함수를 이용해서 데이터를 해시테이블에 저장하고 검색하는 기법.

  • 해시함수는 데이터가 저장되어 있는 곳을 알려주기 때문에 다량의 데이터 중에서도 원하는 데이터를 빠르게 찾을 수 있다.
  • 저장할 데이터의 키를 해시함수에 넣으면 배열의 한 요소를 얻게 되고, 다시 그 곳에 연결되어 있는 링크드 리스트에 저장하게 된다.

TreeMap

이진검색트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장한다.

Properties

Hashtable을 상속받아 구현한 것으로 (String, String)의 형태로 저장하는 보다 단순화된 컬렉션 클래스이다.

  • 주로 애플리케이션의 환경설정과 관련된 속성을 저장하는데 사용되며 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공한다.

Collections

컬렉션과 관련된 메서드를 제공한다.

  • 컬렉션의 동기화
    새로 추가된 ArrayList와 HashMap과 같은 컬렉션은 동기화를 자체적으로 처리하지 않고 필요한 경우에만 java.util.Collections 클래스의 동기화 메서드를 이용해서 동기화처리가 가능하도록 변경하였다.
List syncList = Collections.synchronizedList(new ArrayList(...));
  • 변경불가 컬렉션 만들기
    컬렉션에 저장된 데이터를 보호하기 위해서 컬렉션을 변경할 수 없게, 즉 읽기전용으로 만들어야 할 때가 있다.
unmodifiableList(List list)
  • 싱글톤 컬렉션 만들기
    단 하나의 객체만을 저장하는 컬렉션을 만들고 싶을 경우
singletonList(Object o)
  • 한 종류의 객체만 저장하는 컬렉션 만들기
    컬렉현에 모든 종류의 객체를 저장할 . 수있다는 것은 장점이기도 하고 단점이기도 한다. 대부분의 경우 한 종류의 객체를 저장하며, 컬렉션에 지정된 종류의 객체만 저장할 수 있도록 제한하고 싶을 때 사용한다.
checkedList(List list, Class type)
profile
🎤 📷 ❄️ 🌊

0개의 댓글

관련 채용 정보