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: 삽입/삭제가 빈번할 때 사용.