[Java] 컬렉션 프레임워크란? (Collection Framework)
컬렉션 프레임워크란 자바에서 프로그램의 자료를 효율적으로 관리하기 위한 자료구조를 구현해 놓은 라이브러리이다.
java.util 패키지에서 제공하며 필요하다면 개발자가 직접 만들어 사용할 수도 있다.
컬렉션 프레임워크는 여러 인터페이스가 정의되어 있고 정의된 인터페이스를 구현하는 클래스들로 이루어져 있다.
각각의 용도에 맞추어 사용하면 자료를 관리하는데 많은 도움이 되며 자료를 잘 관리할 수 있다면 개발과 유지보수에도 큰 도움이 된다.
크게 컬렉션 프레임워크는 Collection인터페이스를 구현하는 인터페이스, 클래스들과 Map인터페이스를 구현하는 인터페이스 나 클래스들도 나뉜다.
Collection 인터페이스
위의 사진은 Collection 인터페이슬 구현한 인터페이스와 클래스들이다.
Collection 인터페이스에 선언된 메서드들 중 자주 쓰이는 메서드는 아래와 같다.
메서드 | 설명 |
boolean add(E e) | Collection에 객체를 추가 |
void clear( ) | Collection의 모든 객체를 제거 |
Iterator <E> iterator | Collection의 요소를 순회하는 Iterator를 반환 (반복문과 비슷) |
booelan remove(Object o) | Collection에 매개변수에 해당하는 인스턴스가 존재시 제거 |
int size( ) | Collection에 있는 요소의 개수를 반환 |
(1) List 인터페이스
List 인터페이스는 객체를 순차적으로 관리하는데 필요한 메서드들이 선언되어 있다.
순차 자료의 대표적인 구조는 배열이며 List인터페이스에는 배열을 구현한 ArrayList, Vector와 배열과는 조금 다르지만 순차 구조를 구현한 LinkedList가 있다.
List를 구현한 클래스는 아래와 같다.
- ArrayList : 객체 순서를 기반으로 순차적으로 자료를 관리하는 자료구조
- Vector : ArrayList와 기본적으로 같지만 멀티스레드 환경에서 사용. 동기화를 지원함
- LinkedList : 객체의 순서의 맞게 관리. 배열의 요소를 중간에 추가하거나 삭제에 따른 요소 이동이 적어 효율적, 일반 배열과는 다르게 논리적 순서와 물리적 순서가 같지 않음.
(2) Queue 인터페이스
Queue는 먼저 들어간 자료가 먼저 빠져나오는 FIFO(First In Frist Out)의 특성을 가진 자료구조이다.
Queue인터페이스를 구현한 인터페이스와 클래스는 아래와 같다.
- PriorityQueque : 먼저 들어간 것이 먼저 나오는 Queue의 특성과는 다르게 우선순위에 따라 나오는 순서가 결정된다.
- ArrayDeque : 배열 사이즈에 제한이 없으며 동기화 지원이 되지 않는다. Deque 인터페이스를 구현한 클래스이다.
(3) Set 인터페이스
Set 인터페이스는 수학의 집합을 생각하면 편하다.
자료의 순서가 없으며 중복을 허용하지 않는다.
중복을 허용하지 않는 자료, 예를 들어 주민등록번호, 로그인 아이디 등 유일한 값만 허용하는 자료를 관리할 때 유용하다.
- HashSet : 집합 자료 구조를 구현한 클래스로 중복을 허용하지 않는다.
- TreeSet : HashSet과 마찬가지로 중복을 허용하지 않으며 출력 값을 정렬할 때 사용하는 클래스이다. 정렬할 자료가 선언된 클래스에 Comparable 인터페이스 혹은 Comparator 인터페이스를 구현해야 한다. 정렬할 때 이진 검색 트리를 사용하며 Comparble이나 Comparator 인터페이스를 구현할 때 반환되는 값이 양수라면 오름차순, 0이라면 중복이므로 저장이 안 됨, 음수라면 내림차순으로 정렬한다.
Map 인터페이스
Map 인터페이스는 자료를 Key, Value의 쌍으로 관리하는 메서드들이 선언되어 있는 인터페이스다.
자료 검색용으로 유용하며 Key값을 알고 있다면 Value를 반환받을 수 있는 메서드들이 있으며,
Key값은 유일해야 하며 Value는 중복이 가능하며 여러 개일 수도 있다.
아래 사진은 Map 인터페이스의 전반적인 구조이다.
Key | Value |
이름 | 홍길동 |
나이 | 25세 |
직업 | 개발자 |
위의 표와 같이 Key에 해당하는 Value값을 지정할 수 있다.
Map 인터페이스를 구현하는 인터페이스와 클래스에서 자주 사용하는 메서드는 아래와 같다.
메서드 | 설명 |
V put(K key, V value) | key에 해당하는 value 값을 Map에 삽입 |
V get(K key) | key에 해당하는 value값을 반환 |
boolean isEmpty( ) | Map이 비었는지 여부를 반환 |
boolean containsKey(Object key) | Map에 해당 Key값을 가진 요소가 있는지를 반환 |
boolean containsValue(Object value) | Map에 해당 value값을 가진 요소가 있는지를 반환 |
Set keySet( ) | key 집합을 Set으로 반환 |
Collection values( ) | value를 Collection으로 반환 |
V remove(key) | 해당 key값이 있는 경우 요소를 삭제 |
boolean remove(Object key, Object value) | key와 value값이 일치하는 요소를 삭제 |
HashMap 클래스
Hash Map은 Map 인터페이스를 구현한 클래스 중 가장 많이 사용한다.
자료를 해시 방식으로 관리하며 key값을 알고 있는 상태에서 value를 검색하는데 걸리는 시간이 상당히 빠르다.
Map인터페이스는 Key값이 중복될 수 없으므로 equals( ) 메서드와 hashCode( ) 메서드를 재정의하여 사용하는 것이 좋다.
TreeMap 클래스
key값으로 자료를 정렬할 때 사용할 수 있다.
중복을 허용하지 않는다.
TreeSet과 마찬가지로 이진 검색 트리 (Binary Search Tree)를 사용하며 Comparble이나 Comparator 인터페이스를 구현해야 한다.
Comparble이나 Comparator 인터페이스를 구현할 때 반환되는 값이 양수라면 오름차순, 0이라면 중복이므로 저장이 안 됨, 음수라면 내림차순으로 정렬한다.
이 외에 컬렉션 프레임워크에 대한 자세한 사항은 오라클에서 제공하는 자바 레퍼런스 사이트에서 찾을 수 있다.
https://docs.oracle.com/javase/8/docs/api/
본 포스팅은 필자가 공부한 것을 정리해놓은 것으로 오류가 존재할 수 있습니다.
참고 : Do it! 자바 프로그래밍 입문, https://www.javatpoint.com/, https://docs.oracle.com/javase/8/docs/api/