남궁성 저자의 Java의 정석 3판 스터디
Collections Framework 는
데이터 그룹을 다루고 표현하기 위한 단일화된 구조
라고 정의하고 있다 (Java API docs)
무슨 말인지는 천천히 읽어가다보면 이해가 될 것이다 🙂
Collections Framework 란
Collections Framework 은 컬렉션이나 다수의 데이터를 다루는 데에 필요한
다양한 클래스들을 제공하고 있다.
객체지향적 설계를 통해 표준화되어 있어서 사용법 익히기에도 편리하고
재사용성 높은 코드를 작성할 수 있다.
핵심 인터페이스
Collections Framework 에서는 Collection Data 그룹을 크게 3가지 타입으로 보고
각 컬렉션을 다루는데 필요한 기능을 가진, 3개의 인터페이스를 정의했다.
인터페이스 List 와 Set 을 구현한 컬렉션 클래스들은 공통부분이 많아서
공통 부분들을 뽑아서 Collection 인터페이스를 정의할 수 있었지만
Map 인터페이스는 전혀 다른 형태로 컬렉션을 다루기 때문에 같은 계층도에 포함되지 못했다.
- List : 순서가 있는 데이터의 집합, 데이터의 중복 허용
- 구현 클래스 : ArrayList, LinkedList, Stack, Vector 등
- Set : 순서를 유지하지 않는 데이터의 집합, 데이터의 중복 허용 X
- 구현 클래스 : HashSet, TreeSet 등
- Map : Key, Value 의 쌍으로 이루어진 데이터의 집합.
순서는 유지되지 않고, Key 는 중복 허용 X, Value 는 중복 허용- 구현 클래스 : HashMap, TreeMap, Hashtable, Properties 등
Collections Framework 의 모든 컬렉션 클래스들은 List, Set, Map 중의 하나를 구현하고 있다.
💡 정보 : 모든 컬렉션 클래스들은 구현한 인터페이스의 이름이 클래스 이름에 포함되어 있어서
이름만으로도 클래스의 특징을 쉽게 알 수 있도록 되어있다 !
Vector, Stack, Hashtable, Properties 같은 클래스들은 Collections Framework 이 만들어지기 전부터 존재했었어서
Collections Framework 의 명명법을 따르지 않는다 🙂
Vector 나 Hashtable 과 같은 기존의 컬렉션 클래스들은 호환을 위해
설계를 변경해서 남겨두었지만 가능하면 사용하지 않는 것이 좋다.
대신에 새로 추가된 ArrayList 와 HashMap 을 사용하자 ‼️
Collection 인터페이스에는 여러 method 들이 정의되어 있는데,
그 중에서 몇 가지만 예로 들어보면 아래와 같다.
boolean add(Object o) // 객체들을 Collection 에 추가
boolean isEmpty() // Collection 이 비어있는지 확인
Iterator iterator() // Collection 의 Iterator 를 얻어서 반환
boolean remove(Object o) // 지정된 객체를 삭제
int size() // Collection 에 저장된 객체의 개수를 반환
Object[] toArray() // Collection 에 저장된 객체를 객체배열 (Object[]) 로 반환
List 인터페이스
List 인터페이스는 중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현하는 데 사용된다.
List 인터페이스에 정의된 method 는 다음과 같다.
void add(int index, Object element) // index 위치에 element 나 컬렉션에 포함된 객체 추가
boolean addAll(int index, Collection c) // 위와 동일
Object get(int index) // index 위치에 있는 객체 반환
int indexOf(Object o) // 지정된 객체의 index 반환
int lastIndexOf(Object o) // 역방향 index 반환
Object remove(int index) // index 위치에 있는 객체 삭제, 삭제된 객체 반환
Object set(int index, Object element) // index 위치에 element 저장
void sort(Comparator c) // 지정된 비교자 (Comparator)로 List 를 정렬
Set 인터페이스
Set 인터페이스는 중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션 클래스를 구현하는데 사용된다.
Map 인터페이스
Map 인터페이스는 Key 와 Value 를 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는데 사용된다.
Map 인터페이스에 정의된 method 는 다음과 같다.
void clear() // Map 의 모든 객체를 삭제
boolean containKey(Object key) // 지정된 key 객체와 일치하는 Map 의 key 객체가 있는지 확인
boolean containValue(Object value) // 위와 동일 (key 대신 value로)
Set entrySet() // Map 에 저장되어 있는 k,v 쌍을 Map.Entiry 타입의 객체로 저장한 Set으로 반환
boolean equals(Object o) // 동일한 Map 인지 비교
Object get(Object key) // 지정한 key 객체에 대응하는 value 객체 반환
int hashCode() // 해시코드 반환
Set keySet() // Map 에 저장된 모든 key 객체 반환
Object put(Object key, Object value) // Map 에 value 객체를 key 객체에 mapping 하여 저장
void putAll(Map t) // 지정된 Map 의 모든 k,v 쌍을 추가
Object remove(Object key) // 지정한 key 객체와 일치하는 k,v 객체를 삭제
int size() // Map 에 저장된 k,v 쌍의 개수 반환
Collection values() // Map 에 저장된 모든 value 객체 반환
values()
에서는 반환타입이 Collection
이고, keySet() 에서는 반환타입이 Set
인 것에 주목 ‼️
Map 인터페이스에서 value 는 중복을 허용하기 때문에 Collection 타입으로 반환하고,
key 는 중복을 허용하지 않기 때문에 Set 타입으로 반환한다 !
Map.Entry 인터페이스
Map.Entry 인터페이스는 Map 인터페이스의 내부 인터페이스.
Map 에 저장되는 k,v 쌍을 다루기 위해 내부적으로 Entry 인터페이스를 정의해놓았다.
다음은 Map 인터페이스 소스코드의 일부분이다.
public interface Map {
...
public static interface Entry {
Object getKey(); // Entry 의 key 객체 반환
Object getValue(); // Entry 의 value 객체 반환
Object setValue(Object value); // Entry 의 value 객체를 지정된 객체로 바꿈
boolean equals(Object o); // 동일한 Entry 인지 비교
int hashCode(); // Entry 의 해시코드 반환
...
}
}
Collections Framework 에 대해서 살펴보았으니,
이제 이 인터페이스를 구현한 컬렉션 클래스에 대해서 살펴보자 🙂