List 컬렉션
List 컬렉션은 배열과 비슷하게 객체를 인덱스로 관리한다. 배열과의 차이점은 저장용량이 자동으로 증가하며, 객체를 저장할 때 자동 인데그삭 부여된다는 것이다. 그리고 추가, 삭제, 검색을 위한 다양한 메소드들이 제공된다.
List 컬렉션은 객체 자체를 저장하는 것이 아니라 객체의 번지를 참조한다. 그렇기 때문에 동일한 객체를 중복 저장할 수 있는데, 이 경우 동일한 번지가 참조된다. null도 저장이 가능하며, 이 경우 해당 인덱스는 객체를 참조하지 않는다.
ArrayList 클래스
ArrayList클래스는 가장 많이 사용되는 컬렉션 클래스 중 하나이다.
내부적으로 배열을 이용하여 요소를 저장한다.
ArrayList클래스는 배열을 이용하기 때문에 인덱스를 이용해 배열요소에 빠르게 접근할 수 있다.
하지만 배열은 크기를 변경할 수 없는 인스턴스이므로, 크기를 늘리기 위해서는 새로운 배열을 생성하고 기존의 요소들을 옮겨야 하는 복잡한 과정을 거쳐야 한다.
물론 이 과정은 자동으로 수행되지만, 요소의 추가 및 삭제 작업에 걸리는 시간이 매우 길어지는 단점을 가지게 된다.
ArrayList<Integer> arrList = new ArrayList<Integer>();
// add() 메소드를 이용한 요소의 저장
arrList.add(40);
arrList.add(20);
arrList.add(30);
arrList.add(10);
// for 문과 get() 메소드를 이용한 요소의 출력
for (int i = 0; i < arrList.size(); i++) {
System.out.print(arrList.get(i) + " ");
}
// remove() 메소드를 이용한 요소의 제거
arrList.remove(1);
// Enhanced for 문과 get() 메소드를 이용한 요소의 출력
for (int e : arrList) {
System.out.print(e + " ");
}
// Collections.sort() 메소드를 이용한 요소의 정렬
Collections.sort(arrList);
// iterator() 메소드와 get() 메소드를 이용한 요소의 출력
Iterator<Integer> iter = arrList.iterator();
while (iter.hasNext()) {
System.out.print(iter.next() + " ");
}
// set() 메소드를 이용한 요소의 변경
arrList.set(0, 20);
for (int e : arrList) {
System.out.print(e + " ");
}
// size() 메소드를 이용한 요소의 총 개수
System.out.println("리스트의 크기 : " + arrList.size());
결과값
40 20 30 10
40 30 10
10 30 40
20 30 40
리스트의 크기 : 3
LinkedList 클래스
LinkedList클래스는 ArrayList클래스가 배열을 이용하여 요소를 저장함으로써 발생하는 단점을 극복하기 위해 고안되었다.
LinkedList클래스는 내부적으로 연결리스트를 통해 요소를 저장한다.
배열은 저장된 요소가 순차적으로 저장된다.
하지만 연결리스트는 저장된 요소가 비순차적으로 분포되며, 이러한 요소들 사이를 링크로 연결하여 구성한다.
다음 요소를 가리키는 참조만을 가지는 연결 리스트를 단일 연결리스트라고한다.
이러한 단일 연결리스트는 요소의 저장과 삭제 작업이 다음요소를 가리키는 참조만 변경하면 되므로, 아주 빠르게 처리된다.
하지만 단일 연결리스트는 현재 요소에서 이전요소로 접근하기가 매우 어렵다.
따라서 이전 요소를 가리키는 참조도 가지는 이중 연결 리스트가 좀더 많이 사용된다.
LinkedList클래스도 이중 연결 리스트를 내부적으로 구현한 것이다.
또한, LinkedList클래스 역시 List인터페이스를 구현하므로, ArrayList클래스와 사용할 수 있는 메소드가 거의 같다.
LinkedList<String> lnkList = new LinkedList<String>();
// add() 메소드를 이용한 요소의 저장
lnkList.add("넷");
lnkList.add("둘");
lnkList.add("셋");
lnkList.add("하나");
// for 문과 get() 메소드를 이용한 요소의 출력
for (int i = 0; i < lnkList.size(); i++) {
System.out.print(lnkList.get(i) + " ");
}
// remove() 메소드를 이용한 요소의 제거
lnkList.remove(1);
// Enhanced for 문과 get() 메소드를 이용한 요소의 출력
for (String e : lnkList) {
System.out.print(e + " ");
}
// set() 메소드를 이용한 요소의 변경
lnkList.set(2, "둘");
for (String e : lnkList) {
System.out.print(e + " ");
}
// size() 메소드를 이용한 요소의 총 개수
System.out.println("리스트의 크기 : " + lnkList.size());
결과값
넷 둘 셋 하나
넷 셋 하나
넷 셋 둘
리스트의 크기 : 3
Vector 클래스
Vector 클래스는 ArrayList클래스와 같은 동작을 수행하는 클래스이다. 현재의 Vector클래스는 ArrayList클래스와 마찬가지로 List인터페이스를 상속받는다.
따라서 Vector클래스에서 사용할 수 있는 메소드는 ArrayList클래스에서 사용할 수 있는 메소드와 거의 같다.
하지만 현재 기존 코드와의 호환성을 위해서 남아있으므로, Vector클래스보다는 ArrayList클래스를 사용하는 것이 좋다.