데이터 타입
데이터 타입은 “값의 종류”를 말한다. 자바스크립트의 모든 값은 데이터 타입을 가진다. 자바스크립트에서 지원하는 데이터 타입은 총 7개인데 다음과 같다. (숫자, 문자열, 불리언, undefined, null, 심벌, 객체)
다만, 이 포스팅에서 객체 타입은 거의 다루지 않도록 하겠다.
데이터 타입을 나누는 이유는 바로 다음과 같다.
- 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해서
- 값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해서
- 메모리에서 읽어들인 2진수를 어떻게 해석할지 결정하기 위해서
숫자 타입 (Number)
C언어나 Java와는 달리 자바스크립트에서는 하나의 숫자 타입만 존재한다. 64비트 부동소수점 형식을 따르며 정수와 실수를 구분하지 않고 모두 실수로 처리한다. 또한 정수, 실수, 2진수, 8진수, 16진수 리터럴은 모두 메모리에 64비트 부동소수점 형식의 2진수로 저장되는데 만약 이 값들을 참조할 경우 모두 10진수로 해석된다.
var binary = 0b01000001; // 2진수
var octal = 0o101; // 8진수
var hex = 0x41; // 16진수
console.log(binary); // 65
console.log(octal); // 65
console.log(hex); // 65
console.log(binary === octal); // true
console.log(octal === hex); // true
자바스크립트에서는 모든 수를 실수로 처리하기에 정수끼리 연산을 해도 그 값의 결과는 실수가 나올 수 있다. 그리고 숫자 타입은 추가적으로 세 가지 특별한 값을 제공한다.
- Infinity: 양의 무한대
- -Infinity: 음의 무한대
- NaN: 산술 연산 불가 (Not a Number)
문자열 타입 (String)
문자열 타입은 텍스트 데이터를 나타내는데 사용한다. 문자열은 작은 따옴표(’ ’), 큰 따옴표(” “), 벡틱(` `)으로 텍스트를 감싸는 방식으로 표기한다. (자바스크립트에서는 일반적으로 작은 따옴표를 쓴다.)
ES6부터 도입된 템플릿 리터럴은 편리한 문자열 처리 기능을 제공한다. 템플릿 리터럴은 런타임에 일반 문자열로 변환되어 처리된다. 템플릿 리터럴은 작은 따옴표나 큰 따옴표가 아닌 벡틱(``)을 사용하여 표현한다.
var template = `Template literal`;
console.log(template); // Template literal
일반 문자열 내에서는 줄바꿈이 허용되지 않기에 이스케이프 시퀀스를 사용해야 일반 문자열 내에서 공백 표현이 가능하다. 그러나 템플릿 리터럴 내에서는 이스케이프 시퀀스를 사용하지 않아도 줄바꿈이 허용되고, 공백도 있는 그대로 표현된다.
var template = `<ul>
<li><a href="#">Home</a></li>
</ul>`
console.log(template);
( 이스케이프 시퀀스 알아보기 )
일반 문자열은 문자열 연산자 +를 사용해서 연결할 수 있다. 그러나 이는 가독성이 떨어지고 코드를 작성할 떄 좀 불편하다. 템플릿 리터럴 내에서 표현식 삽입을 통해 이 문제를 해결할 수 있다. 표현식을 삽입할 때 ${ }로 표현식을 감싸면 템플릿 리터럴 내에서 변수가 문자열로 변환되어 삽입된다.
var first = 'SW';
var last = 'Kinah';
// ES5 문자열 연결
console.log('My name is' + first + last + '.'); // My name is SWKinah.
// ES6 표현식 삽입
console.log(`My name is ${first}${last}.`); // My name is SWKinah.
불리언 타입 (Boolean)
불리언 타입의 값은 참(true)과 거짓(false) 두 가지이다. 불리언 타입은 주로 조건문에서 자주 사용된다.
undefined 타입
var 키워드로 선언된 변수는 값을 따로 할당하지 않으면 모두 undefined 값으로 초기화된다. 변수를 초기화하기 위해 사용하는 undefined를 개발자가 의도적으로 변수에 사용하는 것은 권장하지 않는다.
null 타입
null은 변수에 값이 없음을 의도적으로 명시할 때 사용하는 데이터 타입이다. 변수에 null을 할당하는 것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 것이다. (이전의 할당된 값에 대한 참조를 제거한다는 것이다)
또한 함수가 유효한 값을 반환할 수 없는 경우에 명시적으로 반환하는 값이다.
심벌 타입 (Symbol)
심벌은 ES6에서 추가된 타입으로 변경 불가능한 원시 타입의 값이다. 심벌 값은 다른 값과 중복되지 않는 유일무이한 값이다. 심벌은 Symbol 함수를 통하여 생성되며, 이떄 생성된 심벌값은 외부에 노출되지 않는다.
객체 타입 (Symbol)
자바스크립트는 객체 기반의 언어이며, 위의 6가지의 타입을 제외한 모든 값은 객체 타입이다.
정적 타입 언어 VS 동적 타입 언어
정적 타입 언어
정적 타입 언어는 변수를 선언할 때 변수에 할당할 수 있는 값의 종류(데이터 타입)을 미리 선언해야 한다. 이를 "명시적 타입 선언"이라고 한다. (대표적으로 C, C++, Java, Kotlin, Go, Rust 등이 있다.)
// 명시적 타입 선언 (C언어 예시)
// a 변수에는 1바이트 정수 타입의 값(-128 ~ 127)까지만 할당할 수 있다.
char a;
// num 변수에는 4바이트 정수 타입의 값 (-2,124,483,648~2,124,483,647)만 할당할 수 있다.
int num;
정적 타입 언어는 변수의 타입을 변경할 수 없고, 변수에 맞는 값만 할당할 수 있다. 컴파일 시점에 타입 체크를 수행하고 타입 체크를 통과하지 못하면 에러가 발생하고 프로그램은 중단된다. 타입의 일관성을 강제하여 안정적인 코드 구현을 이룬다.
동적 타입 언어
변수가 선언이 아닌 할당에 의해 타입이 결정되고, 재할당에 의해 변수의 타입이 언제든지 동적으로 변할 수 있는 것을 “동적 타이핑”이라고 하며, 이러한 특징을 가진 언어를 “동적 타입 언어”라고 한다. (대표적으로 JavaScript, Python, PHP, Ruby 등이 있다.)
var foo;
foo = 3;
console.log(typeof foo); // number
foo = 'hello';
console.log(typeof foo); // string
foo = true;
console.log(typeof foo); // boolean
foo = {};
console.log(typeof foo); // object
foo = function() {};
console.log(typeof foo); // function
변수의 값이 언제든지 변경될 수 있기에 복잡한 프로그램에서는 변화하는 변수 값을 추적하기 어려울 수 있고, 변수의 타입이 고정되지 않고 동적으로 변하기에 값의 변경으로 인해 타입도 변경될 수 있다.
클린 코드를 위한 주의 사항
- 변수는 꼭 필요한 경우에 한해 제한적으로 사용한다. (변수의 무분별한 남발은 금물이다.)
- 변수의 유효 범위(스코프)는 최대한 좁게 만들어 변수의 부작용을 억제해야 한다.
- 전역 변수는 최대한 사용하지 않는다.
- 변수보다는 상수를 사용하여 값의 변경을 억제한다. (const 키워드)
- 변수 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍한다. (변수 뿐만 아니라 모든 식별자도)
코드는 개발자를 위한 문서이기에 사람이 이해할 수 있는 코드, 즉 가독성이 좋은 코드가 좋은 코드이다.
래퍼런스(Reference)
https://www.yes24.com/Product/Goods/92742567