자료구조

[자료구조] (1) ArrayList와 LinkedList의 차이

sagecode 2025. 4. 22. 19:56

Java Collection

Java는 개발자들이 다양한 자료구조를 사용하게 할 수 있도록 Collection 프레임워크를 지원한다. 이 프레임워크는 데이터를 저장하고 다루는 방식을 추상화하여, 상황에 맞는 자료구조를 손쉽게 선택할 수 있도록 도와준다.

 

그 중에서도 List는 순서가 있는 데이터 저장에 적합하며, 실무에서 가장 자주 사용되는 컬렉션 중 하나다.
Java에서는 대표적으로 ArrayListLinkedList가 List 인터페이스를 구현하고 있으며, 기능은 유사하지만 내부 구조와 성능 특성은 크게 다르다.

 

ArrayList란?

ArrayList는 List 인터페이스를 상속받은 클래스이다. int[], string[] 같이 정적 배열과는 다르게 크기가 변할 수 있다.

 

내부적으로 Object[] 배열을 사용해서 데이터를 저장한다. 원래 기본값은 10개의 데이터 칸을 가지고 있으며, 만약 더 삽입을 하게되어 자리가 부족할 경우 배열을 복사하여 1.5배를 늘려 사용한다.

출처 : https://www.codelatte.io/courses/java_programming_basic/5N27027VT1DBUAX0

 

그럼 왜 Object[]를 사용하지 않고 ArrayList를 사용하는가?

  • Object[]는 정적 배열이며, 크기가 정해져 있어 더 데이터를 삽입할 경우 문제가 생긴다. ArrayList는 자동으로 크기를 확장시켜 줄 수 있다.
  • ArrayList<>는 제네릭(Generic)을 지원하기 때문에 특정 타입의 객체를 지정해서 저장해야 해서 따로 형변환이 필요하지 않다.
  • get(int index), add(int index), remove(int index) 같이 여러가지 기능을 사용할 수 있다.

 

LinkedList란?

Java의 LinkedList는 노드(Node)들이 서로 연결되어 있는 구조의 자료구조로, List와 Deque의 특성을 모두 가지고 있다. 보통 연결리스트를 linkedlist라고 하지만 Java에서 지원하는 LinkedList는 그 중에서 이중연결리스트를 지원한다.


기존 배열 기반 자료구조는 크기를 미리 지정해야 하기 때문에, 남는 공간이 생기면 메모리 낭비가 발생할 수 있다.
이와 달리 LinkedList는 필요한 만큼의 데이터를 순차적으로 연결해 저장하기 때문에, 메모리 공간을 보다 유동적으로 활용할 수 있다.

 

출처 : https://velog.io/@woojinn8/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0-Linked-List

 

내부 구조

  • 각 데이터는 Node 객체로 구성되어 있으며, 각각 데이터(data)와 이전/다음 노드에 대한 참조(prev, next)를 가진다.
  • Java의 LinkedList는 이중 연결 리스트로 구현되어 있어 양방향 탐색이 가능하다.

 

ArrayList와 LinkedList의 차이는 무엇인가?

두 자료구조 모두 List 인터페이스를 구현하고 있지만, 내부 구조와 연산 성능, 사용 목적이 다르다. 아래 표를 통해 주요 차이점을 비교할 수 있다

항목 ArrayList LinkedList
내부 구조 동적 배열 이중 연결 리스트
메모리 구조 연속적인 공간에 저장 비연속적인 노드를 참조로 연결
인덱스 접근 O(1) (빠름) O(n) (느림)
삽입/삭제 (중간) O(n) (뒤 요소들 이동 필요) O(1) (참조만 변경)
삽입/삭제 (앞/뒤) 앞: 느림 / 뒤: 빠름 앞/뒤 모두 빠름 (addFirst, addLast)
메모리 사용 상대적으로 효율적 노드마다 포인터 추가 저장으로 오버헤드 발생

언제 어떤 리스트를 써야 할까?

상황추천 자료구조 이유
인덱스를 자주 사용해 접근할 경우 ArrayList 배열 기반이므로 랜덤 접근 속도가 빠름
중간에 데이터를 자주 삽입/삭제할 경우 LinkedList 노드의 참조만 변경하면 되므로 효율적
데이터 추가/삭제는 거의 없고 조회 위주일 경우 ArrayList 전체적으로 더 가볍고 빠름
큐 또는 덱(Deque) 형태로 사용해야 할 경우 LinkedList addFirst, removeLast 등 Deque 기능 지원