JavaScript

[js] 자바스크립트 DeepDive 27장 요약 (1)

Delants 2023. 5. 20. 20:11

* 본 내용은 자바스크립트 DeepDive 내용을 참고하여 정리한 것입니다.

 

27장. 배열(1) (P.492~528)

 

27.1) 배열이란? (p.492~494)

- 배열이란 여러 개의 값을 순차적으로 나열한 객체 타입의 자료구조

- 배열은 배열의 길이를 나타내는 length프로퍼티를 가진다. -> for문을 통해 접근 가능

-  Array 생성자 함수, Array.of, Array.from메소드로 생성할 수 있다.

- 요소: 배열이 가지고 있는 값. 자신의 위치를 나타내는 0이상의 정수인 인덱스를 가진다. (0부터 시작)

 

* 일반 객체와 배열의 구분.

-> 가장 명확한 차이는 값의 순서와 length 프로퍼티.

구분 객체 배열
구조 프로퍼티 키와 프로퍼티 값 인덱스와 요소
값의 참조 프로퍼티 키 인덱스
값의 순서 x o
lenght프로퍼티 x o

 

* 배열의 장점

- 순차적/역순으로 요소 접근 가능

- 특정 위치에서부터 순차적으로 접근 가능

- 일반적인 의미의 배열은 매우 효율적, 고속 동작함.

 

* 배열의 단점

- 선형 검색으로 인한 시간 복잡

- 배열에 요소를 삽입 혹은 삭제하는 경우 요소를 이동시켜야 함.

 

 

27.2) 자바스크립트 배열은 배열이 아니다. (p.494~497)

- 밀집 배열: 하나의 데이터 타입으로 통일되어 있으며, 서로 연속적으로 인접한 배열

- 희소 배열: 배열의 요소가 연속적으로 이어져 있지 않는 배열

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

 

 

27.3) length프로퍼티와 희소 배열 (p.497~500)

* length 프로퍼티 설명

- length프로퍼티는 배열의 길이를 나타내는 0이상의 정수를 값으로 가진다.

- 빈 배열: 0, 빈 배열이 아닐 경우, 가장 큰 인덱스에 1을 더한 값

- length프로퍼티의 값은 자동 갱신되며, 임의 숫자 값을 명시적으로 할당 가능.

- length프로퍼티 값보다 작은 숫자 값을 할당 시 배열의 길이가 줄어듦.

- length프로퍼티 값보다 큰 숫자 값을 할당 시 lenght프로퍼티 값은 변경되나, 배열의 길이가 늘어나지 않음.

 

* 희소 배열

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

- 자바스크립트에서는 문법적으로 허용함.

- 희소 배열은 length와 배열 요소의 개수가 일치하지 않음. 

- 희소 배열의 length는 희소 배열의 실제 요소 개수보다 언제나 큼.

 

 

27.4) 배열 생성 (p.500~503)

 27.4.1) 배열 리터럴 (p.500~501)

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

- 가장 일반적이면서도, 간편한 배열 생성 방식.

- 0개 이상의 요소를 쉼표로 구분하여 대괄호로 묶음.

- 프로퍼티 키가 없고, 값만 존재.

 

 

 27.4.2) Array 생성자 함수 (p.501~502)

const arr = new Array(100);
console.log(arr); // [ <100 empty items> ]
console.log(arr.length); // 100

- Array 생성자 함수는 전달된 인수의 개수에 따라 다르게 동작함.

- Array 생성자 함수에 전달할 인수는 0 또는 2^32-1이하인 양의 정수여야 함. 이러한 범위를 벗어나면 RangeError발생.

- 전달된 인수가 없는 경우 빈 배열을 생성

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

 

 

 27.4.3) Array.of (p.502)

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

- 인수가 1개이고 숫자더라도 인수를 요소로 갖는 배열을 생성.

 

 

27.4.4) Array.from (p.502~503)

const len = Array.from({ length: 2, 0: 'a', 1: 'b'});
const hello = Array.from('Hello');
console.log(len); // [ 'a', 'b' ]
console.log(hello); // [ 'H', 'e', 'l', 'l', 'o' ]

- 유사 배열 객체 또는 이터러블 객체를 인수로 전달받아 배열로 변환하여 반환함.

- 두 번째 인수로 전달한 콜백 함수를 통해 값을 만들면서 요소를 채우기 가능.

 

 

27.5) 배열 요소의 참조 (p.504~505)

