You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
각 데이터 타입은 할당되는 메모리 용량이 다른데, 자바스크립트 엔진은 컴파일 시가 아니라 런타임 시 타입을 추론한다고 알고 있어요! 이 메모리 용량도 런타임 시에 타입에 맞게 할당되는 걸까요?
답변
먼저 자바스크립트 변수가 자바스크립트 엔진의 어디에 저장되는지부터 설명드려야 할 것 같아요.
스택
힙 메모리
이렇게 두 군데에 저장이 됩니다.
말씀해주신 대로, 자바스크립트는 컴파일 시에는 타입이 정해져있지 않기 때문에 사용할 메모리 용량을 알 수 없어요. 다만, 자바스크립트는 딱 두가지 타입 (원시값- 객체값) 으로 나누어져있습니다. 사실상 원시값은 불변하기 때문에, 원시값의 최대 메모리 크기는 자바스크립트 엔진이 쉽게 예측할 수 있어요. 따라서 원시값의 경우 메모리 용량이 변할 일이 없기 때문에, 원시값은 컴파일 타임에 스택에 저장됩니다.
그러면 객체값은 어떨까요? 객체값은 배열의 길이가 늘어날 수도 있고, 객체의 프로퍼티가 추가될 수도 있기 때문에, 힙 메모리에 저장된다고 합니다. 컴파일타임에 코드 내에서 해당 객체의 크기가 늘어날지 아닐지 예측 할 수도 없거니와, 메모리 용량의 효율을 위해서라고 해요.
만약, 배열을 원시값처럼 정해진 메모리에 저장했는데, 배열의 크기가 늘어난다면...? 해당 메모리 앞 뒤에 있는 메모리를 모두 옮겨야하는 불상사가 일어나니까요~!
그런데 그렇다고 객체값이 힙에만 저장되는건 아닙니다. 위와같이 객체값도 스택에 저장된 채로, 그 객체는 힙에 있는 해당 객체에 대한 참조주소 를 가진다고 합니다. 객체값의 레퍼런스 역시 컴파일 타임에 저장이 되구요.
결론
런타임시에 메모리 용량을 정하는게 아니라 컴파일시에 정한다.
왜나하면, 타입이 정해져있지 않아도 원시값과 객체값으로 나뉘기 때문이다!
원시값은 스택에 메모리가 할당되고 객체값은 스택에 힙을 가리키는 레퍼런스가 할당된다!
스택에 저장된 객체값의 레퍼런스는 힙을 가리키고, 힙에 있는 진짜 객체데이터는 런타임시에 변경될 수 있다.
reacted with thumbs up emoji reacted with thumbs down emoji reacted with laugh emoji reacted with hooray emoji reacted with confused emoji reacted with heart emoji reacted with rocket emoji reacted with eyes emoji
-
질문
각 데이터 타입은 할당되는 메모리 용량이 다른데, 자바스크립트 엔진은 컴파일 시가 아니라 런타임 시 타입을 추론한다고 알고 있어요! 이 메모리 용량도 런타임 시에 타입에 맞게 할당되는 걸까요?
답변
먼저 자바스크립트 변수가 자바스크립트 엔진의 어디에 저장되는지부터 설명드려야 할 것 같아요.
이렇게 두 군데에 저장이 됩니다.
말씀해주신 대로, 자바스크립트는 컴파일 시에는 타입이 정해져있지 않기 때문에 사용할 메모리 용량을 알 수 없어요. 다만, 자바스크립트는 딱 두가지 타입 (원시값- 객체값) 으로 나누어져있습니다. 사실상 원시값은 불변하기 때문에, 원시값의 최대 메모리 크기는 자바스크립트 엔진이 쉽게 예측할 수 있어요. 따라서 원시값의 경우 메모리 용량이 변할 일이 없기 때문에, 원시값은 컴파일 타임에 스택에 저장됩니다.
그러면 객체값은 어떨까요? 객체값은 배열의 길이가 늘어날 수도 있고, 객체의 프로퍼티가 추가될 수도 있기 때문에, 힙 메모리에 저장된다고 합니다. 컴파일타임에 코드 내에서 해당 객체의 크기가 늘어날지 아닐지 예측 할 수도 없거니와, 메모리 용량의 효율을 위해서라고 해요.
만약, 배열을 원시값처럼 정해진 메모리에 저장했는데, 배열의 크기가 늘어난다면...? 해당 메모리 앞 뒤에 있는 메모리를 모두 옮겨야하는 불상사가 일어나니까요~!
그런데 그렇다고 객체값이 힙에만 저장되는건 아닙니다. 위와같이 객체값도 스택에 저장된 채로, 그 객체는 힙에 있는 해당 객체에 대한 참조주소 를 가진다고 합니다. 객체값의 레퍼런스 역시 컴파일 타임에 저장이 되구요.
결론
좋은 질문 해줘서 고마워요 하리~!
참고자료
Beta Was this translation helpful? Give feedback.
All reactions