Web/Vanilla JS

JS는 어떻게 배열의 사이즈를 지정하지 않고 사용할 수 있을까?

KimMinJun 2024. 6. 16. 17:33

JavaScript의 Array Objects

ECMAScript 2025 문서엔 다음과 같이 나와있습니다.

 

ECMAScript® 2025 Language Specification

The first and subsequent editions of ECMAScript have provided, for certain operators, implicit numeric conversions that could lose precision or truncate. These legacy implicit conversions are maintained for backward compatibility, but not provided for BigI

tc39.es

"Arrays are exotic objects that give special treatment to a certain class of property names."

"배열은 특정 클래스의 속성에 대해 특별한 처리를 하는 특별 객체이다."

 

사실 위 문장만 봐서는 이해되지 않았습니다. 특별 객체가 뭔지를 일단 알아야 할 것 같고, "특별 객체가 있다면 일반 객체와의 다른점이 뭐길래 특별 객체라고 부르지?" 라는 궁금점이 생겼습니다.

 

일반 객체 (Ordinary Objects)

일반 객체는 우리가 JavaScript에서 흔히 사용되는 기본 객체입니다. 예를 들어 다음과 같은 일반적인 객체와 같습니다.

let object = { key: 'value };

 

 

특별 객체 (Exotic Objects)

특별 객체는 특정한 규칙에 따라 특별한 방식으로 동작하는 객체입니다.

배열이 특별 객체인 이유인 대표적인 예로, 숫자 인덱스에 대해 특별한 처리를 하면서 동작합니다.

 

  • DefineOwnProperty : 배열 인덱스를 정의할 때 'length' 속성이 자동으로 업데이트됩니다.
  • Delete : 배열 요소를 삭제할 때, 배열의 'length' 속성이 적절히 조정됩니다.

일반 객체는 기본적인 속성 접근, 설정, 삭제 등의 표준 동작을 따르지만, 위와 같이 특별 객체는 이러한 동작을 커스터마이즈하여 특수한 기능을 수행합니다.

 

V8 엔진의 구현 방식

Google의 V8 엔진은 배열을 효율적으로 관리하기 위해 다음과 같은 방식을 사용합니다.

  • 초기 메모리 할당 : 배열이 생성될 때 소량의 메모리를 할당합니다.
  • 자동 크기 조정 : 배열이 가득 차면 더 큰 메모리 블록을 할당하고 기존 요소를 복사합니다.
  • Packed Elements와 Holey Elements : 배열이 연속적이면 Packed Elements, 불연속적이면 Holey Elements로 관리합니다.

 

Packed Elements

Packed Elements는 배열 요소들이 연속적으로 채워져 있는 경우를 의미합니다. 이 경우 배열은 메모리에서 연속된 블록으로 관리되며, 빠른 접근과 수정이 가능합니다. 예를 들어 다음과 같은 경우입니다.

let arr = [1, 2, 3, 4, 5];

 

Holey Elements

Holey Elements는 배열 요소들이 연속적이지 않고 중간에 비어 있는 경우를 의미합니다. 이 경우 배열은 해시 테이블과 유사한 구조로 관리되며, 메모리 효율을 떨어지지만 특정 인덱스에 접근할 때 비용이 증가합니다. 예를 들어 다음과 같은 경우입니다.

let arr = [];
arr[0] = 1;
arr[10] = 11; // 1~9는 비어있다.

 

결론

JavaScript 배열은 동적으로 크기를 조정할 수 있어 매우 유연하고 사용하기 쉽습니다.

이는 배열을 특별 객체로 처리하기 때문입니다.