27.1 배열이란?
- 배열은 여러 개의 값을 순차적으로 나열한 자료 구조다.
- 배열이 가지고 있는 값을 요소라고 부른다. 자바스크립트의 모든 값은 배열의 요소가 될 수 있다.
- 배열의 요소는 배열에서 자신의 위치를 나타내는 0 이상의 정수인 인덱스를 갖는다.
- 배열은 요소의 개수, 즉 배열의 길이를 나타내는 length 프로퍼티를 갖는다.
- 자바스크립트에 배열이라는 타입은 존재하지 않는다. 배열은 객체 타입이다.
* 배열과 일반 객체와 구별되는 독특한 특징
구분 | 객체 | 배열 |
구분 | 프로퍼티 키와 프로퍼티 값 | 인덱스와 요소 |
값의 참조 | 프로퍼티 키 | 인덱스 |
값의 순서 | X | O |
length 프로퍼티 | X | O |
- 인덱스로 표현되는 값의 순서와 length 프로퍼티를 갖는 배열은 반복문을 통해 순차적으로 값에 접근하기 적합한 자료구조다.
- 배열의 장점은 처음부터 순차적으로 요소에 접근할 수도 있고, 마지막부터 역순으로 요소에 접근할 수도 있으며, 특정 위치부터 순차적으로 요소에 접근할 수도 있다는 것이다.
27.2 자바스크립트 배열은 배열이 아니다.
자료 구조에서의 배열
- 동일한 크기의 메모리 공간이 빈틈없이 연속적으로 나열된 자료구조
- 배열의 요소는 하나의 데이터 타입으로 통일되어 있으며, 서로 연속적으로 인접
- 정렬되지 않은 배열에서 특정 요소를 검색하는 경우 배열의 요소를 처음부터 특정요소를 발견할 때까지 선형검색을 통해야하고, 시간복잡도는 O(n)이다.
- 배열에 요소를 삽입하거나 삭제하는 경우 배열의 요소를 연속적으로 유지하기 위해 요소를 이동시켜야 하는 단점이 있다.
- 이러한 배열을 밀집 배열이라 한다.
자바스크립트의 배열
- 배열의 요소를 위한 각각의 메모리 공간은 동일한 크기를 갖지 않아도 된다.
- 연속적으로 이어져 있지 않을 수도 있다.
- 배열의 요소가 연속적으로 이어져 있지 않은 배열을 희소 배열이라 한다.
이처럼 자바스크립트의 배열은 일반적인 자료 구조 배열의 동작을 흉내 낸 특수한 객체다.
* 자바스크립트 배열의 장단점
- 일반적인 배열은 인덱스로 요소에 빠르게 접근 가능. 특정 요소를 검색하거나 요소를 삽입 또는 삭제하는 경우 비효율적
- 자바스크립트 배열은 해시 테이블로 구현된 객체이므로 인덱스로 요소에 접근하는 경우 일반적인 배열보다 성능적인 면에서 느리다. 다만 특정 요소를 검색하거나 요소를 삽입 또는 삭제하는 경우에는 일반적인 배열보다 빠른 성능을 기대할 수 있음
27.3 length 프로퍼티와 희소 배열
- length 프로퍼티는 요소의 개수, 즉 배열의 길이를 나타내는 0 이상의 정수를 값으로 갖는다.
- length 프로퍼티의 값은 0과 2의 32제곱 -1(4,294,967,296 -1) 미만의 양의 정수다.
- length 프로퍼티의 값은 배열에 요소를 추가하거나 삭제하면 자동 갱신된다.
- length 프로퍼티 값은 요소의 개수, 즉 배열의 길이를 바탕으로 결정되지만 임의의 숫자 값을 명시적으로 할당할 수도 있다.
- 현재 length 프로퍼티 값보다 작은 숫자 값을 할당하면 배열의 길이가 줄어든다.
- 현재 length 프로퍼티 값보다 큰 숫자를 할당하는 경우, length 프로퍼티 값은 변경되지만, 실제로 배열의 길이가 늘어나지는 않는다.
const arr = [1];
arr.length = 3;
console.log(arr.length); // 3
console.log(arr); // [1, empty * 2]
// empty * 2는 실제로 추가된 배열의 요소가 아니다. 즉, arr[1]과 arr[2]에는 값이 존재하지 않는다.
// 즉 현재 length 프로퍼티 값보다 큰 숫자 값을 length 프로퍼티에 할당하는 경우 length 프로퍼티 값은
// 성공적으로 변경되지만 실제 배열에는 아무런 변함이 없다.(값 없이 비어있는 요소를 위해 메모리 공간을 확보하지 않음)
- 위 예제처럼 배열의 요소가 연속적으로 위치하지 않고 일부가 비어 있는 배열을 희소 배열이라 한다.
- 희소 배열은 배열의 뒷부분뿐만 아니라 중간이나 앞부분이 비어 있을 수도 있다.
- 일반적인 배열의 length는 배열 요소의 개수, 즉 배열의 길이와 언제나 일치하지만, 희소 배열은 length와 배열 요소의 개수가 일치하지 않는다.(희소 배열의 length는 희소 배열의 실제 요소 개수보다 언제나 크다.)
* 자바스크립트는 문법적으로 희소 배열을 허용하지만, 희소 배열은 연속적인 값의 집합이라는 배열의 기본적인 개념과 맞지 않으며, 성능에더 좋지 않은 영향을 주고 최적화가 잘 되어 있는 모던 자바스크립트 엔진은 요소의 타입이 일치하는 배열을 생성할 때 일반적인 의미의 배열처럼 연속된 메모리 공간을 확보하는 것으로 알려져 있기 때문에, 배열에는 같은 타입의 요소를 연속적으로 위치시킴으로써 희소 배열을 사용하지 않는 것이 좋다.
이웅모 님의〔 모던 자바스크립트 Deep Dive 〕책을 공부하며 정리했습니다.
'이것저것 스터디📚 > JavaScript - Deep Dive' 카테고리의 다른 글
DeepDive - 32장.String (0) | 2023.08.15 |
---|---|
DeepDive - 28장.Number (0) | 2023.08.15 |
DeepDive - 26장.ES6 함수의 추가 기능 (0) | 2023.08.07 |
DeepDive - 25장.클래스 (0) | 2023.08.01 |
DeepDive - 24장.클로저 (0) | 2023.07.25 |