- 배열의 요소를 참조 시에는 대괄호 ([]) 표기법 사용

- 희소 배열의 존재하지 않는 요소를 참조하거나, 존재하지 않는 요소에 접근 시 undefined가 반환

 

 

27.6) 배열의 요소의 추가와 갱신 (p.505~506)

- 배열에도 요소를 동적으로 추가할 수 있음

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

- length프로퍼티 값은 자동으로 갱신됨

- 현재 배열의 length프로퍼티 값보다 큰 인덱스로 새로운 요소를 추가 시 희소 배열이 됨 (단. 명시적으로 값을 할당하지 않은 요소는 생성되지 않음)

- 이미 요소가 존재하는 요소에 값을 재할당할 시 요소값이 갱신됨.

- 인덱스는 반드시 0 이상의 정수를 사용해야 함. 정수 이외의 값을 사용하면 프로퍼티가 생성됨. 

 

 

27.7) 배열 요소의 삭제 (p.506~507)

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

- 삭제 시 배열은 희소 배열이 되며, length프로퍼티 값은 변하지 않음

- 희소 배열을 만들지 않으면서 배열의 특정 요소를 완전히 삭제하려면 Array.prototype.splice메소드를 사용함.

 

 

27.8) 배열 메서드 (p.507~528)

- 배열 메서드는 결과물을 반환하는 패턴이 두 가지이다.

- 원본 배열을 직접 변경하는 메서드, 원본 배열을 직접 변경하지 않고 새로운 배열을 생성하여 반환하는 메서드가 있다.

- 원본 배열: 배열 메서드를 호출한 배열, 즉 배열 메서드의 구현체 내부에서 this가 가리키는 객체

- 가급적 원본 배열을 직접 변경하지 않는 메서드 사용이 권장됨.

 

 27.8.1) Array.isArray (p.508)

-  Array생성자 함수의 정적 메서드.

- 전달된 인수가 배열이면 true, 배열이 아니면 false를 반환

 

 

27.8.2) Array.prototype.indexOf (p.508~509)

-  indexof메소드는 원본 배열에서 인수로 전달된 요소를 검색하여 인덱스를 반환

- 배열에 특정 요소가 존재하는지 확인할 때 유용

- ES7에서는, indexOf메서드 대신, Array.prototype.includes메서드를 사용하면 가독성이 더 좋음.

 

* 반환법

- 원본 배열에 인수로 전달한 요소와 중복되는 요소가 여러 개 있을 시, 첫 번째로 검색된 요소의 인덱스 반환

- 원본 배열에 인수로 전달한 요소가 존재하지 않으면 -1을 반환

 

 

27.8.3) Array.prototype.push (p.510)

- 인수로 전달받은 모든 값을 원본 배열의 마지막 요소로 추가하고 변경된 length 프로퍼티 값을 반환.

- 원본 배열을 직접 변경하는 부수 효과 존재. -> ES6 스프레드 문법 사용 권장

- 성능 면에서 좋지 않음.

 

 

27.8.4) Array.prototype.pop (p.510~513)

- 원본 배열에서 마지막 요소를 제거하고 제거한 요소를 반환

- 원본 배열이 빈 배열이면 undefined를 반환

- 원본 배열을 직접 변경함

 

* 스택의 구현

- 스택: 데이터를 마지막에 밀어 넣고, 마지막에 밀어 넣은 데이터를 먼저 꺼내는 후입 선출 방식의 자료 구조.

- pop메서드와 push메서드를 사용하면 구현 가능

- 스택에 밀어 넣는 것을 푸시(push), 스택에서 데이터를 꺼내는 것을 팝(pop)이라고 함.

 

 

27.8.5) Array.prototype.unshift (p.513~514)

- 인수로 전달받은 모든 값을 원본 배열의 선두에 요소로 추가하고 변경된 length프로퍼티 값을 반환

- 원본 배열을 직접 변경하는 부수 효과 존재. -> ES6 스프레드 문법 사용 권장

 

 

27.8.6) Array.prototype.shift (p.514~516)

- 원본 배열에서 첫 번째 요소를 제거하고 제거한 요소를 반환함.

- 원본 배열이 빈 배열이면 undefined를 반환.

- 원본 배열을 직접 변경함.

 

* 큐의 구현

- 큐: 데이터를 마지막에 밀어 넣고, 처음 데이터를 먼저 꺼내는 선입 선출방식의 자료구조.

- 는 언제나 데이터를 밀어 넣은 순서대로 취득한다.

 

 

