데이터를 저장하고 관리하는 자료구조 중 하나이다.
리스트는 Collection 인터페이스를 구현한 자료형으로, 중복된 데이터의 입력이 가능하고 순차적으로 데이터를 저장하며 인덱스를 사용하여 액세스할 수 있다. 리스트의 주요 구현체로는 Vector, ArrayList, LinkedList 등이 있다.

import java.util.ArrayList; // ArratList 선언 시
import java.util.LinkedList; // LinkedList 선언 시
import java.util.List;
List<자료형> 리스트이름 = new ArrayList<>();
List<자료형> 리스트이름 = new LinkedList<>();
<>(제네릭)을 통해 지정해야 한다.Integer, Long, Double, Float, String, User, StudentUser와 Student는 사용자가 직접 구현한 레퍼런스 클래스다.ArrayList, LinkedList💡제네릭(Generic)이란?
데이터의 타입(data type)을 일반화한다(generalize)는 것을 의미하고 타입 안정성을 제공하기 위한 기능이다.
- 제네릭의 특징
- 제네릭을 사용하면 잘못된 타입이 들어올 수 있는 것을 컴파일 단계에서 방지할 수 있다.
- 클래스 외부에서 타입을 지정해주기 때문에 따로 타입을 체크하고 변환해줄 필요가 없다. 즉, 관리하기가 편하다.
- 비슷한 기능을 지원하는 경우 코드의 재사용성이 높아진다.
| 메소드 | 설명 |
|---|---|
| boolean add(E e) | 해당 리스트(list)에 전달된 요소를 추가함. (선택적 기능) |
| void add(int index, E e) | 해당 리스트의 특정 위치에 전달된 요소를 추가함. (선택적 기능) |
| void clear() | 해당 리스트의 모든 요소를 제거함. (선택적 기능) |
| boolean contains(Object o) | 해당 리스트가 전달된 객체를 포함하고 있는지를 확인함. |
| boolean equals(Object o) | 해당 리스트와 전달된 객체가 같은지를 확인함. |
| E get(int index) | 해당 리스트의 특정 위치에 존재하는 요소를 반환함. |
| boolean isEmpty() | 해당 리스트가 비어있는지를 확인함. |
| Iterator iterator() | 해당 리스트의 반복자(iterator)를 반환함. |
| boolean remove(Object o) | 해당 리스트에서 전달된 객체를 제거함. (선택적 기능) |
| boolean remove(int index) | 해당 리스트의 특정 위치에 존재하는 요소를 제거함. (선택적 기능) |
| E set(int index, E e) | 해당 리스트의 특정 위치에 존재하는 요소를 전달받은 객체로 대체함. (선택적 기능) |
| int size() | 해당 리스트의 요소의 총 개수를 반환함. |
| Object[] toArray() | 해당 리스트의 모든 요소를 Object 타입의 배열로 반환함. |
ArrayList와 LinkedList 컬렉션 클래스를 주로 사용한다.
가장 많이 사용되는 컬렉션 클래스 중 하나인 ArrayList는 요소를 순차적으로 추가하는 것이 특징이다.
JDK 1.2부터 제공된 ArrayList 클래스는 내부적으로 배열을 이용하여 요소를 저장한다. 배열과 비슷한 인덱스 기반의 접근을 제공하면서도 크기를 동적으로 조절할 수 있는 장점을 갖고 있다.
ArrayList에서 특정 인덱스의 데이터를 제거하게 되면, 제거한 데이터의 인덱스부터 마지막 인덱스까지의 데이터들이 1칸씩 앞으로 이동한다. 데이터를 추가하게 되면 뒤로 1칸씩 이동하게 된다. 이 과정에서 인덱스 값을 유지하기 위해 전체 데이터의 위치가 이동하게 된다. 따라서 잦은 데이터의 추가/삭제 작업에는 시간이 많이 소요되는 단점이 있다.
ArrayList는 내부에서 처음 설정한 저장 용량(capacity)를 가지고 있다. 설정한 저장 용량을 초과하여 더 많은 데이터가 들어오게 되면, 배열 크기를 1.5배로 증가시킨다.

LinkedList는 가장 많이 사용되는 컬렉션 클래스 중 하나로, 데이터를 연결된 노드(Node)들의 집합으로 저장한다.
JDK 1.2부터 제공된 LinkedList 클래스는 각 요소들이 연결된 형태로 데이터를 저장한다. 각 노드가 이전 노드와 다음 노드에 대한 참조(주소)를 가지는 방식으로 이루어져 있다. 첫 번째 노드를 헤드(Head)라고 하고, 마지막 노드를 테일(Tail)이라고 한다.
LinkedList는 배열과는 달리 크기를 동적으로 조절할 필요가 없으며, 필요한 만큼의 공간을 동적으로 할당하여 데이터를 저장한다. 각 노드는 이전 노드와 다음 노드에 대한 참조를 가지고 있어 순차적인 접근을 하고 데이터의 삭제, 삽입이 빠르다는 장점을 갖고 있다.
LinkedList에서 데이터의 추가나 삭제는 각 노드의 참조를 조정하여 연결을 변경함으로써 이루어진다. 데이터를 추가하거나 삭제할 때, 해당 위치에서의 연결 조정만 이루어지면 되기 때문에 데이터의 이동이 필요하지 않는다. 데이터의 삽입과 삭제 속도가 빠른 이유다.
하지만 LinkedList는 데이터에 접근할 때 처음부터 순차적으로 탐색해야 하므로, 특정 인덱스를 통한 빠른 접근이 어렵고 각 노드마다 다음 노드의 참조를 가지고 있어 메모리 공간을 더 많이 차지할 수 있다는 단점이 있다.

