study: javascript | 숨참고 deep dive (27) 배열

Lumpen·2023년 4월 4일
0

Study

목록 보기
28/92

배열은 여러 값을 순차적으로 나열한 자료구조다
사용 빈도가 매우 높은 가장 기본적인 자료구조

배열이 가지고 있는 값은 요소(element) 라고 부른다
배열의 요소는 자신의 위치를 나타내는 0 이상의 정수인 index 를 갖는다
요소의 순서가 보장되는 것, 배열은 length 를 갖는다

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

자료구조에서 말하는 배열은 동일 크기의 메모리 공간이 빈틈없이 연속적으로 나열된 자료구조를 말한다
배열의 요소는 하나의 데이터 타입으로 통일, 서로 연속적으로 인접해 있다
이러한 배열을 밀집 배열이라고 한다

일반적인 배열은 이러한 밀집 배열을 말한다
빈틈 없이 연속적으로 이여져 있으므로 인덱스를 통해 단 한번의 연산으로
임의의 요소에 접근할 수 있다 (임의 접근, 시간 복잡도 O(1))
매우 효율적이고 고속으로 동작한다

하지만 정렬되지 않은 배열에서 특정 요소를 검색하는 경우
선형 검색으로 시간 복잡도 O(n) 을 갖는다

배열에 요소를 삽입하거나 삭제하는 경우 배열의 요소를 연속적으로 유지하기 위해
나머지 요소들을 전부 하나씩 이동시켜야 하는 단점도 있다

자바스크립트의 배열은 일반적인 의미의 배열과 다르다
배열 요소의 메모리 공간은 각각 다를 수 있고 연속적으로 이어져있지 않을 수도 있다
연속적이지 않은 배열을 희소 배열이라고 한다

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

자바수크립트 배열은 인덱스를 나타내는 문자열을 프로퍼티 키로 가지고 length 프로퍼티를 갖는 특수한 객체다
배열의 요소는 프로퍼티 값이다
자바스크립트의 객체는 어떤 타입의 값이라도 가질 수 있기 때문에
배열 또한 모든 타입의 값을 배열의 요소로 추가할 수 있다

일반적인 배열과의 차이

  • 일반적인 배열은 인덱스로 요소에 대한 접근이 빠르다 하지만 특정 요소를 검색, 삽입, 삭제하는 경우 효율적이지 않다
  • 자바스크립트 배열은 해시 테이블로 구현된 객체이므로 인덱스로 요소에 접근하는 경우 일반적인 배열보다 성능적인 면에서 느릴 수 밖에 없다
    하지만 특정 요소를 검색하거나 삽입, 삭제하는 경우에는 더 빠르다

대부분의 모던 자바스크립트 엔진은 인덱스로 요소에 접근하는 시간을 줄이기 위해
배열을 일반 객체와 구별하여 좀 더 배열처럼 최적화 했다
배열이 일반 객체보다 약 2배 정도 빠르다

length 프로퍼티와 희소 배열

length 프로퍼티는 요소의 개수 (배열의 길이) 를 나타내는 0 이상의 정수를 값으로 갖는다
빈 배열의 경우 0, 아닐 경우 가장 큰 인덱스에 1을 더한 것과 같다
length 프로퍼티 값은 자동 갱신

length 프로퍼티 값은임의 숫자 값을 명시적으로 할당할 수도 있다
현재 length 프로퍼티 값 보다 작은 값을 할당하면 배열의 길이가 줄어든다
현재 배열보다 큰 값을 할당할 경우 length 프로퍼티 값은 변하지만 실제 배열의 길이가 늘어나지는 않는다

그냥 이런 방법은 사용 안하면 될듯

늘어난 만큼의 empty 가 생성된다
empty 는 메모리 공간을 확보하지도 않고 빈 요소를 생성하지도 않는다
index 로 검색해봐도 값이 존재하지 않는다

이렇게 일부가 비어있을 수 있는 배열을 희소 배열이라고 한다
자바스크립트는 희소 배열을 허용한다
중간이나 앞부분이 비어있을 수 있다

희소 배열은 length 와 배열 요소의 개수가 일치하지 않는다
희소 배열의 length 는 실제 배열 요소의 개수보다 언제나 크다
배열 생성 시 희소 배열을 생성하지 않도록 주의해야 한다
배열에는 같은 타입의 요소를 연속적으로 위치시키는 것이 최선이다

배열 메서드

자바스크립트는 배열을 다룰 때 유용한 다양한 빌트인 메서드를 제공한다
Array 생성자 함수는 정적 메서드를 제공하고 배열 객체의 프로토타입인
Array.prototype 은 프로토타입 메서드를 제공한다

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

profile
떠돌이 생활을 하는. 실업자는 아니지만, 부랑 생활을 하는

0개의 댓글