일반적으로 배열이라는 자료구조의 개념은 동일한 크기의 메모리 공간이 빈틈 없이 연속적으로 나열된 자료구조이다. 배열은 연속적인 메모리 로케이션들의 묶음을 사용하여 값을 저장하는데 사용한다. 중요한 것은 연속적이고 빈틈 없이 인접하다는 것이다.
C언어에서 int arr[4];
를 선언하고 메모리의 첫 주소가 1201
으로 시작하는 메모리 블록을 포착했다고 가정하자. 이 때, arr[2]를 읽으려고 한다면 아주 간단한 연산을 통해 arr[2]의 메모리 주소를 찾을 수가 있다. 1201 + (2 * 4) = 1209
이렇게 말이다. 이런 배열은 인덱스를 통해 효율적으로 요소에 접근할 수가 있다. 하지만 정렬되지 않은 배열에서 특정한 요소를 검색하는 경우에는 배열의 모든 요소를 처음부터 특정 요소를 발견할 때까지 차례대로 검색해야 한다. 또한 배열의 요소를 삽입, 삭제를 할 경우에 연속성을 유지하기 위해 요소를 이동시켜야 한다.
Javascript의 배열은 위에서 살펴본 배열의 의미와는 다르다. 배열의 요소를 위한 각각의 메모리 공간은 동일한 크기를 갖지 않아도 되고 연속적으로 이어져 있지 않을 수 있다. 그 이유는 Javascript에서의 배열은 일반적인 배열의 동작을 흉내낸 특수한 객체이기 때문이다.
const array = ['a', 'b', 'c']; console.log(Object.getOwnPropertyDescriptors(array)); /* { 0: {value: 'a', writable: true, enumerable: true, configurable: true} 1: {value: 'b', writable: true, enumerable: true, configurable: true} 2: {value: 'c', writable: true, enumerable: true, configurable: true} length: {value: 3, writable: true, enumerable: false, configurable: false} } */
위의 예시처럼 자바스크립트 배열은 인덱스를 나타내는 값을 프로퍼티 키로 가지며 length 프로퍼티를 갖는 특수한 객체다. 자바스크립트 배열의 요소는 사실 프로퍼티 값인 것이다. 자바스크립트 배열은 해시테이블로 구현된 객체이므로 인덱스로 요소에 접근하는 경우 일반적인 배열보다 성능적인 면에서 느릴 수밖에 없는 구조적인 단점이 있다. 하지만 특정 요소를 검색하거나 요소를 삽입, 삭제하는 경우에는 일반적인 배열보다 빠른 성능을 기대할 수 있다.
검색하고자 하는 키값을 입력 받아서 해시함수를 돌려서 반환받은 해시코드를 배열의 인덱스로 환산해서 데이터에 접근하는 자료구조