- 컬렉션 프레임워크란 데이터 군(다수의 데이터)을 저장하는 클래스들을 표준화한 설계 - 아래의 표는 컬렉션 프레임워크의 핵심 인터페이스와 그 특징이다.
인터페이스
특징
List
순서가 있는 데이터의 집합, 데이터의 중복을 허용
구현 클래스 : ArrayList, LinkedList, Stack, Vector 등
Set
순서를 유지하지 않는 데이터의 집합, 데이터의 중복을 허용 X
구현 클래스 : HashSet, TreeSet 등
Map
키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합 순서는 유지되지 않으며, 키는 중복을 허용하지 X, 값은 중복을 허용
구현 클래스 : HashMap, TreeMap, HashTable 등
■ List 인터페이스와 구현 클래스
- List 인터페이스는 중복을 허용하면서 저장 순서가 유지되는 컬렉션을 구현하는데 사용된다. - Stack, ArrayList, Linked List 등
1) ArrayList - List 인터페이스를 구현하기 때문에 데이터의 저장순서가 유지, 중복을 허용 - ArrayList는 모든 종류의 객체를 담을 수 있다. - 인덱스로 원소들을 관리 [참고] - 배열과 ArrayList는 인덱스로 원소들을 관린한다는 면에서는 유사 - 배열과 ArrayList의 차이는 배열의 경우 크기가 지정되면 고정되지만, ArrayList의 경우 동적으로 요소를 추가, 삭제할 수 있고 용량이 초과하면 더 큰 용량의 배열에 옮기는 과정이 일어나게 된다.
코드를 통해 좀 더 자세히 살펴보면, 아래의 코드는, 용량이 초과했을 때 실행되는 내부 코드이다. ArrayList 안에는 배열에 값을 추가할 수 있는 add() 메서드가 존재한다. 여기에 보면 ensureCapacityInternal()가 보이는데 여기서 배열 용량을 늘리는 작업이 일어나게 된다. 아래의 코드는, ArrayList 내부의 메소드인데 코드는 다음과 같다. 이 코드에서 grow() 메소드의 내부만 살펴보면 된다. grow() 메서드 내부에서 Arrays.copyOf(elementData, new Capacity); 를 통해서 더 큰 배열에다 기존 배열의 원소들을 복사한다는 것을 알 수 있다.
Arrays.copyOf() 메소드는 A배열을 B배열로 옮기는 과정인데, 원소의 수가 얼마 안된다면 괜찮겠지만 많다면 상당히 많은 시간이 소요되고 효율적이지 못하다.
[ArralyList API 특징] - add(int index) : 배열의 마지막에 원소를 추가 - add(int index, E element) : 새로운 객체를 저장, 특정 위치를 지정한 경우 리스트의 그 이후의 값들의 위치하 뒤로 하나씩 밀리게 된다. - set(int index, Object obj) : 특정 위치의 값을 다른 값으로 변경 - remove(int index) : 원소의 인덱스로 삭제, 마지막 원소를 삭제한다면 쉽게 삭제할 수 있지만 중간이나 처음의 원소를 삭제하게 되면 빈공간을 다시 채워야 하는 과정이 필요하기 때문에 비효율적 - get(int index) : 인덱스에 해당하는 원소 찾기, 인덱스에 해당하는 원소를 찾는 시간복잡도는 O(1)이다. 때문에 탐색에는 유리하지만 중간에서 데이터의 추가, 삭제가 빈번하게 일어나면 비효율적인 특징을 가지고 있다.
2) LinkedList - 자료의 주소 값으로 서로 연결되어 있는 구조 - 자료의 주소 값으로 데이터를 연결하고 있어 ArrayList보다 빠르고 용이 - 내부적으로 양방향의 연결 리스트로 구성되어 있어 참조하려는 원소에 따라 처음부터 순방향으로 또는 역순으로 순회할 수 있다. - 배열의 단점을 보완하기 위해 Linked List라는 자료구조가 고안 - 삽입/ 삭제가 빈번하게 발생할 수 있는 프로세스의 경우에는 ArrayList보다 LinkedList를 사용하여 시스템을 구현하는 것이 바람직하다. - 하지만 ArrayList의 경우에는 무작위 접근이 가능하지만, LinkedList에서는 순차접근만이 가능 - 그렇기때문에 인덱스를 이용하여 자료를 검색하는 애플리케이션에는 적합하지 않다.
[LinkedList API 특징] - add(E element) : 리스트의 마지막에 원소 추가, LinkedList의 경우에는 인덱스를 가지고 있지 않기때문에 원소를 추가하기 위해서는 Head부터 마지막까지 찾아가야한다. 많은 시간이 소요
■ Set 인터페이스와 구현 클래스
- Set 인터페이스는 중복을 허용하지 않고 저장 순서가 유지되지 않는 컬렉션을 구현하는데 사용
■ Map 인터페이스와 구현 클래스
- 키(key)와 값(value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는데 사용 - 키는 중복될 수 없지만, 값은 중복이 가능 - 기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존에 저장한 값은 없어지고 마지막에 저장된 값이 남게 된다.
[Map.Entry 인터페이스] - Map 인터페이스의 내부 인터페이스 - Map에 저장되는 key-value 쌍을 다루기 위해 내부적으로 Entry 인터페이스를 정희