List 컬렉션 클래스란?
List 인터페이스를 구현한 모든 List 컬렉션 클래스는 다음과 같은 특징을 가지고 있습니다.
- 요소의 저장 순서가 유지됩니다.
- 같은 요소의 중복 저장을 허용합니다.
List 인터페이스에서 공통적으로 사용 가능한 메서드는 다음과 같습니다
기능 | 리턴 타입 | 메서드 | 설명 |
객체 추가 | void | add(int index, Object element) | 인덱스에 객체를 추가 |
boolean | addAll(int index, Collection c) | 인덱스에 컬렉션을 추가 | |
Object | set(int index, Object element) | 위치에 객체를 저장 | |
객체 검색 | Object | get(int index) | 인덱스에 저장된 객체를 반환 |
int | indexOf*Object o) / lastIndexOf(Object o) | 순방향 / 역방향으로 탐색하여 객체의 위치를 반환 | |
ListIterator | listIterator() / listIterator(int index) | List의 객체를 탐색할 수 있는 ListIterator 반환 / 인덱스부터 탐색할 수 있는 ListIterator 반환 | |
List | subList(int fromIndex, int toIndex) | fromIndex 부터 toIndex에 있는 객체 반환 | |
객체 삭제 | Object | remove(int index) | 인덱스에 저장된 객체를 삭제하고 삭제된 객체를 반환 |
boolean | remove(Object o) | 주어진 객체를 삭제 | |
객체 정렬 | void | sort(Comparator c) | 주어진 비교자(comparator)로 List를 정렬 |
대표적인 List 컬렉션 클래스에 속하는 클래스는 다음과 같습니다.
- ArrayList <E>
- LinkedLIST <E>
- Vector <E>
- Stack <E>
ArrayList <E> 클래스
ArrayList 클래스는 배열을 이용하기 때문에 인덱스를 이용해 배열 요소에 빠르게 접근이 가능합니다.
배열과의 차이점은 배열은 크기를 변경할 수 없는 인스턴스이므로, 크기를 늘리기 위해서는 새로운 배열을 생성하고 기존의 요소들을 옮겨야 하는 복잡한 과정을 거쳐야 합니다. 그에 반해 ArrayList는 저장 크기를 초과하여 객체를 추가하면, 자동으로 크기가 늘어나게 됩니다.
다음 예제는 여러 ArrayList 메서드를 사용하여 리스트를 생성하고 조작하는 예제입니다.
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> arrList = new ArrayList<>();
// 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) + " ");
}
System.out.println("");
// remove() 메소드를 이용한 요소의 제거
int a = arrList.remove(0);
// 제거된 요소를 출력
System.out.println(a);
// Enhanced for 문과 get() 메서드를 이용한 요소의 출력
for(int e : arrList){
System.out.print(e + " ");
}
System.out.println("");
// Collections.sort() 메서드를 이용한 요소의 정렬
Collections.sort(arrList);
// iterator() 메서드와 get() 메서드를 이용한 요소의 출력
Iterator<Integer> iter = arrList.iterator();
while (iter.hasNext()){
System.out.print(iter.next() + " ");
}
System.out.println("");
// set() 메서드를 이용한 요소의 변경
arrList.set(0,10);
for (int e : arrList){
System.out.print(e + " ");
}
System.out.println("");
// size() 메서드를 이용한 요소의 총 개수 확인
System.out.println("리스트의 크기:" + arrList.size() );
}
}
// 출력 결과
40 20 30 10
40
20 30 10
10 20 30
10 20 30
리스트의 크기:3
ArrayList에 객체를 추가하면 index 0부터 차례대로 저장됩니다. 그리고 특정 index의 객체를 제거하면, 바로 뒤 index부터 마지막 index까지 모두 1씩 당겨집니다.
따라서 빈번한 객체 삭제와 삽입이 일어나는 곳에는 ArrayList보다는 LinkedList를 사용하는 것이 좋습니다.
LinkedList <E> 클래스
LinkedList 클래스는 ArrayList 클래스가 배열을 이용하여 요소를 저장함으로써 발생하는 단점을 극복하기 위해 고안되었습니다.
배열은 저장된 요소가 순차적으로 저장됩니다.
하지만 LinkedList는 저장된 요소가 비순차적으로 분포되며, 이러한 요소들 사이를 링크(link)로 연결하여 구성합니다.
Linked list는 두 가지로 분류할 수 있습니다.
- 단일 연결 리스트(sigly linked list)
- 이중 연결 리스트(doubly linked list)
단일 연결 리스트
단일 연결 리스트는 요소의 저장과 삭제 작업이 다음 요소를 가리키는 참조만 변경하면 되므로, 아주 빠르게 처리될 수 있습니다. 하지만, 단일 연결 리스트는 현재 요소에서 이전 요소로 접근하기가 매우 어렵습니다.
그 때문에 이전 요소를 가리키는 참조도 가지고 있는 이중 연결 리스트(doubly linked list)가 좀 더 많이 사용됩니다.
이중 연결 리스트
이중 연결 리스트의 각 요소들은 자신과 연결된 이전 요소 및 다음 요소의 주소값과 데이터로 구성되어 있습니다.
데이터를 삭제하려면, 삭제하고자 하는 요소의 이전 요소가 삭제하고자 하는 요소의 다음 요소를 참조하도록 변경하면 됩니다. 링크를 끊어주는 방식이라고 생각하면 됩니다. 배열처럼 데이터를 이동하기 위해 복사할 필요가 없기 때문에 처리 속도가 훨씬 빠릅니다.
데이터를 추가할 때도 마찬가지로, 새로운 요소를 추가하고자 하는 위치의 이전 요소와 다음 요소 사이에 연결해 주면 됩니다. 즉, 이전 요소가 새로운 요소를 참조하고 새로운 요소가 다음 요소를 참조하게 만드는 것입니다.
다음의 예제는 LinkedList 메서드를 이용하여 리스트를 생성하고 조작하는 예제 코드입니다.
import java.util.LinkedList;
public class Main {
public static void main(String[] args) {
LinkedList<String> lnkList = new LinkedList<>();
// 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) + " ");
}
System.out.println("");
// remove() 메서드를 이용한 요소의 제거
lnkList.remove(1);
// Enhanced for 문과 get() 메서드를 이용한 요소의 출력
for (String e : lnkList){
System.out.print(e + " ");
}
System.out.println("");
// set() 메서드를 이용한 요소의 변경
lnkList.set(2, "둘");
for (String e: lnkList){
System.out.print(e + " ");
}
System.out.println("");
// size() 메서드를 이용한 요소의 총 개수
System.out.println("리스트의 크기: " + lnkList.size());
}
}
// 출력 결과
넷 둘 셋 하나
넷 셋 하나
넷 셋 둘
리스트의 크기: 3
Vector <E> 클래스
Vector 클래스는 ArryList 클래스와 같은 동작을 수행하는 클래스입니다.
Vector 클래스는 레거시 코드와의 호환성을 위해서만 남아있으므로, Vector 클래스보다는 ArrayList 클래스를 사용하는 것이 좋습니다.
Reference
'JAVA' 카테고리의 다른 글
[JAVA] 컬렉션 프레임워크(Collection Framework) - Map <K,V> (4) (2) | 2023.03.10 |
---|---|
[JAVA] 컬렉션 프레임워크(Collection Framework) - Set <E> (3) (0) | 2023.03.10 |
[JAVA] 컬렉션 프레임워크(Collection Framework) (1) (0) | 2023.03.09 |
[JAVA] 예외 처리(Exception Handling) (0) | 2023.03.08 |
[JAVA] 제네릭(Generic) (0) | 2023.03.07 |