본문 바로가기

JavaScript

[Deep dive] 27장 배열(1)

27.1 배열이란?

 

배열(array)

 

- 여러 개의 값을 순차적으로 나열한 자료구조 

- 요소(element) : 배열이 가지고 있는 요소 

- 인덱스(index) : 배열의 요소가 가지는 배열에서 자신의 위치를 나타내는 0 이상의 정수 

- length 프로퍼티  : 배열의 길이

- 배열은 객체 타입 

- 배열의 생성자 함수는 Array이며, 배열의 프로토타입 객체는 Array.prototype

- 베열은 일반 객체와 달리 "값의 순서"와 "length 프로퍼티"를 가짐 

 

 

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

 

밀집 배열(dense array)

 

- 배열의 요소는 하나의 데이터 타입으로 통일되어 있으며 서로 연속적으로 인접해 있음

- 인덱스를 통해 단 한번의 연산으로 임의의 요소에 접근 가능

 

희소 배열(sparse array)

 

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

- 배열의 요소가 연속적으로 위치하지 않고 일부가 비어있는 배열

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

- 자바스크립트의 배열은 인덱스를 나타내는 문자열을 프로퍼티 키로 가지며, length 프로퍼티를 갖는 특수한 객체 

- 자바스크립트 배열의 요소는 프로퍼티 값

- 어떤 타입의 값이라도 배열의 요소가 될 수 있음

- 자바스크립트 배열은 해시 테이블로 구현된 객체 

 

27.3 length 프로퍼티와 희소 배열

 

- length 프로퍼티의 값은 배열에 요소를 추가하거나 삭제하면 자동 갱신

const arr = [1,2,3];
console.log(arr.length); //3

//요소 추가 
arr.push(4);
console.log(arr.length); //4

//요소 삭제 
arr.pop();
console.log(arr.length); //3

- 현재 length 프로퍼티 값보다 작은 숫자 값을 할당하면 배열의 길이가 줄어듬 

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

arr.length = 3;

//배열의 길이가 5에서 3으로 줄어듬
console.log(arr); //[ 1, 2, 3 ]

- 현재 length 프로퍼티 값보다 큰 숫자 값을 할당하면 length 프로퍼티 값은 변경되지만 실제로 배열의 길이가 늘어나지는 않음

const arr = [1];

arr.length = 3;

//length 프로퍼티 값은 변경되지만 실제로 배열의 길이가 늘어나지는 않음
console.log(arr.length); //3
console.log(arr); //[ 1, <2 empty items> ]

- 자바스크립트는 희소배열을 문법적으로 허용. 희소배열은 length와 배열의 요소 개수가 일치하지 않음

//희소 배열
const sparse = [,2, ,4];

//희소 배열의 length 프로퍼티 값은 요소의 개수와 일치하지 않음
console.log(sparse.length); //4
console.log(sparse); //[ <1 empty item>, 2, <1 empty item>, 4 ]

 

27.4 배열 생성

 

27.4.1 배열 리터럴 

- 배열 리터럴은 0개 이상의 요소를 쉼표로 구분하여 대괄호([ ])로 묶음

- 배열 리터럴에 요소를 하나도 추가하지 않으면 빈 배열 생성

- 배열 리터럴에 요소를 생략하면 희소 배열 생성

const arr = [1,2,3];
console.log(arr.length); //3

const arr2 = [];
console.log(arr2.length); //0

const arr3 = [1, , 3];
console.log(arr3.length); //3
console.log(arr3); //[ 1, <1 empty item>, 3 ]
console.log(arr3[1]); //undefined

 

27.4.2 Array 생성자 함수 

 

- Array 생성자 함수를 통해 배열 생성 가능

- 전달된 인수가 1개이고 숫자인 경우 length 프로퍼티 값이 인수인 배열 생성

const arr = new Array(10);

//희소 배열
console.log(arr); //[ <10 empty items> ]
console.log(arr.length); //10

- 전달된 인수가 2개 이상이거나 숫자가 아닌 경우 인수를 요소로 갖는 배열 생성

new Array(1,2,3); // [1,2,3]
new Array({}); //[{}]

- Array 생성자 함수는 일반함수로서 호출해도 배열을 생성하는 생성자 함수로 동작

Array(1,2,3); //[1,2,3]

 

27.4.3 Array.of

- 전달된 인수를 요소로 갖는 배열 생성 

- Array 생성자 함수와 다르게 전달된 인수가 1개 이고 숫자이더라도 인수를 요소로 갖는 배열 생성

Array.of(1); //[1]
Array.of(1,2,3); //[1,2,3]
Array.of('string'); //['string']

 

27.4.4 Array.from

- 유사 배열 객체(array-like object) 또는 이터러블 객체 (iterable object)를 인수로 전달받아 배열로 변환하여 반환

//유사 배열 객체로 변환하여 배열을 생성
Array.from({length:2,0:'a',1:'b'}); //{'a','b'}

//이터러블을 변환하여 배열을 생성
Array.from('Hello'); //{'H','e','l','l','o'}

- 두 번째 인수로 전달한 콜백 함수를 통해 값을 만들면서 요소를 채울 수 있음

//Array.from은 두 번째 인스로 전달한 콜백 함수의 반환값으로 구성된 배열을 반환
Array.from({length:3},(_,i)=>i); //[0,1,2]

 

27.5 배열 요소의 참조 

 

- 인덱스는 값을 참조할 수 있다는 의미에서 객체의 프로퍼티 키와 같은 역할

- 존재하지 않은 요소에 접근하면 undefined 반환

const arr = [1,2];

//인덱스가 0인 요소 참조 
console.log(arr[0]); //1
//인덱스가 1인 요소 참조 
console.log(arr[1]); //2
//인덱스가 2인 요소 참조 (존재 x)
console.log(arr[2]); //undefined

 

27.6 배열 요소의 추가와 갱신

 

- 배열에도 요소를 동적으로 추가 가능

- 존재하지 않는 인덱스를 사용해 값을 할당하면 새로운 요소가 추가 

- length 프로퍼티는 자동 갱신됨

- 이미 존재하는 요소에 값을 재할당하면 요소값이 갱신

const arr = [0];

//배열 요소의 추가 
arr[1] = 1; 

console.log(arr); //[ 0, 1 ]
console.log(arr.length); //2

//요소값의 갱신
arr[1] = 10;
console.log(arr); //[ 0, 10 ]

 

27.7 배열 요소의 삭제 

 

- 배열의 특정 요소를 삭제하기 위해 delete 연산자 사용 가능 

- delete arr[1]은 arr에서 프로퍼티 키가 '1'인 프로퍼티를 삭제 

const arr = [1,2,3];

//배열 요소의 삭제 
delete arr[1];
console.log(arr); //[ 1, <1 empty item>, 3 ]

//length 프로퍼티에 영향을 주지 않음. 희소배열이 됨
console.log(arr.length); //3

'JavaScript' 카테고리의 다른 글

[Deep dive] 27장 배열(3)  (0) 2023.08.16
[Deep dive] 27장 배열(2)  (0) 2023.08.16
[Deep dive] 26장 ES6 함수의 추가 기능  (0) 2023.08.16
[Deep dive] 25장 클래스 (2)  (0) 2023.08.16
[Deep dive] 25장 클래스 (1)  (0) 2023.08.15