- 이 글은 책 <자바의 정석 3판 - 남궁성>을 공부한 내용을 바탕으로 작성한 글입니다.
🌟 컬렉션 프레임워크
데이터 군을 저장하는 클래스들을 표준화한 설계. 데이터를 저장하고 관리하기 위한 표준화된 아키텍처.
- 컬렉션: 다수의 데이터, 즉 데이터 그룹
- 프레임워크: 표준화된 프로그래밍 방식
핵심 인터페이스 3가지는 List, Set, Map이다
- List: 중복을 허용하면서 저장순서가 유지되는 컬렉션
- Set: 중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션
- Map: 키와 값을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는 데 사용된다. 키는 중복될 수 없지만 값을 중복을 허용한다. 기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 마지막에 저장된 값이 남게 된다.
ArrayList
- Vector와 구현원리와 기능적인 측면에서 동일하다.
- Object 배열을 이용해서 데이터를 순차적으로 저장한다.
- 구조가 간단하며 사용하기 쉽고 데이터를 읽어오는데 걸리는 시간이 가장 빠르다.
- 크기를 변경할 수 없다.
- 비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.
LinkedList
- 불연속적으로 존재하는 데이터를 서로 연결한 형태
- 링크드 리스트의 각 요소(node)들은 자신과 연결된 다음 요소에 대한 참조(주소값)와 데이터로 구성되어 있다.
- 삭제: 배열처럼 데이터를 이동하기 위해 복사하는 과정이 없기 때문에 처리속도가 매우 빠르다.
- 이동방향이 단방향이기 때문에 다음 요소에 대한 접근은 쉽지만 이전 요소에 대한 접근은 어렵다. 이 점을 보완한 것이 이중 연결리스트이다.
ArrayList vs LinkedList
- 순차적으로 추가/삭제하는 경우에는 ArrayList가 LinkedList보다 빠르다.
- 중간 데이터를 추가/삭제하는 경우에는 LinkedList가 ArrayList보다 빠르다.
- ArrayList는 읽는 시간이 빠르지만 LinkedList는 데이터가 많을수록 접근 시간이 길어진다.
Stack과 Queue
Stack | Queue |
---|
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)