Table of Contents
자바 컬렉션 프레임워크 - List 인터페이스
1. List 인터페이스란?
List
인터페이스는 순서가 있는 데이터의 집합을 표현하며, 중복 요소를 허용하는 특징이 있습니다.
배열과 유사하지만 크기가 동적으로 변하며, 다양한 메서드를 제공하여 요소 추가, 삭제, 검색 등을 효율적으로 처리할 수 있습니다.
2. 주요 특징
- 순서 보장: 삽입한 순서를 유지합니다.
- 중복 허용: 동일한 값을 여러 개 저장할 수 있습니다.
- 인덱스 기반 접근: 요소를 인덱스를 통해 직접 접근할 수 있습니다.
- 다양한 구현체 제공:
ArrayList
,LinkedList
,Vector
등이 존재합니다.
3. 주요 구현 클래스
자바의 List
인터페이스는 다양한 구현 클래스를 제공합니다. 각 클래스의 특성과 차이점을 이해하면 상황에 맞는 적절한 자료구조를 선택할 수 있습니다.
3.1 ArrayList
- 내부적으로 배열을 사용하여 요소를 저장합니다.
- 검색 속도가 빠름 (O(1), 인덱스 기반 접근 가능)
- 삽입, 삭제가 상대적으로 느림 (O(n), 중간 요소 이동 필요)
- 용도: 조회가 많고, 삽입/삭제가 적은 경우
List<String> arrayList = new ArrayList<>();
arrayList.add("Java");
arrayList.add("Python");
System.out.println(arrayList.get(0)); // Java
3.2 LinkedList
- 이중 연결 리스트(Doubly Linked List)로 구현되어 있음
- 삽입, 삭제 속도가 빠름 (O(1), 노드 포인터 변경만 필요)
- 검색 속도가 상대적으로 느림 (O(n), 순차 탐색 필요)
- 용도: 삽입/삭제가 빈번한 경우
List<String> linkedList = new LinkedList<>();
linkedList.add("C");
linkedList.add("C++");
linkedList.addFirst("Assembly");
System.out.println(linkedList); // [Assembly, C, C++]
3.3 Vector
ArrayList
와 유사하지만 동기화(synchronized) 지원- 멀티스레드 환경에서 안전하지만 단일 스레드 환경에서는 성능이 다소 느림
- 일반적으로
ArrayList
를 사용하고, 동기화가 필요하면Collections.synchronizedList()
활용
List<String> vector = new Vector<>();
vector.add("Go");
vector.add("Rust");
System.out.println(vector); // [Go, Rust]
4. 주요 메서드
메서드 | 설명 |
---|---|
add(E e) |
요소 추가 |
get(int index) |
해당 인덱스의 요소 반환 |
remove(int index) |
해당 인덱스의 요소 삭제 |
set(int index, E element) |
요소 변경 |
size() |
리스트 크기 반환 |
contains(Object o) |
특정 요소 포함 여부 확인 |
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Kotlin");
list.remove("Java");
System.out.println(list.contains("Kotlin")); // true
5. List vs 배열
비교 항목 | List | 배열(Array) |
---|---|---|
크기 조정 | 동적 조정 가능 | 고정 크기 |
데이터 삽입/삭제 | O(n) (ArrayList) / O(1) (LinkedList) | O(n) |
접근 속도 | O(1) (ArrayList) / O(n) (LinkedList) | O(1) |
메모리 사용량 | 추가적인 객체 사용 | 상대적으로 적음 |
6. 결론
자바의 List
인터페이스는 순서가 있는 데이터를 저장하고 관리하는 데 최적화된 자료구조입니다.
특정 작업에 맞는 구현체(ArrayList
, LinkedList
, Vector
)를 선택하면 보다 효율적인 성능을 얻을 수 있습니다.
다음 블로그에서는 Set
인터페이스에 대해 알아보겠습니다!