본문으로 건너뛰기

Array

  • 같은 자료형의 데이터를 연속된 메모리 공간에 저장하는 선형 자료구조
  • 배열의 원소에 인덱스를 통해 random access
  • 배열의 크기는 선언 시점에 결정된다(크기 고정, 동적으로 크기 변경 불가).
    • 정적으로 선언 -> 컴파일에 사이즈를 알 수 있으므로 stack에 저장
    • 런타임에 동적으로 선언 -> heap에 저장
  • 배열의 삽입과 삭제 연산은 시간 복잡도가 높아, 빈번한 삽입과 삭제가 필요한 경우에는 적합하지 않음
  • 배열은 선언시점에 길이만큼 메모리를 할당하므로, 크기가 클 경우 메모리 낭비가 발생할 수 있음

Array in JS

C, C++에서 사용되는 전통적인 배열의 개념과 JS에서의 배열 개념에는 차이가 있다.

배열은 연속된 메모리 공간에 동일한 크기(같은 type)의 데이터가 할당된 빈틈없이 연속적으로 나열된 자료 구조이다.

이를 **밀집 배열(dense array)**이라 한다.

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

반면에 JS에서의 배열은 해시테이블을 기반으로 하기에 element를 위한 각각의 메모리 공간은 동일한 크기를 갖지 않아도 되며 연속적으로 이어져 있지 않을 수도 있다.

이처럼 자바스크립트의 배열은 엄밀히 말해 일반적 의미의 배열이 아닌 일반적인 배열의 동작을 흉내낸 특수한 객체이다.

그 한계로 밀집 배열보다 성능적으로 불리할 수 밖에 없는데 배열을 순회할 때,

메모리상 데이터들이 흩어져 있어 캐시 지역성이 좋지 않고, 캐시 미스(cache miss)가 자주 발생하여 성능이 저하될 수 있다.

이 개념은 가상메모리와 연관성이 있다.

다만 JS엔진에서 성능 최적화를 위해 같은 타입의 요소만 사용하는 배열의 경우 연속된 메모리 공간에 저장하는 최적화를 수행한다.

그러니 해당 부분 유의하자.

참조