ArrayList와 LinkedList의 차이는 무엇인가요?
ArrayList와 LinkedList는 자바에서 가장 많이 사용되는 List 인터페이스의 두 가지 구현체로, 내부 자료구조와 성능 특성에서 차이가 있습니다.
각각의 차이점을 이해하면 상황에 따라 적절한 리스트를 선택할 수 있습니다.
--- 1. 내부 자료구조 - ArrayList - 동적 배열(dynamic array)을 기반으로 구현되어 있습니다.
- 요소가 추가되면 배열의 크기가 자동으로 늘어나며, 인덱스를 통해 요소에 빠르게 접근할 수 있습니다.
- LinkedList - 이중 연결 리스트(doubly linked list) 자료구조로 구현되어 있습니다.
- 각 요소는 데이터와 이전 노드, 다음 노드에 대한 참조(pointer)를 포함합니다.
--- 2. 원소 접근 속도 - ArrayList - 인덱스를 통한 임의 접근(random access)이 매우 빠릅니다 (시간복잡도 O(1)). - 내부적으로 배열이기 때문에 인덱스를 알고 있으면 직접 해당 위치의 요소로 바로 갈 수 있습니다.
- LinkedList - 인덱스를 통한 접근 시 처음부터 또는 끝부터 노드를 하나씩 따라가야 하므로 느립니다 (시간복잡도 O(n)). - 즉, 중간 인덱스에 접근하려면 링크를 따라 순차 접근해야 합니다.
--- 3. 삽입 및 삭제 성능 - ArrayList - 리스트 중간에 삽입 또는 삭제 시, 해당 위치 뒤의 요소들을 모두 한 칸씩 이동시켜야 하므로 성능이 떨어집니다 (최악 O(n)). - 단, 리스트 끝에 추가는 일반적으로 빠릅니다 (평균 O(1), 다만 배열 크기 확장 시 O(n) 발생). - LinkedList - 중간에 삽입이나 삭제 시 노드의 링크를 변경하는 작업만 필요하므로 빠릅니다 (O(1), 단 인덱스 위치를 찾는 시간 제외). - 처음 또는 끝에 원소를 추가/삭제하는 것도 매우 빠릅니다.
--- 4. 메모리 사용 - ArrayList - 내부적으로 배열만 사용하므로 각 원소당 추가적인 메모리 오버헤드가 적습니다.
- 다만 배열 확장을 위해 미리 할당하는 여유 공간 때문에 메모리 낭비가 일부 있을 수 있습니다.
- LinkedList - 각 노드가 데이터 외에 두 개의 참조(이전, 다음 노드)를 포함하므로 메모리 오버헤드가 더 큽니다.
--- 5. 정리 | 특징 | ArrayList | LinkedList | |----------------|------------------------------|--------------------------------| | 내부 구조 | 동적 배열 | 이중 연결 리스트 | | 임의 접근 속도 | 빠름 (O(1)) | 느림 (O(n)) | | 중간 삽입/삭제 | 느림 (O(n)) | 빠름 (O(1), 위치 찾기 제외) | | 메모리 사용 | 적음 | 많음 | | 끝 부분 추가/삭제 | 빠름 | 빠름 | --- 6. 언제 사용할까? - ArrayList 추천 상황 - 주로 인덱스를 이용한 원소 접근이 많을 때 - 읽기 작업 위주이고 요소 추가/삭제가 드물 때 - LinkedList 추천 상황 - 빈번하게 리스트 중간에서 삽입/삭제가 일어날 때 - 순차적으로 리스트를 탐색하고, 임의 접근이 적을 때 --- 참고사항 - 자바 1.7 이후부터 ArrayList의 증가 전략이 개선되어 과도한 복사를 줄였고, 기본적인 성능이 좋아졌습니다.
- 컬렉션 프레임워크의 특성에 따라 선택하는 것이 가장 중요하며, 직접 벤치마킹을 통해 성능을 점검하는 것도 권장됩니다.
--- 이상으로 ArrayList와 LinkedList의 주요 차이점에 대해 설명드렸습니다.