데이터 타입
데이터 타입이란 값의 종류를 말한다.
자바스크립트의 모든 값은 데이터 타입을 갖는다.
자바스크립트는 7개의 데이터 타입을 제공한다.
7개의 데이터 타입은 원시 타입과 객체 타입으로 분류된다.
원시 타입
변경 불가능한 값 (immutable value) - 한 번 생성되면 변경 불가
- 숫자 타입 (number) - 정수/실수 구분없이 실수 타입만 존재
- 문자열 타입 (string)
- 불리언 타입 (boolean)
- undefined 타입 (undefined) - 선언 단계에서 var 변수에 암묵적으로 할당되어 초기화시키는 값
- null 타입 (null) - 값이 없음을 개발자가 의도적으로 명시할 때 사용하는 값
- 심벌 타입 (symbol) - ES6에서 추가된 7번째 타입
객체 타입
변경 가능한 값 (mutable value) - 생성 이후에도 변경 가능
NaN이란?
산술 연산 불가(not-a-number)
예를 들어 1 * 'String' 을 연산하면 문자열은 산술연산이 불가능하므로 NaN 값이 나온다.
템플릿 리터럴
- 백틱(``)을 사용하여 표현
- 이스케이프 문자 없이도 줄바꿈 및 공백 그대로 적용
- ${ }로 표현식(변수) 삽입 가능 ('+' 연산자 필요 없음)
Symbol 타입
- 숫자, 문자열처럼 변경 불가능한 원시 타입
- 다른 값과 중복되지 않는 유일무이한 값
=> 주로 객체의 유일한 프로퍼티 키를 만들기 위해 사용
- Symbol 함수를 호출하여 생성
=> 이렇게 생성된 심벌값은 외부에 노출되지 않으며(private) 다른 값과 절대 중복되지 않는다.
// 심벌 값 생성
var key = Symbol('key');
console.log(typeof key); // symbol
// 객체 생성
var obj = {};
// 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용
obj[key] = 'value';
console.log(obj[key]); // value
객체 타입
자바스크립트는 객체 기반의 언어
=> 자바스크립트를 이루고 있는 거의 모든 것이 객체이다.
(원시 타입 외에는 모두 객체 타입)
데이터 타입의 필요성
데이터 타입이 필요한 이유는 다음과 같다.
1. 값을 저장할 때 확보해야 할 메모리의 공간이 다르기 때문이다.
타입에 맞는 공간을 할당해야 메모리 낭비 또는 값의 손실 없이 값을 저장할 수 있다.
2. 값을 읽어들일 때 필요한 메모리의 공간이 다르기 때문이다.
2. 값을 해석할 때의 결과가 달라지기 때문이다.
예를 들어 메모리에 저장된 값 0100 0001을
number로 해석하면 숫자 65이지만, string으로 해석하면 문자 'A'이다.
동적 타이핑
정적 타입 언어
- C, 자바, 코틀린 등
- 변수 선언 단계에서 타입 설정
char c;
int num;
- 선언 후 변수의 타입을 변경할 수 없으며, 선언한 타입에 맞는 값만 할당 가능
- 런타임 이전의 컴파일 시점에 타입 체크 수행 (타입에 맞는 값을 할당했는지)
=> 타입 체크를 통과하지 못하면 에러를 발생시켜 런타임으로 못 넘어가게 함
동적 타입 언어
- 자바스크립트
- 변수 선언 시 미리 타입을 지정하지 않음
=> 어떤 타입의 값이라도 자유롭게 할당 가능
- 런타임 시점에 할당된 값에 맞는 타입을 동적으로 결정
- 할당 후에도 변수의 타입을 언제든지 변경 가능
정적 타입 언어 vs. 동적 타입 언어
정적 타입은 변수 선언 시점에 변수의 타입이 결정되며, 이후에도 변수의 타입을 변경할 수 없다.
동적 타입은 변수에 값을 할당하는 시점에 값에 따라 변수의 타입이 동적으로 결정되며, 이후에도 재할당에 의해 변수의 타입이 얼마든지 변경될 수 있다.
동적 타입 언어의 부작용
- 변수에 할당된 값에 따라 타입이 결정된다. => 코드를 실행해보기 전에는 타입을 확신할 수 없다.
- 자바스크립트 엔진에 의해 암묵적으로 값의 타입이 결정되어 개발자의 의도와 상관없이 타입이 자동 변환될 수 있다.
=> 복잡하고 큰 규모의 프로그램에서 신뢰성이 떨어지는 코드가 만들어질 수 있다.
동적 타입 언어 사용 시 주의사항
- 변수는 꼭 필요한 경우에만 제한적으로 선언한다. (변수의 갯수를 너무 많이 선언하지 않는다.
- 변수의 유효 범위(스코프)를 최대한 좁게 만든다. (함수 레벨 스코프인 var 대신 블록 레벨 스코프인 let, const 사용)
- 변수보다 상수를 사용하여 값의 변경을 억제한다. (잘 변경되지 않는 값은 대문자 상수로 선언, 재할당이 가능한 let보다 const를 더 많이 사용)
- 변수의 이름 짓기에 신경 쓴다. (목적을 한 번에 파악할 수 있는 직관적인 네이밍 권장)
코드는 동작하는 것만이 존재의 목적이 아니며, 개발자를 위한 문서이기도 하다.
사람이 이해하기 좋은 코드가 가독성 있는 코드이다.