[Java] Collection Framework
JavaCollection Framework
데이터 군을 저장하는 클래스들을 표준화한 설계
컬렉션 Collection : 다수의 데이터. 데이터 그룹
프레임웍 Framework : 표준화된 프로그래밍 방식.
장점
컬렉션, 다수의 데이터를 다루는 데 필요한 다양하고 풍부한 클래스들을 제공한다.
인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화되어 있어 사용이 쉽다.
재사용성이 높은 코드를 작성할 수 있다.
핵심 인터페이스
컬렉션을 크게 3가지의 타입으로 나누어 각 컬렉션을 다루는 데 필요한 기능을 가진 3개의 인터페이스를 정의.
interface | 특징 | 구현 클래스 |
---|---|---|
List | 순서가 있는 데이터의 집합. 데이터의 중복 허용. | ArrayList, LinkedList, Stack, Vector 등 |
Set | 순서를 유지하지 않는 데이터의 집합. 데이터의 중복 금지. | HashSet, TreeSet 등 |
Map | 순서를 유지하지 않는, 키와 값의 쌍으로 이루어진 데이터의 집합 키 중복 금지, 값 중복 허용. | HashMap, TreeMap, Hashtabal, Properties 등 |
- 키 Key
데이터 집합 중에서 어떤 값(value)을 찾는 데 열쇠(key)가 된다는 의미에서 붙여진 이름
따라서 중복을 허용하지 않는다.
- Map 인터페이스
List, Set과 전혀 다른 형태로 컬렉션을 다루기 때문에 같은 상속계층도에 포함되지 못했다.
컬렉션 프레임웍의 명명법
컬렉션 프레임웍의 모든 컬렉션 클래스들은 List, Set, Map 중의 하나를 구현하고 있으며,
구현한 인터페이스의 이름이 클래스의 이름에 포함되어 있어 이름만으로도 클래스의 특징을 알기 쉽다.
- 예외 : Vector, Stack, Hashtable, Properties
컬렉션 프레임웍이 만들어지기 이전부터 존재하던 것이기 때문에 컬렉션 프레임웍의 명명법을 따르지 않는다.
호환을 위해 설계를 변경해서 남겨두었지만 사용하지 않는 것이 좋다.
대신에 ArrayList와 HashMap을 사용하자.
interface Collection
List와 Set의 조상.
인터페이스 List와 Set을 구현한 컬렉션 클래스들의 공통된 부분들을 모아서 정의한 인터페이스.
컬렉션 클래스에 저장된 데이터를 읽고, 추가하고 삭제하는 등 컬렉션을 다루는 데 가장 기본적인 메서드들을 정의.
반환 타입 | 이름 | 설명 |
---|---|---|
boolean | add(E e) | 지정된 객체(o)의 객체들을 컬렉션에 추가 |
boolean | addAll(Collection<? extends E> c) | 지정된 컬렉션(c)의 객체들을 컬렉션에 추가 |
void | clear() | Collection의 모든 객체를 삭제 |
boolean | contains(Object o) | 지정된 객체(o)의 객체들이 컬렉션에 포함되어 있는지 확인 |
boolean | containsAll(Collection<?> c) | 지정된 컬렉션의 객체들이 컬렉션에 포함되어 있는지 확인 |
boolean | equals(Object o) | 동일한 컬렉션인지 비교 |
int | hashCode() | 컬렉션의 hash code를 반환 |
boolean | isEmpty() | 컬렉션이 비어있는 지 확인 |
Iterator | iterator() | 컬렉션의 Iterator를 얻어서 반환 |
boolean | remove(Object o) | 지정된 객체를 삭제 |
boolean | removeAll(Collection<?> c) | 지정된 컬렉션에 포함된 객체들을 삭제 |
boolean | retainAll(Collection<?> c) | 지정된 컬렉션에 포함된 객체만을 남기고 다른 객체들은 컬렉션에서 삭제 |
int | size() | Collection에 저장된 객체의 개수를 반환 |
Object[] | toArray() | 컬렉션에 저장된 객체를 객체배열(Object[])로 반환 |
T[] | toArray(T[] a) | 지정된 배열에 컬렉션의 객체를 저장해서 반환 |
- 반환 타입이 boolean인 메서드들은 작업을 성공하거나 사실이면 true, 그렇지 않으면 false를 반환한다.
- E
특정 타입. 지네릭스(Generics)에 의한 표기.
이 외에도 T, K, V를 사용하는 경우도 있다. 모두 Object 타입이라고 이해해두자.
interface List
저장 순서를 유지한다.
중복 가능하다.
구현클래스 : Vector ← Stack, ArrayList, LinkedList
반환타입 | 이름 | 설명 |
---|---|---|
void | add(int index, E element) | 지정된 위치에 객체에 포함된 객체들을 추가 |
boolean | addAll(int index, Collection<? extends E> c) | 지정된 위치에 컬렉션에 포함된 객체들을 추가 |
int | indexOf(Object o) | 지정된 객체의 위치를 반환. List의 첫 번째 요소부터 순방향으로 찾음 |
int | lastIndexOf(Object o) | 지정된 객체의 위치를 반환. List의 마지막 요소부터 역방향으로 찾음 |
ListIterator | listIterator(int index) | List의 객체에 접근할 수 있는 ListIterator를 반환 |
ListIterator | listIterator() | List의 객체에 접근할 수 있는 ListIterator를 반환 |
E | remove(int index) | 지정된 위치에 있는 객체를 삭제하고 삭제된 객체를 반환 |
E | set(int index, E element) | 지정된 위치에 객체를 저장 |
void | sort(Comparator<? super E> c) | 지정된 비교자로 List를 정렬 |
List | subList(int fromIndex, int toIndex) | 지정된 범위(from~to)에 있는 객체를 반환 |
interface Set
저장 순서를 유지하지 않는다.
중복 불가능하다.
구현클래스 : HashSet, SortedSet ← TreeSet.
interface Map
키(Key)와 값(value)을 하나의 쌍으로 묶어서 저장한다.
키는 중복될 수 없지만 값은 중복 가능하다.
기존에 저장된 데이터와 중복된 키와 값을 저장하면 마지막에 저장된 값이 남는다.
구현클래스 : Hashtable, HashMap ← LinkedHashMap, SortedMap ← TreeMap
반환 타입 | 이름 | 설명 |
---|---|---|
void | clear() | Map의 모든 객체를 삭제 |
boolean | containsKey(Object key) | 지정된 Key객체와 일치하는 Map의 Key객체가 있는 지 확인 |
boolean | containsValue(Object value) | 지정된 value객체와 일치하는 Map의 value객체가 있는지 확인 |
Set<Entry<K, V» | entrySet() | Map에 저장되어 있는 key-value쌍을 Map.Entry타입의 객체로 저장한 Set으로 반환 |
boolean | equals(Object o) | 동일한 Map인지 확인 |
V | get(Object key) | 지정한 Key객체에 대응하는 value객체를 찾아서 반환 |
int | hashCode() | 해시코드를 반환 |
boolean | isEmpty() | Map이 비어있는지 확인 |
Set | keySet() | Map에 저장된 모든 Key객체를 반환 |
V | put(K key, V value) | Map에 있는 value객체를 Key객체에 연결(mapping)하여 저장 |
void | putAll(Map<? extends K, ? extends V> m) | 지정된 Map의 모든 key-value쌍을 추가 |
V | remove(Object key) | 지정한 Key객체와 일치하는 key-value객체를 삭제 |
int | size() | Map에 저장된 key-value쌍의 개수를 반환 |
Collection | values() | Map에 저장된 모든 value객체를 반환 |
- values()와 keySet()의 반환 타입
Map 인터페이스에서 값은 중복이 가능하기 때문에 Collection 타입으로 반환한다.
키는 중복이 불가능하기 때문에 Set타입으로 반환한다.
interface Map.Entry
Map 인터페이스의 내부 인터페이스(inner interface).
Map에 저장되는 key-value쌍을 다루기 위해 내부적으로 정의해둔 것.
Map인터페이스를 구현하는 클래스에서는 Map.Entry 인터페이스로 함께 구현해야 한다.
반환타입 | 이름 | 설명 |
---|---|---|
boolean | equals(Object o) | 동일한 Entry인지 비교 |
K | getKey() | Entry의 key객체를 반환 |
V | getValue() | Entry의 value객체를 반환 |
int | hashCode() | Entry의 해시코드를 반환 |
V | setValue(V value) | Entry의 value객체를 지정된 객체로 변경 |
Collection Class 특징
Collection | 특징 |
---|---|
ArrayList | 배열 기반. 불연속적인 데이터 추가/삭제 불리. 순차적인 추가/삭제 가장 빠름 임의의 요소에 대한 접근성이 뛰어남 |
LinkedList | 연결 기반. 불연속적인 데이터 추가/삭제 유리. 임의의 요소에 대한 접근성이 좋지 않음 |
HashMap | 배열과 연결이 결합된 형태. 추가, 삭제, 검색, 접근성이 모두 뛰어남. 검색에 최고 성능 |
TreeMap | 연결 기반. 정렬과 검색(특히 범위 검색)에 적합. 검색 성능은 HashMap보다 떨어짐 |
Stack | LIFO(Last In First Out) 방식의 자료. 구조Vector를 상속받아 구현 |
Queue | FIFO(First In First Out) 방식의 자료 구조. LinkedList가 Queue 인터페이스를 구현 |
Properties | 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공. Hashtable을 상속받아 구현 |
HashSet | Set 인터페이스를 구현한 가장 대표적인 컬렉션. HashMap을 이용해서 구현 |
TreeSet | TreeMap을 이용해서 구현 |
LikedHashMap | HashMap에 저장 순서 유지 기능 추가 |
LikedHashSet | HashSet에 저장 순서 유지 기능 추가 |
참고 서적: 자바의 정석 3판 2