[JS] 자바스크립트 데이터 타입

황준승·2021년 10월 30일
0
post-thumbnail

❗️ 자바스크립트 변수와 식별자

변수 : 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인이름을 뜻한다.
식별자 : 어떤 값을 구별해서 식별할 수 있는 고유한 이름을 말한다.

예제

const myNumber = 23;

위의 그림과 같이 변수(식별자)는 값이 아니라 메모리 주소를 기억하고 있습니다. 즉, 식별자가 기억하고 있는 메모리 주소를 통해 메모리 공간에 저장된 값에 접근할 수 있다는 의미이다.

❗️ 원시 타입(primitive type), 객체 타입(reference type)

원시타입(primitive type)객체 타입(reference type)
숫자, 문자열, 불리언, undefined, null, symbol객체, 함수, 배열 등
원시 값을 변수에 할당하면 메모리 공간에는 실제 값이 저장됨객체를 변수에 할당하면 메모리 공간에 참조 값이 저장됨
값에 의한 전달(pass by value)참조에 의한 전달(pass by reference)

javascript 메모리에서의 원시 타입과 객체 타입

  • 원시 타입의 경우 javascript의 콜 스택에 바로 저장된다.
  • 객체 타입의 경우 콜 스택의 포인터 변수(참조 값만) 저장한 후 실제적인 내용은 메모리 힙에 저장된다. 그리고 만약 실행 될 경우 참조 값을 가져와 함수 안에 있는 내용을 콜 스택에 끌어다 온다.

❗️ javascript는 인터프리터 언어

인터프리터 언어는 프로그래머가 작성한 코드를 기계어로 변환하는 과정없이 한 줄 한 줄 해석하여 바로 명령어를 실행하는 언어를 말합니다. 그렇기 때문에 빌드 시간이 따로 존재하지 않고 런타임 상황에서는 한 줄씩 실시간으로 읽어서 실행하기 때문에 컴파일 언어에 비해 속도가 느립니다.

❗️ javascript는 동적 타입 언어

앞서 말한 javascript는 인터프리터 언어이기 때문에 빌드를 따로 하지 않고 코드를 한 줄 한 줄 해석하기에 하나의 변수에 대해서도 동적으로 타입을 변환시킬 수 있다.

V8엔진의 javascript 성능 최적화

정적 타입의 언어
프로퍼티의 메모리 오프셋을 컴파일 시 결정할 수 있다. 정적언어인 자바의 경우 모든 객체 속성이 컴파일 전에 고정된 객체 레이아웃(Class)에 의해 결정되고 컴파일 시 메모리 오프셋이 결정된다. 그 후 런타임시에는 객체에 대한 프로퍼티가 동적으로 추가되거나 제거 될 수 없다. - 클래스를 통해 인스턴스 생성 및 수정 불가

이에 반해 javascript는 동적 타입 언어, 타입이 동적으로 변한다. 이 말 즉슨, 이 변수나 객체가 메모리를 얼마나 차지할 지 가늠을 할 수 가 없다.

js는 런타임 시에 속성 타입이 결정되므로, 기존의 정적 타입과 같은 오프셋 메모리를 결정지을 수 없다. 그렇기 때문에 대부분의 js 인터프리터는 딕셔너리와 유사한 구조를 통해 객체 속성값의 위치를 메모리에 저장한다.

이러한 딕셔너리 구조를 통해 모든 객체의 속성에 대한 메모리 주소를 관리하는 것은 가능하지만 매우 느리고 비효율적이다. 그래서 이러한 동적 탐색을 회피하기 위한 다른 방식을 사용하는 데 그것이 바로 히든 클래스 이다.

v8엔진의 히든 클래스(Hidden Class)

히든 클래스의 특징

  • 객체는 반드시 하나의 히든 클래스를 참조한다.
  • 히든 클래스는 각 프로퍼티에 대해 메모리 오프셋을 가지고 있다.
  • 동적으로 새로운 프로퍼티가 만들어질 때, 혹은 기존 프로퍼티가 삭제되거나 기존 프로퍼티의 데이터 타입이 바뀔 때는 신규 히든 클래스가 생성되며, 신규 히든 클래스는 기존 프로퍼티에 대한 정보를 유지하면서 추가적으로 새 프로퍼티의 오프셋을 가지게 된다.
  • 히든 클래스는 프로퍼티에 대해 변경이 발생했을 때 참조해야 하는 히든 클래스에 대한 정보를 갖는다.
  • 객체에 새로운 프로퍼티가 만들어지면, 현재 참조하고 있는 히든 클래스의 전환 정보를 확인한 후, 현재 프로퍼티에 대한 변경이 전환 정보의 조건과 일치하면, 객체의 참조 히든 클래스를 조건에 명시된 히든 클래스로 변경시킨다.

자세한 내용 및 예시 : https://engineering.linecorp.com/ko/blog/v8-hidden-class/

히든 클래스 두 줄 요약

  • 프로퍼티가 바뀔 때 마다 각각 그 프로퍼티의 오프셋을 업데이터하여 연쇄적인 클래스를 유지한다.
  • 전환 정보는 히든 클래스의 효율을 높여주는 정보이고, 이전 클래스에 기록된다.

이러한 v8엔진의 수고를 덜어주기 위해 우리가 코드 작성 시 가져야할 자세

https://joshua1988.github.io/web-development/web-perf/perf-tip-javascript-in-v8/


그 외 헷갈렸던 개념 재정의한 내용

Q. 문자열의 경우 원시 타입이지만 각 문자의 개수에 따라 정해지는 데이터 크기가 다르다. 동적으로 메모리를 할당하는 것이기 때문에 c언어처럼 배열 포인터를 두고 힙 자료구조에 메모리 정보를 저장하는 것은 아닌가??

A. 그렇지 않다. 문자열의 경우 원시 타입이기 때문에 콜 스택에 저장되고 v8 엔진이 컴파일 시 이를 해석(데이터 타입 및 크기를 계산)하여 메모리를 할당하는 것이다.


출처

profile
다른 사람들이 이해하기 쉽게 기록하고 공유하자!!

0개의 댓글