본문 바로가기

Javscript

[Javascript] 다른 언어 배열들과의 차이점, 장단점 (1/28)

반응형

 오매 겁나 밀렷다.,,,, 빨리 정리하고 잠을 청하도록 하자 ,,,!!!


자바스크립트 배열은 배열이 아니다.

 

일반적으로 배열이라는 자료 구조의 개념은 동일한 크기의 메모리 공간이 빈틈없이 연속적으로 나열된 자료 구조를 말한다.

 

즉, 배열의 요소는 하나의 타입으로 통일되어 있으며 서로 연속적으로 인접해 있다.

 

이러한 배열을 밀집 배열(dense array) 이라 한다.

 

배열은 인덱스를 통해 효율적으로 요소에 접근할 수 있다.

 

하지만,

 

정렬되지 않은 배열에서 특정한 값을 탐색하는 경우, 모든 배열 요소를 처음부터 값을 발견할 때까지 차례대로 탐색(선형 탐색)해야한다.

 

이 때, 시간 복잡도는 O(n)이다.

 

 

자바스크립트는 일반적인 배열과 다르다.

 

즉, 배열의 요소를 위한 각각의 메모리 공간은 동일한 크기를 갖지 않아도 되며 연속적으로 이어져 있지 않을 수도 있다.

 

배열의 요소가 연속적으로 이어져 있지 않는 배열을 희소 배열(sparse array) 이라 한다.

 

자바스크립트의 배열은 일반적인 배열의 동작을 흉내낸 특수한 객체이다.

 

console.log(Object.getOwnPropertyDescriptors([1, 2, 3]));
/*
{
  '0': { value: 1, writable: true, enumerable: true, configurable: true },
  '1': { value: 2, writable: true, enumerable: true, configurable: true },
  '2': { value: 3, writable: true, enumerable: true, configurable: true },
  length: { value: 3, writable: true, enumerable: false, configurable: false }
}
*/

 

위처럼 자바스크립트 배열은 인덱스를 프로퍼티 키로 가지며 length 프로퍼티를 갖는 특수한 객체이다.

 

자바스크립트 배열의 요소는 사실 프로퍼티 값이다.

 

자바스크립트에서 사용할 수 있는 모든 값은 객체의 프로퍼티 값이 될 수 있으므로 어떤 타입의 값이라도 배열의 요소가 될 수 있다.

 

 

일반적인 배열과 자바스크립트의 장단점

 

  • 일반적인 배열은 인덱스로 배열 요소에 빠르게 접근할 수 있다. 하지만 특정 요소를 탐색하거나 요소를 사입 또는 삭제하는 경우에는 비효율 적이다.
  • 자바스크립트 배열은 해시 테이블로 구현된 객체이므로 인덱스로 배열 요소에 접근하는 경우, 일반적인 배열보다 성능적인 면에서 느릴 수 밖에 없는 구조적인 단점을 가진다. 하지만, 특정 요소를 탐색하거나 요소를 삽입 또는 삭제하는 경우에는 일반적인 배열보다 빠른 성능을 기대할 수 있다.

 

즉, 자바스크립트 배열은 인덱스로 배열 요소에 접근하는 경우에는 일반적인 배열보다 느리지만 특정 요소를 탐색하거나 요소를 삽입 또는 삭제하는 경우에는 일반적인 배열보다 빠르다.

 

자바스크립트 배열은 인덱스로 접근하는 경우의 성능 대신 특정 요소를 탐색하거나 배열 요소를 삽입 또는 삭제하는 경우의 성능을 선택한 것이다.

 

이처럼, 인덱스로 배열 요소에 접근할 때 일반적인 배열보다 느릴 수 밖에 없는 구조적인 단점을 보완하기 위해 대부분의 모던 자바스크립트 엔진은 배열을 일반 객체와 구별하여 보다 배열처럼 동작하도록 최적화하여 구현했다.

 

아래 코드와 같이 배열과 일반 객체의 성능을 테스트해보면 배열이 일반 객체보다 약 1.5배 빠른 것을 볼 수 있다.

 

const arr = [];

console.time('Array Performance Test');

for (let i = 0; i < 10000000; i++) {
  arr[i] = i;
}
console.timeEnd('Array Performance Test');
// 약 290ms

const obj = {};

console.time('Object Performance Test');

for (let i = 0; i < 10000000; i++) {
  obj[i] = i;
}

console.timeEnd('Object Performance Test');
// 약 380ms
반응형