선형 자료 구조 - 동적배열
선형 자료 구조란 연속된 자료를 저장하기 위한 자료 구조입니다.
이에 해당하는 가장 기초적인 자료구조는 배열로써, 배열의 원소들은 모두 연속된 메모리 위치에 저장되며, 인덱스를 통해 원소를 참조하거나 변경하는데 걸리는 시간이 O(1)에 수행되는 두 가지 특징을 갖고 있습니다.
배열을 사용하는 데 있어 크게 두 가지 단점이 있습니다.
첫째로는 배열을 사용하기 위해선 먼저 배열의 크기를 정해야 하기 때문에 만약 배열의 크기를 넘겨서 자료를 저장하고 싶다면 더 큰 크기의 배열을 새로 할당받아 사용해야 합니다.
둘째로는 배열의 중간에 원소를 삽입하거나 삭제할 경우, 나머지 원소들의 연속적인 순서를 맞추기 위해 삽입/삭제가 이루어진 위치의 원소 이후부터의 원소들을 (삭제의 경우)앞쪽으로 당기거나 (삽입의 경우)뒤쪽으로 밀어야합니다. 배열의 원소의 개수를 n이라고 한다면 원소들을 옮기는데 걸리는 시간은 O(n)입니다.
위의 두 가지 문제를 해결하기 위한 자료구조로 동적 배열(Dynamic array)과 연결리스트(Linked list)가 있습니다. 이 글에서는 동적 배열의 특징을 간단히 살펴보고 Java에서 제공하는 표준라이브러리를 통해 동적 배열를 사용하는 법을 알아보도록 하겠습니다.
동적 배열(Dynamic array)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | public class DynamicArray { int size; // 현재 저장된 원소 개수 int capacity; // 할당된 배열의 크기 int[] array; // 할당된 배열을 가리키는 참조변수 // 생성자 public DynamicArray() { this.size = 0; this.capacity = 1; array = new int[capacity]; } // 배열 뒤에 원소 추가하는 메서드 public void append(int element) { // 배열 공간 체크, 부족할 시 resize if (this.size >= this.capacity) { this.resize(); } // 원소 추가 this.array[size++] = element; } // 새로 배열 할당하기 public void resize() { // 배열 새로 할당 int[] newArray = new int[2 * this.capacity]; // 기존 원소 복사 for (int i = 0; i < this.capacity; i++) { newArray[i] = this.array[i]; } // 배열 정보 수정 this.array = newArray; this.capacity = 2 * capacity; } } | cs |
메서드 설명
메서드 이름 |
기능 |
add(element) |
element를 배열 뒤에 추가 |
size() |
배열 크기 반환 |
get(index) |
index 원소 참조 |
add(index, element) |
index에 element 추가 (변경x) |
set(index, element) |
index 원소 변경 |
indexOf(element) |
element의 index 반환, 없으면 -1 |
contains(element) |
element가 배열에 존재하면 true, 없으면 false 반환 |
예제코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | // ArrayList 임포트 import java.util.ArrayList; public class Main { public static void main(String[] args) { // ArrayList 생성 ArrayList array = new ArrayList(); // ArrayList.add(element): 배열 뒤에 삽입 array.add(1); array.add(2); array.add(3); array.add(4); // ArrayList.size(): 배열에 저장된 현재 크기 반환 (전체 공간 x) System.out.println(array.size()); // ArrayList.get(index): 특정 인덱스 원소 참조 for (int i = 0; i < array.size(); i++) { System.out.print(array.get(i) + ","); } System.out.println(); //ArrayList.add(index, element) : 특정 인덱스에 원소 삽입(변경x) array.add(2, 10); array.add(0, 20); // ArrayList.get(index): 특정 인덱스 원소 참조 for (int i = 0; i < array.size(); i++) { System.out.print(array.get(i) + ","); } System.out.println(); // ArrayList.set(index element): 특정 인덱스 원소 변경 array.set(1, 100); for (int i = 0; i < array.size(); i++) { System.out.print(array.get(i) + ","); } System.out.println(); // ArrayList.indexOf(element): 특정 원소 index 반환 (없으면 -1) System.out.println(array.indexOf(100)); System.out.println(array.indexOf(101)); // ArrayList.contains(element): 특정 원소 배열 존재 여부 반환 System.out.println(array.contains(100)); System.out.println(array.contains(101)); } } | cs |
다음 글에선 또 다른 선형 자료 구조인 연결리스트(Linked list)를 살펴보도록 하겠습니다.