컬렉션 프레임워크는 데이터 군을 저장하는 클래스들을 표준화한 설계로, 컬렉션은 다수의 데이터(데이터 그룹), 프레임웍은 표준화된 프로그래밍 방식을 뜻한다. 컬렉션 프레임웍은 컬렉션, 다수의 데이터를 다루는 데 필요한 다양하고 풍부한 클래스들을 제공하기 때문에 프로그래머의 짐을 상당히 덜어준다. 또한 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화되어 있기 때문에 사용법을 익히기 편리하고 재사용성이 높은 코드를 작성할 수 있다.
컬렉션 프레임웍에서는 컬렉션데이터 그룹을 크게 3가지 타입이 존재한다고 인식하고, 각 컬렉션을 다루기 위한 기능을 가진 3개의 인터페이스(Interface)를 정의하였다. 그리고 상단의 그림과 같이 리스트(List)와 집합(Set)의 공통된 부분을 추출하여 새로운 인터페이스인 컬렉션(Collection)을 추가로 정의하였다. 반면, 맵(Map)은 이들과 전혀 다른 형태로 컬렉션을 다루기 때문에 상속 계층도에서 따로 떨어져 있다.
추가로, JDK 1.5부터 이터레이블(Iterable) 인터페이스를 추가하여 컬렉션(Collection) 인터페이스를 상속받게 하였는데, 이것은 단지 인터페이스들의 공통적인 메서드인 iterator( )를 뽑아서 중복을 제거하기 위한 것에 불과하므로 상속 계층도와는 무관하다.
인터페이스 | 특징 |
List | • 순서가 있는 데이터 집합 • 데이터 중복 허용 |
구현 클래스: ArrayList, LinkedList, Vector, Stack, Queue | |
Set | • 순서를 유지하지 않는 데이터 집합 • 데이터 중복 허용 X |
구현 클래스: HashSet, TreeSet | |
Map | • key와 value의 쌍으로 이루어진 데이터 집합 • 순서가 유지되지 않음 • key의 중복 허용 X, value의 중복 허용 |
구현 클래스: HashMap, TreeMap, Hashtable, Properties |
실제 개발 시에는 다루고자 하는 컬렉션의 특징을 파악하고, 어떤 인터페이스를 구현한 컬렉션 클래스를 사용할지 결정해야하므로 상단의 표의 개념은 굉장히 중요하다고 할 수 있다. 인터페이스의 이름이 클래스의 이름에 거의 포함돼 있기 때문에 인터페이스의 이름을 통해 확실히 숙지하도록 하자.
그러나 Vector, Stack, Hashtable, Properties와 같은 클래스들은 컬렉션 프레임웍이 만들어지기 전부터 존재하던 것이다. 특히 Vector나 Hashtable과 같은 기존의 컬렉션 클래스들은 호환을 위해 설계를 변경해서 남겨뒀지만, 가능하면 사용하지 않는 것이 좋다. 이 클래스 대신, ArrayList나 HashMap을 사용하면 된다.
Method | Explanation |
boolean add(Object o) boolean add(Collection c) |
지정된 객체 or 컬렉션의 객체들을 컬렉션에 추가 |
void clear( ) | 컬렉션의 모든 객체 삭제 |
boolean contains(Object o) boolean containsAll(Collection c) |
지정된 객체 or 컬렉션의 객체들이 컬렉션에 포함돼 있는지 |
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) | 지정된 컬렉션에 포함된 객체 만을 남기고 다른 객체들은 컬렉션에서 삭제 이 작업으로 인해 컬렉션에 변화가 있다면 true, 없으면 false |
int size( ) | 컬렉션에 저장된 객체의 수 반환 |
Object[ ] toArray( ) | 컬렉션에 저장된 객체를 객체배열(Object[ ])로 반환 |
Object[ ] toArray(Object[ ] a) | 지정된 배열에 컬렉션의 객체를 저장해서 반환 |
Method | Explanation |
void add(int index, Object element) boolean addAll(int index, Collection c) |
지정된 인덱스에 위치한 객체 or 컬렉션에 포함된 객체 추가 |
Object get(int index) | 지정된 인덱스에 위치한 객체 반환 |
int indexOf(Object o) | 지정된 객체의 인덱스 반환 (첫 번째 요소부터 순방향 탐색) |
int lastIndexOf(Object o) | 지정된 객체의 인덱스 반환 (마지막 요소부터 역방향 탐색) |
ListIterator listIterator( ) ListIterator listIterator(int index) |
List의 객체에 접근할 수 있는 ListIterator 반환 |
Object remove(int index) | 지정된 인덱스에 위치한 객체 삭제 후 삭제된 객체 반환 |
Object set(int index, Object element) | 지정된 인덱스에 객체 저장 |
void sort(Comparator c) | 지정된 비교자(comparator)로 List 정렬 |
List subList(int fromIndex, int toIndex) | 지정된 범위에 있는 객체 반환 |
Method | Explanation |
void clear( ) | Map의 모든 객체 삭제 |
boolean containsKey(Object Key) | 지정된 key 객체와 일치하는 Map의 key 객체가 있는지 |
boolean contatinsValue(Object value) | 지정된 value 객체와 일치하는 Map의 value 객체가 있는지 |
Set entrySet( ) | Map에 저장돼 있는 key-value 쌍을 Map.Entry 타입의 객체로 저장한 Set 반환 |
boolean equals(Object o) | 동일한 Map인지 비교 |
Object get(Object key) | 지정한 key 객체에 대응하는 value 객체를 찾아서 반환 |
int hashCode( ) | 해시코드 반환 |
boolean isEmpty( ) | Map이 비어있는지 |
Set keySet( ) | Map에 저장된 모든 key 객체 반환 |
Object put(Object key, Object value) | Map에 value 객체를 key객체에 연결하여 저장 |
void putAll(Map t) | 지정된 Map의 모든 key-value 쌍을 추가 |
Object remove(Object key) | 지정한 key 객체와 일치하는 key-value 객체를 삭제 |
int size( ) | Map에 저장된 key-value 쌍의 개수 반환 |
Collection values( ) | Map에 저장된 모든 value 객체 반환 |
Map.Entry 인터페이스는 Map 인터페이스의 내부 인터페이스다. 내부 클래스와 같이 인터페이스도 인터페이스 안에 인터페이스를 정의하는 내부 인터페이스를 정의하는 것이 가능하다. Map에 저장되는 key-value 쌍을 다루기 위해 내부적으로 Entry 인터페이스를 정의해 놓았다. 이것은 보다 객체지향적으로 설계하도록 유도하기 위한 것이고, Map 인터페이스를 구현하는 클래스에서는 Map.Entry 인터페이스 또한 함께 구현해야 한다.
다음은 Map 인터페이스의 소스코드 일부와 Map.Entry 인터페이스 메서드다.
public interface Map{
...
public static interface Entry{
Object getKey();
Object getValue();
Object setValue(Object value);
boolean equals(Object o);
int hashCode();
...
}
}
Method | Explanation |
boolean equals(Object o) | 동일한 Entry인지 비교 |
Object getKey( ) | Entry의 key 객체 반환 |
Object getValue( ) | Entry의 value 객체 반환 |
int hashCode( ) | Entry의 해시코드 반환 |
Object setValue(Object value) | Entry의 value 객체를 지정된 객체로 변경 |