[TIL] Queue의 구현체는 왜 LinkedList일까?

스택, 큐 관련 알고리즘 문제를 풀다가 큐의 구현체는 왜 LinkedList로 만드는지 궁금해서 찾아봤다.

일단 LinkedList와 ArrayList의 차이부터 정리해보자면,

LinkedList와 ArrayList의 차이

ArrayList는 index가 있고,
LinkedList는  원소마다 , 원소의 위치값을 가지고 있다.

이러한 각각의 특징은 조회, 삽입, 삭제시에 성능의 차이가 발생된다.

ArrayList

ArrayList는 기본적으로 배열을 사용한다. 하지만 일반 배열과 차이점이 존재한다.
일반 배열은 처음에 메모리를 할당할  크기를 지정해주어야 하지만,
ArrayList는 크기를 지정하지 않고 동적으로 값을 삽입하고 삭제할  있다.
ArrayList는  데이터의 index를 가지고 있고 무작위 접근이 가능하기 때문에,
해당 index의 데이터를 한번에 가져올  있다.

1. 조회
ArrayList는  데이터의 index를 가지고 있고 무작위 접근이 가능하기 때문에, 
해당 index의 데이터를 한번에 가져올  있다.

2. 데이터 삽입과 삭제
데이터의 삽입과 삭제시 ArrayList는 그만큼 위치를 맞춰주어야 한다.
삽입과 삭제가 많다면 ArrayList는 비효율적이다.


LinkedList

LinkedList는 내부적으로 양방향의 연결 리스트로 구성되어 있어서 
참조하려는 원소에 따라 처음부터 정방향 또는 역순으로 순회 가능하다.
(배열의 단점을 보완하기 위해 LinkedList가 고안되었다.)

1. 조회
LinkedList는 순차적 접근이기 때문에 검색의 속도가 느리다.

2. 데이터 삽입과 삭제
LinkedList는  데이터를 추가·삭제시 가리키고 있는 주소값만 변경해주면 되기 때문에 
ArrayList에 비해 상당히 효율적이다.
이처럼 조회시에는 ArrayList가 우위에 있지만, 
삽입/삭제 시에는 LinkedList가 뛰어난 성능을 보여준다.

소량의 데이터를 가지고 사용할 때는 사실  차이가 없지만,
정적인 데이터를 활용하면서 조회가 빈번하다면 ArrayList를 사용하는 것이 좋고,
동적으로 추가/삭제 요구사항이 빈번하다면 LinkedList를 사용하는 것이 좋다.

ArrayList에서는 무작위 접근이 가능하지만, LinkedList에서는 순차접근만 가능하다.

정리하자면
순차적으로 데이터를 추가/삭제 하는 경우에는 ArrayList를 사용하고, 
처음, 중간 데이터를 추가/삭제하는 경우에는 LinkedList를 사용하는것이 좋다.

Queue의 구조

큐의 구조는 한쪽에서는 삽입만 일어나고 한쪽에서는 삭제만 하는 자료구조(FIFO)이다.

, 큐는 항상  번재 저장된 데이터를 삭제하므로, 

ArrayList와 같은 배열 기반의 자료구조를 사용하게 되면 빈공간을 채우기 위해서 
데이터의 복사가 발생하므로 매우 비효율적입니다.

따라서,

Queue는 ArrayList보다 데이터의 추가/삭제가 쉬운 LinkedList로 구현하는 것이 적합하다.