컬렉션(collection)
여러 객체(데이터)를 모아 놓은 것을 의미
프레임웍(framework)
표준화, 정형화된 체계적인 프로그래밍 방식
컬렉션 프레임웍(collections framework)
컬렉션(다수의 객체)을 다루기 위한 표준화된 프로그래밍 방식
컬렉션을 쉽고 편리하게 다룰 수 있는 다양한 클래스를 제공
컬렉션 클래스(collection class)
다수의 데이터를 저장할 수 있는 클래스(예, Vector, ArrayList, HashSet)
컬렉션 프레임워크의 핵심 인터페이스

List 인터페이스(저장 순서 O, 데이터 중복 O)
ArrayList
Vector는 자체적으로 동기화처리가 되어 있으나 ArrayList는 그렇지 않다.
List인터페이스를 구현하므로, 저장순서가 유지되고 중복을 허용한다.
데이터의 저장공간으로 배열을 사용한다(배열 기반).

장점 : 배열은 구조가 간단하고 데이터를 읽는 데 걸리는 시간(접근 시간, access time)이 짧다.

단점 1 : 크기를 변경할 수 없다.
단점 2 : 비순차적인 데이터의 추가, 삭제에 시간이 많이 걸린다.
예제
public static void main(String[] args) {
ArrayList list1 = new ArrayList(10);
// ArrayList 에는 객체만 저장 가능하지만,
// 오토박싱에 의해서 기본형이 참조형으로 자동 변환됨
list1.add(5);
list1.add(new Integer(4));
list1.add(new Integer(2));
list1.add(new Integer(0));
list1.add(new Integer(1));
list1.add(new Integer(3));
// subList(1,4) 배열 1~3까지 뽑아서 새로운 배열을 생성
// {4, 2, 0}
ArrayList list2 = new ArrayList(list1.subList(1,4));
System.out.println("list1 = " + list1); // list1 = [5, 4, 2, 0, 1, 3]
System.out.println("list2 = " + list2); // list2 = [4, 2, 0]
Collections.sort(list1); // list1과 list2를 정렬한다(오름차순)
Collections.sort(list2);
System.out.println("list1 = " + list1); // list1 = [0, 1, 2, 3, 4, 5]
System.out.println("list2 = " + list2); // list2 = [0, 2, 4]
// list2 에 속한 값이 list1 에 모두 속하는지 확인
System.out.println("list1.containsAll(list2) = " + list1.containsAll(list2));
// list1.containsAll(list2) = true
list2.add("B");
list2.add("C");
list2.add(3,"A");
System.out.println("list2 = " + list2); // list2 = [0, 2, 4, A, B, C]
list2.set(3,"AA");
System.out.println("list2 = " + list2); // list2 = [0, 2, 4, AA, B, C]
// list1에서 list2와 겹치는 부분만 남기고 나머지는 삭제한다.
System.out.println("list1.retainAll(list2) = " + list1.retainAll(list2));
// list1.retainAll(list2) = true
System.out.println("list1 = " + list1); // list1 = [0, 2, 4]
list1.add(0,"1");
list1.add(4,2);
System.out.println("list1 = " + list1); // list1 = [1, 0, 2, 4, 2]
// 이때 1은 문자열 "1"
System.out.println("list1.indexOf(\"1\") = " + list1.indexOf("1"));
// list1.indexOf("1") = 0
System.out.println("list1.indexOf(\"1\") = " + list1.indexOf(1));
// 없는 데이터 -- -1 반환
// list1.indexOf("1") = -1
list1.remove(1); // 배열(Index)에서 데이터를 삭제 시킴
System.out.println("list1 = " + list1); // list1 = [1, 2, 4, 2]
list1.remove(new Integer(2)); // 실제 값을 삭제 시키기 위해선 Integer 사용
System.out.println("list1 = " + list1); // list1 = [1, 4, 2]
list1.remove(new String("1")); // 실제 값을 삭제 시키기 위해선 String 사용
System.out.println("list1 = " + list1); // list1 = [4, 2]
list1.add(3);
list1.add(6);
list1.add(8);
list1.add(0);
list1.add("5");
System.out.println("list1 = " + list1); // list1 = [4, 2, 3, 6, 8, 0, 5]
System.out.println("list2 = " + list2); // list2 = [0, 2, 4, AA, B, C]
// list2에서 List1에 포함된 객체들을 삭제한다.
for(int i = list2.size()-1; i>=0; i--){ // 배열은 0부터 시작하므로 -1
if(list1.contains(list2.get(i))){ // list2에서 꺼낸 i가 list1에 포함되면
list2.remove(i); // list2에서 i를 지운다.
}
}
System.out.println("list2 = " + list2); // list2 = [AA, B, C]
}