ArrayList와 LinkedList는 모두 Java에서 List 인터페이스를 구현한 대표적인 컬렉션 클래스입니다. 두 클래스 모두 기본적으로 동기화되지 않아(non-synchronized) 단일 스레드 환경에 적합하지만, 내부 구조와 성능 특성에서 중요한 차이점을 보입니다.
ArrayList와 LinkedList의 주요 차이점
| 번호 | 구분 | ArrayList | LinkedList |
|---|---|---|---|
| 1 | 내부 구현 방식 | 내부적으로 동적 배열(dynamic array)을 사용하여 요소를 저장합니다. | 이중 연결 리스트(doubly linked list)를 사용하여 요소를 저장합니다. |
| 2 | 데이터 조작 속도 | 배열 기반이므로 삽입·삭제 시 요소 이동이 발생해 조작이 느립니다. | 노드 기반으로 연결 정보만 변경하면 되기 때문에 삽입·삭제가 빠릅니다. |
| 3 | 구현 인터페이스 | List 인터페이스만 구현합니다. |
List뿐 아니라 Queue, Deque도 함께 구현하므로 큐나 덱으로도 활용할 수 있습니다. |
| 4 | 데이터 접근 | 인덱스 기반 접근이 가능해 데이터 저장과 조회가 빠릅니다. | 순차 탐색이 필요해 임의 접근은 느리지만, 데이터 조작(삽입·삭제)에 유리합니다. |
ArrayList vs LinkedList 예제 코드
두 클래스는 사용법이 거의 동일하기 때문에 코드 작성 방식에는 큰 차이가 없습니다. 아래 예제를 통해 확인해 보겠습니다.
JavaTester.java
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class JavaTester {
public static void main(String args[]) {
// ArrayList 생성 및 데이터 추가
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
// LinkedList 생성 및 데이터 추가
List<String> list1 = new LinkedList<>();
list1.add("A");
list1.add("B");
list1.add("C");
list1.add("D");
System.out.println(list);
System.out.println(list1);
}
}
실행 결과
[A, B, C, D] [A, B, C, D]
어떤 것을 선택해야 할까?
선택 기준은 프로그램의 사용 패턴에 따라 달라집니다.
- ArrayList를 추천하는 경우: 데이터 조회가 많고, 삽입·삭제가 주로 목록 끝에서 일어나는 경우. 인덱스를 통한 빠른 임의 접근이 필요한 경우에 적합합니다.
- LinkedList를 추천하는 경우: 목록 중간에서 빈번한 삽입·삭제가 발생하는 경우, 또는 큐(Queue), 스택(Stack)처럼 순차적인 데이터 처리 구조가 필요한 경우에 적합합니다.
일반적으로 대부분의 상황에서는 캐시 지역성(cache locality)이 좋고 조회 성능이 우수한 ArrayList가 기본 선택지로 권장됩니다.