데이터 타입 (Data Type)
값의 종류 (자료형)
- 자바스크립트의 모든 값은 데이터 타입을 갖는다.
- 자바스크립트 (ES6)는 7개의 데이터타입을 제공하는데, 이는 원시 타입(primitive type)과 객체 타입(object/reference type)으로 분류할 수 있다.
숫자 타입 (Number)
- C나 java의 경우, 정수와 실수를 구분해서 int, long, float, double 등과 같은 다양한 숫자 타입을 제공한다.
- 자바스크립트는 모든 수를 실수로 처리하며, 정수를 표현하기 위한 데이터 타입이 별도로 존재하지 않는다.
- ECMAScript 사양에 따르면 숫자 타입의 값은 배정밀도 64비트 부동소수점 형식을 따른다.
- 모든 수를 실수로 처리하기 때문에 정수로 표시되는 수끼리 나누더라도 실수가 나올 수 있다.
- 자바스크립트는 2진수, 8진수, 16진수를 표현하기 위한 데이터 타입 또한 제공하지 않기 때문에 해당 값을 참조하면 모두 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
// 숫자 타입은 모두 실수로 처리된다.
console.log(1 == 1.0); // true
console.log(4 / 2); // 2
console.log(3 / 2); // 1.5
🔥 숫자 타입은 추가적으로 세 가지 특별한 값도 표현할 수 있다.
✨ Infinity : 양의 무한대
✨ -Infinity : 음의 무한대
✨ NaN : 산술 연산 불가 (Not - a - Number)
console.log(10 / 0); // Infinity
console.log(10 / -0); // -Infinity
console.log(1 * 'String'); // NaN
// 자바스크립트는 대소문자를 구분하므로 NaN을 사용할 경우 대소문자에 주의하여 사용해야 한다.
// Nan, NAN, nan 등의 표현을 사용하면 에러가 발생한다.
문자열 타입 (String)
텍스트 데이터를 나타내는 데 사용
- 자바스크립트의 문자열은 원시 타입이며, 변경 불가능한 값 (immutable value)이다.
- 문자열이 생성되면, 그 문자열을 변경할 수 없다는 것을 의미한다.
- 문자열은 0개 이상의 16비트 유니코드 문자 (UTF-16)의 집합으로 전 세계 대부분의 문자를 표현할 수 있다.
- 작은따옴표 (' '), 큰따옴표 (" "), 또는 백틱 (` `)으로 텍스트를 감싼다.
- 만약 문자열을 따옴표로 감싸지 않으면 자바스크립트 엔진은 문자열을 키워드나 식별자 같은 토큰으로 인식하고, 스페이스와 같은 공백문자도 문자열에 포함시킬 수 없다.
템플릿 리터럴 (Template Literal)
멀티라인 문자열 (multi-line string), 표현식 삽입 (expression interpolation), 태그드 템플릿 (tagged template) 등 편리한 문자열 처리 기능을 제공
- ES6부터 템플릿 리터럴이라고 하는 새로운 문자열 표기법이 도입되었다.
- 문자열과 비슷해 보이지만 작은따옴표(' ') 또는 큰따옴표(" ") 같은 일반적인 따옴표 대신 백틱(` `)을 사용해 표현한다.
- 런타임에 일반 문자열로 변환되어 처리된다.
var template = `Template literal`;
console.log(template); // Template literal
멀티라인 문자열 (Multi-line String)
- 일반 문자열 내에서는 줄바꿈(개행)이 허용되지 않기 때문에 개행을 표현하려면 백슬래시(\)로 시작하는 이스케이프 시퀀스를 사용해야 한다.
- 템플릿 리터럴 내에서는 이스케이프 시퀀스를 사용하지 않고도 줄바꿈이 허용되며, 모든 공백도 있는 그대로 적용된다.
var template = `<ul>
<li><a href="#">Home</a></li>
</ul>`;
console.log(template);
//출력 결과
<ul>
<li><a href="#">Home</a></li>
</ul>
표현식 삽입 (Expression Interpolation)
- 문자열 연산자보다 가독성 좋고 간편하게 문자열을 조합하는 방법이다.
- 표현식을 삽입할 때에는 ${ } 으로 표현식을 감싼다.
- 표현식의 평가 결과가 문자열이 아니더라도 문자열로 타입이 강제로 변환되어 삽입된다.
- 일반 문자열은 + 연산자를 사용해 연결할 수 있으며 + 연산자는 피연산자 중 하나 이상이 문자열인 경우 문자열 연결 연산자로 동작하고 이외에는 덧셈 연산자로 동작한다.
var first = "Billy";
var last = "Boo";
// ES5: 문자열 연결
console.log("My name is " + first + " " + last + "."); // My name is Billy Boo.
// ES6: 표현식 삽입
console.log(`My name is ${first} ${last}.`); // My name is Billy Boo.
// 템플릿 리터럴이 아닌 일반 문자열에서의 표현식 삽입은 문자열로 취급된다.
console.log('My name is ${first} ${last}.'); // My name is ${first} ${last}.
불리언 타입 (Boolean)
불리언 타입의 값은 논리적 참, 거짓을 나타내는 true와 false 뿐이다.
var foo = true;
console.log(foo); // true
foo = false;
console.log(foo); // false
- 불리언 타입의 값은 참과 거짓으로 구분되는 조건에 의해 프로그램의 흐름을 제어하는 조건문에서 자주 사용한다.
undefined 타입
undefined 타입의 값은 undefined가 유일하다.
- 개발자가 의도적으로 할당하기 위한 값이 아니라 자바스크립트 엔진이 변수를 초기화할 때 사용하는 값이다.
- 변수를 선언한 이후 값을 할당하지 않은 변수를 참조하면 undefined가 반환된다.
- 변수 선언에 의해 확보된 메모리 공간을 처음 할당이 이루어질 때까지 쓰레기 값이 들어있는 빈 상태로 내버려두지 않고 자바스크립트 엔진이 undefined로 초기화한다.
- 개발자가 의도적으로 undefined를 변수에 할당한다면 undefined의 본래 취지와 어긋나고 혼란을 줄 수 있으므로 권장하지 않는다.
- 만약 변수에 값이 없다는 것을 명시하고 싶을 때에는 undefined 대신 null을 사용한다.
null 타입
null 타입의 값은 null이 유일하며 변수에 값이 없다는 것을 의도적으로 명시할 때 사용한다.
- 자바스크립트는 대소문자를 구별하므로 null은 Null, NULL 등과 다르다.
- 변수에 null을 할당하는 것은 변수가 이전에 참조하던 값을 더 이상 참조하지 않겠다는 의미이다.
- null을 통해 명시적으로 제거된 참조를 바탕으로 자바스크립트 엔진은 해당 메모리 공간에 대해 가비지 콜렉션을 수행한다.
- 함수가 유효한 값을 반환할 수 없는 경우 명시적으로 null을 반환하기도 한다.
<!DOCTYPE html>
<html>
<body>
<script>
var element = document.querySelector(".myClass");
// HTML 문서에 myClass 클래스를 갖는 요소가 없다면 null을 반환
console.log(element); // null
</script>
</body>
</html>
심벌 타입
ES6에서 추가된 7번째 타입으로, 변경 불가능한 원시 타입의 값이며 다른 값과 중복되지 않는 유일무이한 값
- 주로 이름이 충돌할 위험이 없는 객체의 유일한 프로퍼티 키를 만들기 위해 사용한다.
- 심벌 이외의 원시 값은 리터럴을 통해 생성하지만 심벌은 Symbol 함수를 호출해 생성한다.
- 이떄 생성된 심벌 값은 외부에 노출되지 않으며 다른 값과 절대 중복되지 않는 유일무이한 값이다.
// Symbol 값 생성
var key = Symbol('key');
console.log(typeof key); // symbol
// 객체 생성
var obj = {};
// 이름이 충돌할 위험이 없는 유일무이한 값인 심벌을 프로퍼티 키로 사용한다
obj[key] = 'value';
console.log(obj[key]); // value
객체 타입
- 자바스크립트는 객체 기반의 언어이며 자바스크립트를 이루고 있는 거의 모든 것이 객체이다.
- 위의 6가지 데이터 타입 이외의 값은 모두 객체 타입이다.
데이터 타입의 필요성
데이터 타입에 의한 메모리 공간의 확보와 참조
메모리 공간 확보
- 메모리에 값을 저장하려면 확보해야 할 메모리 공간의 크기를 먼저 결정해야 한다.
- 자바스크립트 엔진은 데이터 타입에 따라 정해진 크기의 메모리 공간을 확보한다.
- 변수에 할당되는 데이터 타입에 따라 확보해야 할 메모리 공간의 크기가 결정된다.
메모리 공간 참조
- 값을 참조하려면 한 번에 읽어 들여야 할 메모리 공간의 크기, 즉 메모리 셀의 개수 (바이트 수)를 알아야 한다.
- 저장되어 있는 값의 데이터 타입에 맞는 단위로 메모리 공간을 읽어들이지 않으면 값이 훼손된다.
- 변수에 할당되어 있는 데이터 타입에 따라 읽어들여야 할 메모리 공간의 크기가 결정된다.
데이터 타입에 의한 값의 해석
- 모든 값은 데이터 타입을 가지며 메모리에 2진수로 저장된다.
- 메모리에 저장된 값은 데이터 타입에 따라 다르게 해석될 수 있다.
- 따라서 어떤 변수를 참조하면 메모리 공간의 주소에서 읽어들인 2진수를 정해진 데이터 타입에 따라 해석한다.
🔥 데이터 타입이 필요한 이유 요약
✨ 값을 저장할 때 확보해야 하는 메모리 공간의 크기를 결정하기 위해
✨ 값을 참조할 때 한 번에 읽어 들여야 할 메모리 공간의 크기를 결정하기 위해
✨ 메모리에서 읽어들인 2진수를 어떻게 해석할지 결정하기 위해
동적 타이핑
자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정(타입 추론)되며 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다.
정적 타입 언어
- 명시적 타입 선언 - 데이터 타입을 사전에 선언하는 것
- C나 Java 같은 정적 타입 언어는 변수를 선언할 때 변수에 할당할 수 있는 값의 종류를 사전에 선언한다.
- 정적 타입 언어는 변수의 타입을 변경할 수 없으며 변수에 선언한 타입에 맞는 값만 할당할 수 있다.
- 컴파일 시점에 타입 체크를 수행한다.
- 타입 체크를 통과하지 못했을 경우, 에러를 발생시키고 프로그램 실행을 막는다.
- 타입의 일관성을 강제함으로써 더욱 안정적인 코드를 구현할 수 있고, 런타임에 발생하는 에러를 줄일 수 있다.
동적 타입 언어
- 자바스크립트는 정적 타입 언어와 다르게 변수를 선언할 때 타입을 선언하지 않는다.
- var, const, let 키워드를 사용하여 어떠한 데이터 타입의 값이라도 자유롭게 할당할 수 있다.
- 값을 할당하는 시점에 변수의 타입이 동적으로 결정되고 변수의 타입을 언제든지 자유롭게 변경할 수 있다.
- typeof 연산자 - 연산자 뒤에 위치한 피연산자의 데이터 타입을 문자열로 반환한다.
- typeof 연산자로 변수를 연산하면 변수에 할당된 값의 데이터 타입을 반환한다.
var foo;
console.log(typeof foo); // undefined
foo = 3;
console.log(typeof foo); // number
foo = 'Billy';
console.log(typeof foo); // string
foo = true;
console.log(typeof foo); // boolean
foo = null;
console.log(typeof foo); // object
foo = Symbol(); // 심벌
console.log(typeof foo); // symbol
foo = {}; // 객체
console.log(typeof foo); // object
foo = []; // 배열
console.log(typeof foo); // object
foo = function () {}; // 함수
console.log(typeof foo); // function
- 현재 변수에 할당되어 있는 값에 의해 변수의 타입이 동적으로 결정된다.
- 변수 값이 언제든지 변경될 수 있기 때문에 복잡한 프로그램에서는 변화하는 변수 값을 추적하기 어려울 수 있다.
- 동적 타입 언어의 변수는 값을 확인하기 전에는 타입을 확신할 수 없다.
- 자바스크립트의 경우, 개발자의 의도와 관계 없이 엔진에 의해 암묵적으로 타입이 자동으로 변환되기도 한다.
- 숫자 타입의 변수일 것이라고 예측했지만, 사실 문자열 타입의 변수일 수도 있다.
- 즉, 동적 타입 언어는 유연성(flexibility)은 높지만 신뢰성(reliability)은 떨어진다.
변수 사용 시 주의할 점
✨ 꼭 필요한 경우에 한해 재한적으로 사용한다.
✨ 변수의 유효 범위 (스코프)는 최대한 좁게 만들어 변수의 부작용을 억제해야 한다.
✨ 전역변수는 최대한 사용하지 않도록 한다.
✨변수보다는 상수를 사용해 값의 변경을 억제한다.
✨ 변수 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍한다.
- 코드는 오해하지 않도록 작성해야 한다. 따라서 사람이 이해할 수 있는 코드, 즉 가독성이 좋은 코드가 좋은 코드이다.
'Web > JS' 카테고리의 다른 글
[JS] 모던 자바스크립트 Deep Dive - 09. 타입 변환과 단축 평가 (0) | 2024.03.29 |
---|---|
[JS] 모던 자바스크립트 Deep Dive - 08. 제어문 (1) | 2024.03.23 |
[JS] 모던 자바스크립트 Deep Dive - 07. 연산자 (1) | 2024.03.22 |
[JS] 모던 자바스크립트 Deep Dive - 05. 표현식과 문 (0) | 2024.03.16 |
[JS] 모던 자바스크립트 Deep Dive - 04. 변수 (0) | 2024.03.13 |