728x90
반응형
목차
아직도 ArrayList vs LinkedList 헷갈린다면?
자바 컬렉션 프레임워크(Java Collection Framework)를 사용하다 보면 가장 많이 쓰는 리스트 구조인 ArrayList와 LinkedList.
둘 다 List 인터페이스를 구현하고 있지만, 내부 동작 방식은 완전히 다릅니다.
왜 어떤 상황에서는 ArrayList가 빠르고, 어떤 경우엔 LinkedList가 유리한 걸까요?
이 글에서는 자료구조 관점, 성능 차이, 실무 예제, 사용 시 주의사항까지 한 번에 정리해드립니다!
1. ArrayList와 LinkedList란? 주요 개념과 특징
항목 | ArrayList | LinkedList |
내부 구조 | 동적 배열(Dynamic Array) | 이중 연결 리스트(Doubly Linked List) |
접근 방식 | 인덱스를 이용한 직접 접근 (빠름) | 순차 접근 (느림) |
삽입/삭제 성능 | 중간 요소 추가/삭제 시 느림 (O(n)) | 중간 삽입/삭제에 강함 (O(1) or O(n)) |
메모리 구조 | 요소만 저장 | 요소 + 노드 포인터 (next, prev) 저장 |
✅ 핵심 요약
- ArrayList: 읽기/검색이 빠른 구조 (데이터 접근 위주일 때 유리)
- LinkedList: 삽입/삭제가 빠른 구조 (데이터 변경이 잦을 때 유리)
쉽게 말해, ArrayList는 "빠르게 찾아가는 도서관 책꽂이"이고, LinkedList는 "연결된 끈으로 이어진 구슬"이라고 생각하면 됩니다.
2. ArrayList와 LinkedList 예시 및 코드 설명
예시 1: 데이터 추가와 조회
import java.util.ArrayList;
import java.util.LinkedList;
public class ListComparison {
public static void main(String[] args) {
// ArrayList
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("Apple"); // 인덱스 0
arrayList.add("Banana"); // 인덱스 1
System.out.println("ArrayList: " + arrayList.get(0)); // 출력: Apple
// LinkedList
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("Orange"); // 첫 번째 노드
linkedList.add("Grape"); // 두 번째 노드
System.out.println("LinkedList: " + linkedList.get(0)); // 출력: Orange
}
}
- ArrayList: get(0)으로 첫 번째 요소에 바로 접근. 배열 기반이라 빠릅니다.
- LinkedList: get(0)은 첫 노드를 찾지만, 인덱스가 높아질수록 노드를 하나씩 따라가야 하므로 느려질 수 있습니다.
예시 2: 중간에 데이터 삽입
import java.util.ArrayList;
import java.util.LinkedList;
public class InsertComparison {
public static void main(String[] args) {
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("A");
arrayList.add("C");
arrayList.add(1, "B"); // "A", "B", "C" (중간 삽입)
LinkedList<String> linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.add("C");
linkedList.add(1, "B"); // "A", "B", "C" (중간 삽입)
System.out.println("ArrayList: " + arrayList);
System.out.println("LinkedList: " + linkedList);
}
}
- ArrayList: 중간 삽입 시 기존 요소들을 뒤로 밀어야 하므로 시간이 더 걸립니다(O(n)).
- LinkedList: 노드의 참조만 변경하면 되므로 삽입이 빠릅니다(O(1)).
3. 실무에서 ArrayList와 LinkedList의 활용 사례
실무 예 1: ArrayList – 데이터 조회 중심 애플리케이션
ArrayList<Product> products = new ArrayList<>();
products.add(new Product("노트북", 1000000));
products.add(new Product("마우스", 20000));
for (int i = 0; i < products.size(); i++) {
System.out.println(products.get(i).getName()); // 빠른 인덱스 접근
}
-
쇼핑몰 상품 목록처럼 데이터를 자주 조회하고, 추가/삭제가 드문 경우 ArrayList가 적합합니다.
-
인덱스 기반 조회가 빈번할 때 속도가 빠릅니다.
실무 예 2: LinkedList – 큐(Queue), 덱(Deque) 구조에 활용
Deque<String> taskQueue = new LinkedList<>();
taskQueue.addLast("작업1");
taskQueue.addLast("작업2");
taskQueue.removeFirst(); // 가장 먼저 들어온 작업 처리
- LinkedList는 Deque, Queue 인터페이스를 구현하고 있어 실시간 작업 처리, 이벤트 큐 등에 유리합니다.
4. ArrayList와 LinkedList의 장단점: 주의사항
ArrayList
✅ 장점
- 빠른 인덱스 접근으로 검색에 유리
- 메모리 사용 효율적 (포인터 없음)
- 배열 기반이라 캐시 적중률이 높음
❌ 단점
- 중간 삽입/삭제 성능 저하
- 배열 크기 증가 시 리사이징 비용 발생
LinkedList
✅ 장점
- 중간 요소 삽입/삭제에 최적화
- 큐나 스택, 덱 구조에 적합
❌ 단점
- 인덱스 기반 접근 성능 저하
- 노드마다 포인터 저장 → 메모리 사용량 증가
- 순차 접근이 필요하므로 전체 루프 성능도 낮음
✅ 결론: 상황에 맞는 선택이 핵심!
시나리오 | 추천 리스트 |
빠른 검색, 인덱스 접근 | ✅ ArrayList |
자주 삽입/삭제되는 구조 | ✅ LinkedList |
스택/큐/덱 구조 필요 시 | ✅ LinkedList |
실무에서는 두 컬렉션의 장단점을 이해하고, 상황에 맞는 자료구조를 선택하는 것이 중요합니다.
ArrayList와 LinkedList는 각각의 강점을 가진 자바 개발자의 필수 도구입니다.
이 글을 통해 두 컬렉션의 차이와 활용법을 확실히 이해하셨길 바랍니다. "어떤 리스트를 써야 할지 모르겠다"는 고민은 이제 끝! 프로젝트의 요구사항에 맞춰 현명하게 선택해보세요.
728x90
반응형
'이직&취업 > Java 기초 상식' 카테고리의 다른 글
REST API란 무엇이고 어떻게 만드나요? (24) | 2025.04.09 |
---|---|
자바의 equals()와 hashCode() 메서드는 어떻게 구현하나요? (33) | 2025.04.09 |
자바에서 static 키워드는 어떤 역할을 하나요? (40) | 2025.04.08 |
스트림(Stream) API를 어떻게 활용하나요? (27) | 2025.04.07 |
자바에서 NullPointerException은 왜 발생하고 어떻게 해결하나요? (26) | 2025.04.06 |