[JS] JavaScript에서의 배열과 객체

자료구조에서의 배열

  • 동일한 크기의 메모리공간이 빈틈없이 연속적으로 나열된 자료구조(밀집배열dense array)
  • 연속적으로 인접 -> 인덱스 통해 단 하나의 연산으로 임의의 요소에 접근. O(1)
  • 정렬되지 않았거나 특정 요소 접근, 삽입, 삭제는 O(n)

JS에서의 배열

  • 배열의 요소 위한 각각의 메모리공간의 크기는 달라도 되고, 연속적으로 이어져 있지 않을수도 있다 (희소배열 sparse array)
  • JS에서의 배열은 일반적 의미의 배열이 아닌 일반적 배열의 동작을 흉내낸 특수한 객체


  • 위와 같이 인덱스 나타내는 문자열을 프로퍼티로 가지고, 배열의 요소는 value이고 length 프로퍼티 가짐
  • 객체이므로 일반적인 배열보다는 인덱스로 요소에 접근시 느리다. 하지만 특정 요소 검색, 삽입, 삭제는 더 빠르므로 이것 주로 선택
  • 대부분의 모던 JS엔진은 배열을 일반 객체에 비해 좀 더 배열처럼 작동하도록 최적화

JS에서의 객체

  • JS의 객체는 키를 인덱스로 사용하는 해시테이블이라고 생각할 수 있다.
  • 클래스 기반 객체 지향 프로그래밍 언어(JAVA,C++ 등)에서는 클래스를 기반으로 객체(인스턴스) 생성

    • 즉 객체 생성 전에 이미 프로퍼티와 메서드 정해져있다. 생성된 이후에는 프로퍼티 삭제 및 추가 불가
  • JS는 클래스 없이 객체 생성 & 객체 생성된 이후에도 동적으로 프로퍼티와 메서드 추가 가능, 크기 정의 필요 없음, 요소의 데이터타입 제한 없음

    • But 클래스기반 객체 지향 프로그래밍 언어보다는 객체 생성과 프로퍼티 접근 비효율 -> JS엔진은 프로퍼티 접근 위해 최적화

pass-by-reference

  • pass-by-value

    • 원시타입은 immutable. 값으로 전달(복사되어 전달)
    • 런타임(변수 할당 시점)에 메모리의 스택 영역에 고정된 메모리 영역을 점유하고 저장
  • pass-by-reference

    • 객체는 프로퍼티 변경 추가 삭제 가능 -> 변경가능(mutable) => 동적으로 변화가능하므로 메모리 공간 확보 에측 불가 -> 런타임에 메모리공간 확보하고 메모리의 힙 영역에 저장
    • 객체는 참조 방식으로 전달. 절대 복사X. 예를 들어 var foo = {val:10} 이라면 변수 foo는 객체 자체를 저장이 아닌 생성된 객체의 참조값(address)를 저장



출처

  • 이웅모, 모던 자바스크립트 Deep Dive(위키북스, 2020)
  • PoiemaWeb

Written by
Sunmin
어제보다 나은 오늘을 만들기 위해 배우고, 기록하고, 회고합니다. Maker. Reader. Realistic optimist.