데이터 타입의 필요성
1. 데이터 타입에 의한 메모리 공간의 확보와 참조
값은 메모리에 저장하고 참조할 수 있어야 한다. 메모리에 값을 저장하려면 먼저 확보해야 할 메모리 공간의 크기(메모리 셀의 개수(byte 수))를 알고 결정해야 한다. js엔진은 데이터 타입(값의 종류)에 따라 정해진 크기의 메모리 공간을 확보한다
확보되는 메모리 공간의 크기는 js 엔진 제조사에 의해 다를 수 있다. ECMAScript에는 숫자 타입은 배정밀도 64bit(8byte) 부동소수점 형식을 사용하다고 명시되어 있다.
var score = 100;
위 예제에서 js 엔진은 리터럴 100을 숫자 타입의 값으로 해석하고 이를 저장하기 위해 8byte의 메모리 공간을 확보한 뒤 2진수로 저장한다.
💡 심벌 테이블
컴파일러 또는 인터프리터는 심벌 테이블이라고 부르는 자료 구조를 통해 식별자를 키로 바인딩된 값의 메모리 주소, 데이터 타입, 스코프 등을 관리한다.
2. 데이터 타입에 의한 값의 해석
모든 값은 데이터 타입을 가지며, 메모리에 2진수, 즉 bit의 나열로 저장된다. 메모리에 저장된 값은 데이터 타입에 따라 다르게 해석될 수 있다.
ex) 0100 0001 - 숫자로 해석하면 65, 문자로 해석하면 ‘A’
데이터 타입이 필요한 이유 정리
- 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해
- 값을 참조할 때 한번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해
- 메모리에서 읽어 들인 2진수를 어떻게 해석할지 결정하기 위해
동적 타이핑
javascript의 모든 값은 데이터 타입을 갖는다. 그렇다면 변수는 데이터 타입을 가질까?
javascript는 동적 타입 언어로 변수를 선언할 때 타입 선언을 하지 않는다. 어떠한 데이터 타입의 값이라도 자유롭게 할당 가능하다.
값을 할당하는 시점에 변수의 타입이 동적으로 결정(타입 추론)되고, 변수의 타입은 재할당에 의해 언제든지 자유롭게 변경할 수 있다.
변수는 값에 대한 별명이다. 따라서 타입을 갖지 않으며, 현재 변수에 할당되어 있는 값에 의해 변수의 타입이 동적으로 결정된다.
typeof 연산자로 변수에 할당된 값의 데이터 타입을 확인할 수 있으며, 이는 문자열로 반환한다.
💡 C, Java 같은 언어는 정적 타입 언어로, 변수를 선언할 때 변수에 할당할 수 있는 값의 종류, 즉 데이터 타입을 사전에 선언해야 한다(int, float 등). 그리고 컴파일 시점에 타입 체크를 한다.
동적 타입 언어의 단점으로는 복잡한 프로그램에서는 변화하는 변수 값 추적하기 어려울 수도 있다. 변수는 값을 확인하기 전에는 타입을 확신할 수 없으며, 개발자 의도와 달리 js 엔진에 의해 암묵적으로 타입이 자동으로 변환된다. 즉, 유연성은 높지만 신뢰성은 떨어진다.
따라서, 변수 사용시 아래와 같은 주의사항을 참고해 오류를 예방하도록 노력해야한다.
- 변수는 꼭 필요한 경우에 한해 제한적으로 사용하자.
- 변수의 유효 범위(스코프)는 최대한 좁게 만들어 변수의 부작용 억제해야 한다.
- 전역 변수는 최대한 사용하지 않도록 한다.
- 변수보다는 상수를 사용해 값의 변경을 억제한다.
- 변수 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍한다.
참고
모던 자바스크립트 deep dive 책
'JavaScript' 카테고리의 다른 글
JavaScript | 원시 타입에 대한 모든 것 (0) | 2024.08.02 |
---|---|
JavaScript | 변수는 왜 필요한가?, 어떻게 선언되고 할당되는지도 알아보자 (feat. 메모리) (0) | 2024.07.31 |
스코프 체인 - 함수에서 어떤 값에 접근이 가능/불가능한가 따져보기 (0) | 2023.02.03 |
호출 스택 분석하는 법 (1) | 2023.02.02 |
함수 호출한 것을 보면, 그 자리에 return한 값을 대체해보자. (0) | 2023.01.31 |