자바스크립트의 모든 값은 데이터 타입을 갖는다는 것만 알고 있었는데, 정확하게 그 이유를 모르고 있었다. 데이터 타입의 필요성에 대해 찾아본 결과 '모던 자바스크립트 Deep Dive' 책에서 그 이유를 알 수 있었다.
데이터 타입이 필요한 이유를 먼저 정리하자면 다음과 같다.
- 메모리에 값을 저장할 때 확보해야 할 메모리 공간의 크기를 결정하기 위해서이다.
- 메모리에서 값을 참조할 때 한 번에 읽어야 할 메모리 공간의 크기를 결정하기 위해서이다.
- 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해서이다.
먼저 1번 이유에 대해 먼저 알아보자.
메모리에 값을 저장하려면 우선 확보해야 할 메모리 공간의 크기를 결정해야 한다. 그 이유는 어느 정도 크기의(몇 바이트의) 메모리 공간을 사용해야 메모리 낭비 없이 값을 저장할 수 있는지 알아야 하기 때문이다. 자바스크립트 엔진은 값의 데이터 타입에 따라 정해진 크기의 메모리 공간을 확보한다. 즉, 변수에 할당하는 값의 데이터 타입에 따라 확보해야 할 메모리 공간의 크기가 결정된다.
let score = 100;
결국 자바스크립트 엔진은 메모리 낭비 없이 값을 저장하기 위해 변수에 할당하는 값의 데이터 타입에 따라 메모리 공간을 확보하고, 확보된 메모리 공간에 값을 2진수 형태로 저장한다.
다음으로 2번 이유에 대해 알아보자.
메모리에서 값을 참조하는 경우, 식별자를 통해 값이 저장되어 있는 메모리 공간의 주소를 찾아갈 수 있다. 정확하게는 참조하려는 값이 저장되어 있는 메모리 공간의 선두 메모리 셀의 주소를 찾아간다.
값을 훼손 없이 읽어 들이려면 값이 어느 정도 크기의 메모리 공간을 차지하고 있는지 알아야 한다. 따라서 값을 정확하게 읽어 들이기 위해서 메모리에서 한 번에 읽어 들일 메모리 공간의 크기를 알아야 한다.
심벌 테이블이라는 자료 구조를 통해 식별자를 키로 바인딩된 값의 메모리 주소, 데이터 타입 등을 관리한다. 심벌 테이블과 식별자를 통해 값이 저장된 메모리 공간의 선두 메모리 셀의 주소와 값의 데이터 타입을 알게 되면 훼손 없이 값을 정확하게 읽어 들일 수 있다.
결국 메모리에서 값을 참조할 때 한 번에 읽어야 할 메모리 공간의 크기를 결정하기 위해 데이터 타입이 필요하다. 데이터 타입이 없으면 값을 훼손 없이 읽어 들일 수 없다.
마지막으로 3번 이유에 대해 알아보자.
모든 값은 데이터 타입을 가지며, 메모리에 2진수로 저장된다. 메모리에 저장된 값은 데이터 타입에 따라 다르게 해석될 수 있다.
위 예제에서 score 변수에 할당된 값은 숫자 타입의 값이다. 따라서 score 변수를 참조하면 메모리 공간의 주소에서 읽어 들인 2진수를 숫자로 해석할 수 있다.
결국 메모리에 2진수의 형태로 저장된 값을 그 값의 데이터 타입에 따라 해석해야 하므로 데이터 타입이 필요하다. 데이터 타입이 없으면 값을 원래의 값으로 해석할 수 없다.
데이터 타입이 필요한 이유