27.8.7) Array.prototype.concat (p.516~518)

- 인수로 전달된 값들을 원본 배열의 마지막 요소로 추가한 새로운 배열을 반환

- 인수로 전달한 값이 배열인 경우, 배열을 해체 후 새로운 배열의 요소로 추가.

- 단, 원본 배열은 변경되지 않음.

- push와 unshift메서드는 concat메서드로 대체할 수 있음. 단 일부 차이점 존재.

- ES6의 스프레드 문법으로 대체 가능 -> 스프레드 문법을 일관적으로 사용하는 것을 권장

 

* push/unshift메서드와 concat메서드의 차이

  push/unshift메서드 concat메서드
원본배열 변경방식 직접 변경 원본배열변경안함, 새로운 배열 반환
원본배열 저장방식 변수에 저장 반환값을 변수에 할당
인수로 전달받은 값이 배열인 경우 원본 배열의 마지막/첫 요소로 추가 배열 해체 후 새로운 배열의 마지막 요소에 추가함

 

 

27.8.8) Array.prototype.splice (p.518~521)

- 원본 배열의 중간에 요소를 추가하거나 중간에 있는 요소를 제거하고자 할 경우 사용

- 원본 배열을 직접 변경함

 

* splice메서드에 속하는 매개변수

1) start: 원본 배열의 요소를 제거하기 시작할 인덱스

2) delectCount: start부터 제거할 요소의 개수

3) items: 제거한 위치에 삽입할 요소들의 목록

 

- 위 3개의 인수를 모두 전달하면 시작 인덱스부터 제거할 요소의 개수만큼 원본 배열에서 요소를 제거

- 두 번째 인수, 제거할 요소의 개수를 0으로 지정하면 아무런 요소도 제거하지 않고 새로운 요소들을 삽입함

- 두 번재 인수를 생략하면, 첫 번째 인수로 전달된 시작 인덱스부터 모든 요소를 제거.

- 세 번째 인수를 지정하지 않으면 원본 배열에서 지정된 요소를 제거하기만 함.

 

 

27.8.9) Array.prototype.slice (p.522~525)

- 인수로 전달된 범위의 요소들을 복사하여 배열로 반환.

- 원본 배열은 변경되지 않음.

 

* slice메서드에 속하는 매개변수

1) start: 복사를 시작할 인덱스. 

2) end: 복사를 종료할 인덱스 (생략 가능, 생략 시 기본 값은 length프로퍼티 값)

 

- 위 매개변수 중 첫 번째 인수(start)가 음수라면 배열의 끝에서부터 요소를 복사하여 배열로 반환

- 매개변수를 모두 생략하면 원본 배열의 복사본을 생성하여 반환함.

 

 

27.8.10) Array.prototype.join (p.525)

- 원본 배열의 모든 요소를 문자열로 반환한 후, 인수로 전달받은 문자열, 즉 구분자로 연결한 문자열을 반환함.

- 구분자는 생략 가능하며, 기본 구분자는 콤마(,)임.

 

 

27.8.11) Array.prototype.reverse (p.525)

- 원본 배열의 순서를 반대로 뒤집음.

- 원본 배열이 변경됨

- 반환값은 변경된 배열임.

 

 

27.8.12) Array.prototype.fill (p.526~527)

- 인수로 전달받은 값을 배열의 처음부터 끝까지 요소로 채움.

- 원본 배열이 변경됨.

- fill메서드를 사용해 모든 요소를 채울 경우, 모든 요소를 하나의 값만으로 채울 수밖에 없다는 단점 존재

 

 

27.8.13) Array.prototype.includes (p.527~528)

- ES7도입.

- 배열 내에 특정 요소가 포함되어 있는지 확인하여 true or false로 반환

- 첫 번째 인수로 검색할 대상을 지정

- 두 번째 인수로 검색을 시작할 인덱스 전달 (생략시 기본값은 0, 음수 입력 시 length프로퍼티 값과 인덱스를 합산함.)

 

 

27.8.14) Array.prototype.flat (p.528)

- ES10(2019)도입

- 인수로 전달한 깊이만큼 재귀적으로 배열을 평탄화

- 중첩 배열을 평탄화할 깊이를 인수로 전달. 

- 인수 생략 시 기본값은 1

- 인수로 Infinity지정 시 중첩 배열 모두를 평탄화 함.

 

 

끝.

 

다음 내용: 자바스크립트 DeepDive 27장 [배열(2)] 요약 (p.529~551)