본문 바로가기
이직&취업/Java 기초 상식

ArrayList와 LinkedList의 차이점은 무엇인가요?

by journeylabs 2025. 4. 8.
728x90
반응형

목차

    아직도 ArrayList vs LinkedList 헷갈린다면? 

    자바 컬렉션 프레임워크(Java Collection Framework)를 사용하다 보면 가장 많이 쓰는 리스트 구조인 ArrayList와 LinkedList.
    둘 다 List 인터페이스를 구현하고 있지만, 내부 동작 방식은 완전히 다릅니다.
    왜 어떤 상황에서는 ArrayList가 빠르고, 어떤 경우엔 LinkedList가 유리한 걸까요?
    이 글에서는 자료구조 관점, 성능 차이, 실무 예제, 사용 시 주의사항까지 한 번에 정리해드립니다!


    1. ArrayListLinkedList란? 주요 개념과 특징

    항목 ArrayList LinkedList
    내부 구조 동적 배열(Dynamic Array) 이중 연결 리스트(Doubly Linked List)
    접근 방식 인덱스를 이용한 직접 접근 (빠름) 순차 접근 (느림)
    삽입/삭제 성능 중간 요소 추가/삭제 시 느림 (O(n)) 중간 삽입/삭제에 강함 (O(1) or O(n))
    메모리 구조 요소만 저장 요소 + 노드 포인터 (next, prev) 저장

    ✅ 핵심 요약

    • ArrayList: 읽기/검색이 빠른 구조 (데이터 접근 위주일 때 유리)
    • LinkedList: 삽입/삭제가 빠른 구조 (데이터 변경이 잦을 때 유리)
    쉽게 말해, ArrayList는 "빠르게 찾아가는 도서관 책꽂이"이고, LinkedList는 "연결된 끈으로 이어진 구슬"이라고 생각하면 됩니다.

    2. ArrayListLinkedList 예시 및 코드 설명

    예시 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. 실무에서 ArrayListLinkedList의 활용 사례

    실무 예 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. ArrayListLinkedList의 장단점: 주의사항

    ArrayList 

    ✅ 장점

    • 빠른 인덱스 접근으로 검색에 유리
    • 메모리 사용 효율적 (포인터 없음)
    • 배열 기반이라 캐시 적중률이 높음

    ❌ 단점

    • 중간 삽입/삭제 성능 저하
    • 배열 크기 증가 시 리사이징 비용 발생

    LinkedList 

    ✅ 장점

    • 중간 요소 삽입/삭제에 최적화
    • 큐나 스택, 덱 구조에 적합

    ❌ 단점

    • 인덱스 기반 접근 성능 저하
    • 노드마다 포인터 저장 → 메모리 사용량 증가
    • 순차 접근이 필요하므로 전체 루프 성능도 낮음

    ✅ 결론: 상황에 맞는 선택이 핵심!

    시나리오 추천 리스트
    빠른 검색, 인덱스 접근 ✅ ArrayList
    자주 삽입/삭제되는 구조 ✅ LinkedList
    스택/큐/덱 구조 필요 시 ✅ LinkedList

    실무에서는 두 컬렉션의 장단점을 이해하고, 상황에 맞는 자료구조를 선택하는 것이 중요합니다.

     

    ArrayList와 LinkedList는 각각의 강점을 가진 자바 개발자의 필수 도구입니다.
    이 글을 통해 두 컬렉션의 차이와 활용법을 확실히 이해하셨길 바랍니다. "어떤 리스트를 써야 할지 모르겠다"는 고민은 이제 끝! 프로젝트의 요구사항에 맞춰 현명하게 선택해보세요.

    728x90
    반응형