Java의 배열과 리스트에 대해 알아보겠습니다. 배열(Array)여러 데이터를 하나의 이름으로 그룹핑하여 관리하기 위한 자료구조입니다. 논리적인 저장 순서와 물리적인 저장 순서가 같으며 연속된 메모리 공간을 차지합니다. 배열의 값에는 index를 통해 접근할 수 있습니다. 배열은 선언과 동시에 크기를 지정해야합니다.
장점 - 인덱스를 통해 검색이 용이합니다. - 연속된 메모리 공간을 가지므로 관리에 용이합니다. 단점 - 크기가 고정되기 때문에 데이터가 삭제되는 경우 빈 공간이 생겨 메모리가 낭비됩니다. - 배열의 크기를 컴파일 이전에 반드시 지정해야 하며, 초기에 크기가 지정되면 변경할 수 없습니다. 리스트(List)순서가 있는 데이터들의 집합입니다. 불연속적인 메모리 공간에 데이터들이 연관되며 포인터를 통해 각 데이터들이 연결됩니다. 리스트는 동적으로 크기가 정해지며 데이터의 삽입, 삭제가 배열에 비해 용이하고 메모리의 재사용성이 높아집니다. ArrayList 일반 배열과 ArrayList는 인덱스로 접근이 가능하다는 공통점이 있지만, ArrayList는 크기를 동적으로 늘릴 수 있다는 차이점이 있습니다. ArrayList의 경우 초기 용량은 10이고, 초기에 지정한 용량(또는 기본 용량)을 초과할 경우 배열의 크기를 1.5배로 증가시킵니다.
배열과 ArrayList의 차이를 표로 살펴보겠습니다.
ArrayList에 데이터를 추가하고 삭제하는 방식을 그림으로 살펴보겠습니다. ArrayList도 결국 배열이기 때문에 고정된 크기를 사용합니다. ArrayList의 크기(capacity)를 초과하여 데이터를 저장하는 경우 내부적으로 늘어난 크기의 새로운 배열을 생성하고(Arrays.copyOf()) 저장될 연속된 공간을 찾아 모든 값을 새롭게 저장합니다. ❗️크기(capacity) vs 길이(size) capacity는 ArrayList가 수용할 수 있는 최대 크기이며, 초기에는 기본값이 10으로 정해집니다. size는 실제 ArrayList 내에 저장된 데이터의 길이입니다. 만약 size가 capacity를 초과하는 경우에는 새로운 크기의 배열을 생성하여 기존 데이터들을 모두 복사한 뒤, 기존 capacity를 초과한 길이의 데이터들을 추가하는 작업이 일어납니다. index를 통해 빠른 검색을 할 수 있지만, 데이터의 추가 및 삭제가 빈번하게 일어나는 경우 LinkedList를 사용하는 것이 더 효율적입니다. LinkedList 노드 간에 연결(Link)을 통해 리스트를 구현한 것입니다. 인덱스를 가지고 있지 않고 다음 노드의 위치에 대한 포인터만 가지고 있기 때문에 순차 접근을 통해 데이터를 찾아야 합니다.
LinkedList에 데이터를 추가하고 삭제하는 방법을 그림으로 살펴보겠습니다. LinkedList를 직접 구현해보도록 하겠습니다. 직접 구현하는 LinkedList는 int 타입의 값을 저장할 수 있는 리스트입니다. 각 노드를 ListNode라는 클래스로 만들었습니다.
그런 다음 노드들의 관계를 관리하는 LinkedListManager 클래스를 만들어 보겠습니다. 이 클래스는 노드를 추가하고 삭제하는 등의 기능을 담당하고 있습니다.
LinkedListManager를 생성하여 노드들을 추가, 삭제, 값을 포함하고 있는지를 확인해보겠습니다.
참고velog.io/@adam2/Array%EC%99%80-List%EA%B7%B8%EB%A6%AC%EA%B3%A0-Java-List www.delftstack.com/ko/howto/java/initialize-arraylist-java/ velog.io/@dion/difference-between-array-and-list |