알다시피 파이썬이나 자바스크립트는 동적할당을 따로 하지않는다.
그래서 배열을 바로 사용하기만 하고 따로 생각해보지는 않았다.
그래서 정리하고자 한다.
궁금증 1
자바스크립트 동적할당을 어떻게 할까?
정적 메모리할당
스택은 JavaScript가 정적
데이터를 저장하는 데 사용하는 데이터 구조입니다 . 정적 데이터는 엔진이 컴파일 타임에 크기를 아는 데이터입니다.
엔진은 크기가 변경되지 않는다는 것을 알고 있으므로 각 값에 대해 고정된 양의 메모리를 할당합니다 .
실행 직전에 메모리를 할당하는 과정을 정적 메모리 할당 이라고 합니다 .
엔진은 이러한 값에 대해 고정된 양의 메모리를 할당하기 때문에 기본 값의 크기에 제한이 있습니다 .
동적 메모리할당
힙은 JavaScript가 객체 와 함수를 저장하는 데이터 저장을 위한 다른 공간입니다 .
스택과 달리 엔진은 이러한 객체에 대해 고정된 양의 메모리를 할당하지 않습니다 .
대신 필요에 따라 더 많은 공간이 할당됩니다.
이러한 방식으로 메모리를 할당하는 것을 동적 메모리 할당 이라고도 합니다 .
우선 위와 같은 개념이다.
동적 메모리 할당으로 그때 그때 필요한 메모리를 사용한다고 생각하면,
필요한 메모리의 양을 어떻게 계산하는걸까...?
궁금증 2
자료구조 측면에서(추상 자료형의 기능) 배열과 연결리스트(해쉬 테이블)로 나눌 수 있고
메모리 측면으로 본다면 둘 다 떨어진 메모리를 연결한 것으로 볼 수 있습니다.(배열 원소의 타입이 같은 타입인 경우는 자바스크립트 엔진이 자동으로 연속된 메모리에 할당)
typed array를 이용하면 연속적인 공간을 사용하는 배열도 생성할 수 있습니다.
라고한다.
왜 해쉬 테이블(연결 리스트)을 이용할까....?
이유
위처럼 10개를 빌려놓고 10개를 고정적으로 빌린다고 생각해보자
일정한 간격으로 재계약을 계속하게 되서 10000까지 반복하면
999 * (10 + 9990)/2
항개수 * (첫항 + 끝항) /2
즉, O(n^2)의 시간 소모
위와 같은 시간이 소모된다.
반면 일정 비율로 반복하게 된다면 아래와 같은 공식이 나온다.
즉, O(n)의 시간 소모
그럼 당연히 일정비율로 늘리는 것이 효율적이게 될 것이다.
이를 부르는 말이 따로 있는데,
일정비율로 늘리는데 2배 만큼 늘린다고 해서 Array Doubling 이라는 용어를 쓴다.
이렇게 배열의 메모리를 일정비율로 동적할당을 하는 것에서 해쉬 테이블을 사용하는 이유이다.
참고
https://devkly.com/nodejs/javascript-array/
https://stackoverflow.com/questions/30877490/memory-allocation-of-a-javascript-array
https://poiemaweb.com/js-array-is-not-arrray
https://www.dashlane.com/blog/how-is-data-stored-in-v8-js-engine-memory
https://felixgerschau.com/javascript-memory-management/
자바스크립트 해시테이블
https://evan-moon.github.io/2019/06/25/hashtable-with-js/
코딩빌런 영상
'JaveScript > JaveScript' 카테고리의 다른 글
모던자바스크립트 29, 30장 스터디 (0) | 2023.11.30 |
---|---|
V8에서 자바스크립트 변수는 어떻게 관리될까? (4) | 2023.11.29 |
모던자바스크립트 27, 28장 스터디 (1) | 2023.11.27 |
모던자바스크립트 26장 스터디 (1) | 2023.11.26 |
모던자바스크립트 25장 스터디 (0) | 2023.11.25 |