자바는 널리 알려져 있는 자료구조를 바탕으로 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 관련된 인터페이스와 클래스들을 java.util 패키지에 포함시켜 놓음. 이들을 총칭해서 컬렉션 프레임워크라고 부름.
컬렉션 프레임워크는 몇 가지 인터페이스를 통해서 다양한 컬렉션 클래스를 이용할 수 있도록 설계되어 있음. 주요 인터페이스로는 List, Set, Map이 있는데, 이 인터페이스로 사용 가능한 컬렉션 객체의 종류는 다음과 같음.

List와 Set은 객체를 추가, 삭제, 검색하는 방법에 있어서 공통점이 있기 때문에 공통된 메소드만 따로 모아 Collection 인터페이스로 정의해 두고 이것을 상속하고 있음. Map은 키와 값을 하나의 쌍으로 묶어서 관리하는 구조로 되어 있어 List 및 Set과는 사용 방법이 다름.

List 컬렉션은 객체를 인덱스로 관리하기 때문에 객체를 저장하면 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공함.
List 컬렉션에는 ArrayList, Vector, LinkedList 등이 있는데, List 컬렉션에서 공통적으로 사용 가능한 List 인터페이스 메소드는 다음과 같음. 인덱스로 객체들이 관리되기 때문에 인덱스를 매개 값으로 갖는 메소드들이 많음.

ArrayList는 List 컬렉션에서 가장 많이 사용하는 컬렉션임. ArrrayList에 객체를 추가하면 내부 배열에 객체가 저장됨. 일반 배열과의 차이점은 ArrayList는 제한 없이 객체를 추가할 수 있다는것임.

List 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 저장함. 또한 동일한 객체를 중첩 저장할 수 있는데, 이 경우에는 동일한 번지가 저장됨. null 또한 저장이 가능함.
List<E> list = new ArrayList<E>(); //E에 지정된 타입의 객체만 저장
List<E> list = new ArrayList<>(); //E에 지정된 타입의 객체만 저장
List list = new ArrayList(); //모든 타입으이 객체를 저장
타입 파라미터 E에는 ArrayList에 저장하고 싶은 객체 타입을 지정하면 됨. List에 지정한 객체 타입과 동일하다면 ArrayList<>와 같이 객체 타입을 생략할 수도 있음. 객체 타입을 모두 생략하면 모든 종류의 객체를 저장할 수 있음.
ArrayList 컬렉션에 객체를 추가하면 인덱스 0번부터 차례대로 저장됨. 특정 인덱스의 객체를 제거하면 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨짐. 마찬가지로 특정 인덱스에 객체를 삽입하면 해당 인덱스부터 마지막 인덱스까지 모두 1씩 밀려남.

따라서 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList를 사용하는 것은 바람직하지 않음. 대신 이런 경우라면 LinkedList를 사용하는 것이 좋음.
package ch15.sec02.exam01;
public class Board {
private String subject;
private String content;
private String writer;
public Board(String subject, String content, String writer) {
this.subject = subject;
this.content = content;
this.writer = writer;
}
public String getSubject() { return subject; }
public void setSubject(String subject) { this.subject = subject; }
public String getContent() { return content; }
public void setContent(String content) { this.content = content; }
public String getWriter() { return writer; }
public void setWriter(String writer) { this.writer = writer; }
}