자바스크립트에는 여타 언어들과 같이 배열이 존재한다.
배열을 생성하는 방법에는
Array 생성자 함수를 사용하는 방법과 Array.of Array.from을 사용하거나 배열 리터럴을 사용하는 방법이 있다.
가장 간편한 배열 리터럴을 사용해 배열을 생성하는 경우 프로퍼티 키가 없고 값만 존재한다. 배열의 요소가 연속적으로 일치하지 않고 일부가 비어있는 배열 [1, ,, 2])을 생성할 수 있지만 배열(연속된 메모리 공간 확보)이라는 기본적인 개념과 맞지않으며 성능에 좋지않은 영향을 주기때문에 생성하지 않는 것이 좋다.
즉, 배열이라는 자료구조를 효율적으로 이용하기 위해서는 같은 타입의 요소를 연속적으로 위치시키는 것이 권장된다.
앞서 말했듯이 배열은 연속된 메모리 공간의 확보하는 설명했다. 이는 JAVA, C 등의 경우에 해당한다.
자바의 경우 배열을 생성할 때
int[] arr = {1,2,3,4,5};
따위의 방법으로 배열을 생성한다. 각 요소가 동일한 데이터 크기(4byte)를 가지며 빈틈없이 연속적으로 이어지므로 한 번의 연산으로 random acccess, 시간복잡도는 O(1)이다. 효율적이며 고속이다.
즉 검색 대상 요소의 메모리 주소 = 배열의 시작 메모리 주소 + 인덱스 + 요소의 바이트 수
예를 들어 계산하자면 배열에서 인덱스가 1인 요소의 메모리 주소는 2022(예시) + 1 * 4(int type의 바이트 크기) = 2026의 주소를 가진다.
자바스트립드의 배열은 알다시피 간단한 배열리터럴로 만드는 경우
const arr = ['안녕하세요', 1, ,, 'aa', 1.2];
이렇게 만들 수 있다.
각 요소가 동일한 데이터 크기를 가지지 않을 수 있으며 빈틈이 존재할 수 있다. 물론 배열에서 특정요소를 검색하거나 요소를 삽입 또는 삭제하는 경우 일반 배열보다 빠르다.
자바스크립트의 배열은 따지자면 자료구조중 Linked List에 해당한다. 즉 특정 요소 검색을 하는 경우 선형 검색(liner Search)해야한다. 시간복잡도는 O(n)이다.
자바스크립트에서 선형검색을 하는 코드는 다음과 같다.
// 차례대로 검색하는 선형탐색 사용
// 특정 요소 발견 시 반환 없으면 -1 반환
function linerSearch(arr, target) {
const length = arr.length;
for (let i = 0; i <= length; i++;) {
if (arr[i] === target) return i;
}
return -1;
}
console.log(linerSearch(['안녕하세요', 1, ,, 'aa', 1.2], 1.2)); // 1.2
console.log(linerSearch(['안녕하세요', 1, ,, 'aa', 1.2], 3)); // -1
자바와 같은 언어들의 배열을 밀집배열(dense array)이라하고, javascript의 배열은 JAVA 와 같은 언어의 배열을 흉내낸 Hash table 을 구현한 특수한 객체이다.