java

List 에 관하여

heejunp 2025. 2. 10. 21:13

Java에서 List 인터페이스는 순서가 있는 컬렉션을 다룰 때 사용됩니다. List의 주요 구현체로는 ArrayList, LinkedList 가 있으며, 각각의 구현 방식과 성능 특성이 다릅니다. 이 글에서는 Java의 List 구현체들의 차이점을 비교하고 적절한 사용 사례를 분석해보겠습니다.


1. List 인터페이스란?

List는 Java의 java.util 패키지에 속해 있으며, 순서가 있는 요소의 컬렉션을 제공하는 인터페이스입니다. 주요 특징은 다음과 같습니다:

  • 요소의 중복 허용
  • 인덱스를 기반으로 한 접근 가능 (get(index))
  • 순서 보장 (add()를 통한 삽입 순서 유지)
  • 동적 크기 조절 가능

Java에서 List의 주요 구현체는 ArrayList, LinkedList 입니다.


2. 주요 List 구현체 비교

2.1 ArrayList

ArrayList배열 기반List 구현체로, 요소를 동적으로 관리할 수 있습니다.

특징:

  • 배열 기반 (내부적으로 동적 배열 사용)
  • 랜덤 접근 성능 우수 (O(1))
  • 삽입 및 삭제 성능 저하 (O(n), 중간 삽입 및 삭제 시 요소 이동 필요)
  • Thread-safe 하지 않음

사용 예제:

import java.util.*;
public class ArrayListExample {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Cherry");
        System.out.println(list.get(1)); // 출력: Banana
    }
}

사용 사례:

  • 읽기 및 검색이 많은 경우 (랜덤 접근 속도가 빠름)
  • 요소 추가가 주로 끝에서 이루어지는 경우 (add() 연산이 빠름)
  • 메모리 사용을 최적화하고 싶은 경우 (링크 기반 자료구조보다 메모리 사용량 적음)


 

2.2 LinkedList

LinkedList이중 연결 리스트(Doubly Linked List) 기반의 List 구현체입니다.

특징:

  • 연결 리스트 기반 (노드가 서로 링크로 연결됨)
  • 랜덤 접근 성능 저하 (O(n), 인덱스를 찾으려면 앞에서부터 순회해야 함)
  • 삽입 및 삭제 성능 우수 (O(1), 중간 삽입 및 삭제 시 노드 연결만 변경)
  • 메모리 사용량이 많음 (각 노드가 이전/다음 노드에 대한 참조 값을 저장해야 함)
  • Thread-safe 하지 않음

사용 예제:

import java.util.*;
public class LinkedListExample {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>();
        list.add("Dog");
        list.add("Cat");
        list.add("Horse");
        list.add(1, "Elephant");
        System.out.println(list); // 출력: [Dog, Elephant, Cat, Horse]
    }
}

사용 사례:

  • 삽입 및 삭제가 빈번한 경우 (중간 삽입/삭제가 빠름)
  • 데이터 크기가 변동될 가능성이 있는 경우 (동적 크기 조절이 용이)
  • FIFO(Queue) 또는 LIFO(Stack) 구조가 필요한 경우

3. 마무리

  • ArrayList: 읽기/검색 성능이 중요할 때 사용.
  • LinkedList: 삽입/삭제가 빈번할 때 사용.