
중복을 허용하고 순서대로 데이터를 저장하는 추상 데이터 자료형(ADT; Abstract Data Type)
자바에서 구현체로는 ArrayList와 LinkedList가 있다.
프로그래밍 언어 순위를 저장하려는 경우,
학번 순 대로 학생들을 저장하려는 경우 등
순서대로 저장할 필요가 없더라도, 꼭 Set이나 Map 등을 사용해야 하는 경우가 아니라면 대체로 List를 사용한다.
배열을 사용하여 리스트를 구현하였기 때문에 연속적인 공간에 순차적으로 데이터를 저장한다.
배열은 크기를 지정하고, 해당 크기 만큼의 연속된 메모리 공간을 할당받는 자료형이다. 배열의 단점은 크기가 고정되어, 한번 생성된 배열은 크기를 변경할 수 없다는 것이다. 크기를 예측할 수 없다면 너무 적은 영역을 할당해 모자라거나 너무 큰 영역을 할당해 낭비될 수 있다. 그럴때마다 개발자가 직접 새 배열을 생성해 기존 배열의 값을 복사해주어야 하는 불편함이 있다.
이러한 문제를 해결하고자 나온 것이 동적 배열이다.
동적 배열은 크기를 미리 지정하지 않고 자동으로 resizing하는 배열이다.
자바가 지원하는 동적배열은 ArrayList, C++은 std::vector이다.
파이썬과 루비 같은 언어는 편의를 위해 동적 배열만 제공한다.
자바의 ArrayList는 초기값으로 크기가 10인 배열을 생성하고, 공간이 가득차면 늘려주고 복사하는 방식이다. 이것을 Doubling이라 하며, 재할당 비율을 Growth Factor라고 한다.
자바는 아래와 같이 비트 연산으로 계산하도록 구현되어 있으며 이 비율은 정확히 1.5배이다.
int newCapacity = oldCapacity + (oldCapacity >> 1);

배열이 빠른 조회가 가능한 이유는
2번째에 있는 값을 알고 싶을 때, 0x1001 주소로부터 (2-0)x4 만큼 떨어진 곳인 0x1009라는 주소를 찾아가 해당 위치에 저장된 14라는 값을 바로 찾을 수 있기 때문이다. *(int는 4byte)
배열이 1억개라도 마찬가자지이다. 즉시 주소를 계산할 수 있고, 언제든 해당 메모리 주소에 있는 값을 O(1)에 조회 가능하다.
노드를 연결(Link)을 통해 리스트를 구현하였기 때문에 비연속적인 공간에 순차적으로 데이터를 저장한다.
자바에서 연결리스트를 구현한 자료형은 LinkedList이며, 연결리스트의 특성상 다양한 인터페이스를 제공한다. 리스트가 될 수 있고, 큐, 데크가도 될 수 있다.
자바의 LinkedList는 이중 연결 리스트(Doubly Linked List)이다.
텍스트
// 실제 자바의 LinkedList 코드 (대충 이런식임)
public class LinkedList<E> {
int size;
Node first;
Node last;
... // 생성자들, 메소드들
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
... // 생성자
}
}
자바의 LinkedList는 연결리스트의 처음 item과 마지막 item을 참조하는 first, last 필드를 가지고 있고, 모든 요소의 개수를 담는 size 필드를 가지고 있다.
또한 노드 각각은 다음 노드의 참조값만 가지는 것이 아니라 이전 노드도 참조값도 가지고 있다.
// LinkedList의 사용
public class Student {
String name;
public Student(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
List<Student> stdents = new LinkedList<>();
students.add(new Student("이은빈"));
students.add(new Student("주효림"));
students.add(new Student("김현민"));
}
}

자바의 메모리 구조에 대해서 잘 모른다면 자바의 메모리 구조와 static을 보고 오자!
💡 Java의 LinkedList는 Doubly Linked List
나 왜 Circular로 알고 있었니?;;
참고
* 쉬운코드 유튜브, 자바 알고리즘 인터뷰 책 추천!! 자바 알고리즘 인터뷰는 문제 해설 부분은 약간 아쉽지만 그 전에 개념 설명 부분들은 문장 하나하나 핵심이 담겨있음.