컬렉션 프레임워크
컬렉션 프레임워크에서 컬렉션은 다수의 데이터, 데이터그룹을 뜻하고 프레임워크는 표준화된 프로그래밍 방식을 뜻한다. 즉 컬렉션 프레임 워크란 데이터 군을 저장하는 클래스들을 표준화 한 것이다.
컬렉션 프레임워크는 컬렉션들과 다수의 데이터를 사용하는 데 필요한 다양하고 유용한 클래스들을 제공한다.
컬렉션 프레임워크 구조
인터페이스 List와 Set을 구현한 컬렉션 클래스들의 공통부분을 뽑아 만든 것이 Collection인터페이스 이다. Map은 이들 컬렉션과 전혀 다른 형태 이므로 공통부분이 없다.
▼ 컬렉션 프레임워크 인터페이스
| 인터페이스 | 특징 | 사용 예 | 구현클래스 |
|---|---|---|---|
| List | 순서가 있는 데이터의 집합. 데이터 중복 허용 | 대기자 명단 | ArrayList, LinkedList, Stack, Vector 등 |
| Set | 순서를 유지하지 않는 데이터 집합. 데이터 중복 허용않함 | 양의 정수집합, 소수 집합 | HashSet, TreeSet 등 |
| Map | 키Key와 값Value의 쌍으로 이루어진 데이터 집합, 순서는 유지되지 않고 키는 중복을 허용하지 않으며 값은 중복이 허용된다. | 우편번호, 전화번호 | HashMap, TreeMap, Hashtable, Properties |
컬렉션 인터페이스 메소드
▼ 컬렉션 인터페이스에 정의된 메소드들
| 메소드 | 설명 |
|---|---|
| int size() | 원소의 개수 반환 |
| boolean isEmpty() | 공백 상태이면 true 반환 |
| boolean contains(Object obj) | obj를 포함하고 있으면 true 반환 |
| boolean add(E element) | 원소 추가 |
| boolean remove(Object Obj) | 원소 삭제 |
| Iterator |
원소 확인 |
| boolean addAll(Collection c) | c에 있는 모든 원소 추가 |
| boolean containsAll(Collection c) | c에 있는 모든 원소가 포함되어 있으면 true |
| boolean removeAll(Collection c) | c에있는 모든 원소 삭제 |
| void clear() | 모든 원소 삭제 |
| Object[ ] toArray() | 컬렉션을 배열로 변환 |
| 컬렉션을 배열로 변환 |
Collection 인터페이스는 컬렉션 클래스에 저장된 데이터를 읽고 추가/삭제하는 등 컬렉션을 다루는데 기본적인 메소드들을 가지고 있다.
List 인터페이스
List는 중복을 허용하면서 저장순서가 유지되는 컬렉션을 구현하는데 사용된다.
▼ List 인터페이스에 정의된 메소드들
| 메소드 | 설명 |
|---|---|
| void add(int index, Object element) boolean addAll(int index, Collection c) |
지정된 위치Index에 객체Element 또는 컬렉션에 포함된 객체들을 추가한다. |
| Object get(int index) | 지정된 위치Index에 있는 객체를 반환한다. |
| ... | 나머지는 api문서를 참고한다. |
Set 인터페이스
Set은 중복을 허용하지 않고 저장순서가 유지되지 않는 컬렉션 클래스를 구현하는 데 사용한다.
Map 인터페이스
Map 인터페이스는 키Key와 값Value을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는 데 사용된다. 키는 중복을 허락하지 않고 값은 중복이 허용된다.
▼ Map 인터페이스에 정의된 메소드들
| 메소드 | 설명 |
|---|---|
| void clear() | Map의 모든객체를 삭제한다. |
| boolean containsKey(Object Key) | 지정된 Key와 일치하는 Map의 Key객체가 있는지 확인한다. |
| boolean containsValue(Object Value) | 지정된 Value와 일치하는 Map의 Value객체가 있는지 확인한다 |
| Object get(Object key) | 지정한 key객체에 대응하는 value객체를 찾아서 반환한다. |
| ... | 나머지는 api문서를 참고한다. |
ArrayList
ArrayList는 List인터페이스를 구현하여 데이터의 저장순서가 유지되고 중복을 허용하는 특징을 갖게 된다.
import java.util.ArrayList;
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
// 데이터 저장
list.add(new Integer(11));
list.add(new Integer(22));
list.add(new Integer(33));
// 데이터 참조
System.out.println("1차 데이터 참조");
for(int i=0; i<list.size(); i++) {
// 0이 첫번 째
System.out.println(list.get(i));
}
// 데이터 삭제
list.remove(0); // 0이 전달되었으므로 첫번 째 데이터 삭제
System.out.println("2차 데이터 참조");
for(int i=0; i<list.size(); i++) {
System.out.println(list.get(i));
}
}
}
LinkedList
크기를 변경할 수 없고 비순차적인 데이터의 추가 또는 삭제에 걸리는 시간이 오래걸리는 단점을 가진 배열을 보완하기 위해 만들어진 자료구조가 LinkedList이다. LinkedList는 자료구조가 불연속적으로 존재하는 데이터를 서로 연결Link한 형태로 아래 그림과 같이 존재한다.
import java.util.LinkedList;
public class ArrayListTest {
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<Integer>();
// 데이터 저장
list.add(new Integer(11));
list.add(new Integer(22));
list.add(new Integer(33));
// 데이터 참조
System.out.println("1차 데이터 참조");
for(int i=0; i<list.size(); i++) {
// 0이 첫번 째
System.out.println(list.get(i));
}
// 데이터 삭제
list.remove(0); // 0이 전달되었으므로 첫번 째 데이터 삭제
System.out.println("2차 데이터 참조");
for(int i=0; i<list.size(); i++) {
System.out.println(list.get(i));
}
}
}
ArrayList Vs. LinkedList
| 장점 | 단점 | |
|---|---|---|
| ArrayList | 데이터의 참조가 용이해서 빠른 참조가 가능하다. | 저장소의 용량을 늘리는 과정에서 많은 시간이 소요된다. 데이터의 삭제에 필요한 연산과정이 매우 길다. |
| LinkedList | 저장소의 용량을 늘리는 과정이 간단하다. 데이터의 삭제가 매우 간단하다. | 데이터의 참조가 비교적 불편하다. |