데이터 타입 종류
•
원시
◦
숫자(Number)
◦
문자열(String)
◦
불리언(Boolean)
◦
Undefined
◦
null
◦
심벌(Symbol)
•
객체
◦
객체(Object)
◦
함수(Function)
◦
배열(Array)
숫자(Number)
•
JS는 하나의 숫자 타입만 존재 (int, log, float 없음)
console.log(1 === 1.0); // true
JavaScript
복사
•
모든 수를 실수로 처리
•
배정밀도 64비트 부동소수점 형식
•
숫자를 표현할 때 부호 비트, 지수, 가수부분으로 나누어서 숫자를 표현하기 때문에 오차가 발생할 수도 있음 (실수를 정확히 표현하지는 못함)
•
특별한 값 (Infinity, NaN)
// 숫자 타입의 세 가지 특별한 값
console.log(10 / 0); // Infinity
console.log(10 / -0); // -Infinity
console.log(1 * 'String'); // NaN
var x = nan; // ReferenceError: nan is not defined
// NaN 의 경우 대소문자를 구분하여 써주어야 하며 다르게 사용하였을 시, ReferenceError가 발생
JavaScript
복사
문자열 타입 ( ‘’, “”, `` )
•
변경 불가능한 값(문자열 생성 시 문자열 변경 X)
•
종류
◦
' ' (작은 따옴표)
◦
" " (큰 따옴표)
◦
` ` (백틱, 템플릿 리터럴) - 키보드1 왼쪽에 있는 기호
•
위 값들은 묶여있다.
묶는 이유 : 키워드나 식별자 같은 토큰과 구분
템플릿 리터럴 (`멀티라인, ${}`)
•
ES6부터 도입된 문법
•
런타임에 일반 문자열로 변환되어 처리
•
멀티라인 문자열, 표현식 삽입을 할 때 사용
◦
멀티라인 문자열
기존 따옴표(’ “) 이스케이프 \n과 같은 이스케이프 시퀀스를 사용해야 되는데 이를 사용하지 않고도 줄바꿈이 허용되며 모든 공백도 있는 그대로 적용
◦
표현식 삽입
${variable} 형식으로 백 틱안에 있는 문자열 안에 변수를 넣어 주면 간단히 문자열에 넣어서 사용 가능
Boolean 타입 ( true & false )
•
true & false
•
참과 거짓, 각각 JS에서 1과 0을 반환
undefined 타입
•
var 키워드로 선언한 변수는 암묵적으로 undefined로 초기화
•
변수에 값이 없다는 것을 알리고 싶을 때는 null을 사용
null 타입
•
변수에 값이 없다는 것을 의도적으로 명시하는 것
•
이 null을 할당하는 것은 더 이상 변수가 참조하던 값을 참조하지 않고, 참조를 제거하며, 메모리 공간에 가비지 컬렉션을 수행
•
HTML의 경우, querySelector 사용 시, 조건에 부합하는 요소가 없다면 null을 반환
선언과 정의
•
선언 : 다른 언어에선 선언은 식별자의 존재를 알리는 것,
•
정의 : 메모리 주소를 할당하는 것
•
자바스크립트는 변수를 선언하면 암묵적으로 정의가 이루어짐(var a; 라는 코드가 실행되면 undefined가 할당되는 것)
•
ECMASCript 사양
◦
변수 : '선언한다'라고 표현
◦
함수 : '정의한다'라고 표현
심볼 타입 ( Symbol() )
•
변경 불가능한 원시 타입의 값
•
다른 값과 중복 되지 않는 유일 무이한 값
•
심벌은 리터럴로 못 만들고 Symbol()함수를 사용
Symbol('값') // Symbol타입 사용
(Symbol()) + '' // -> TypeError: Cannot convert a Symbol value to a string
JavaScript
복사
심볼 테이블
컴파일러 또는 인터프리터는 심볼 테이블 이라고 부르는 자료 구조를 통해 식별자를 키(Key)로 바인딩된 값(Value)의 메모리 주소, 데이터 타입, 스코프 등을 관리
객체 타입 ( {}, [array] )
•
나머지 모든 타입
•
JS는 객체 기반 언어, JS를 이루는 거의 모든 것이 객체
데이터 타입의 필요성
•
값 저장 시, 확보해야 하는 메모리 공간의 크기 결정
•
값 참조 시, 읽어들어야 하는 메모리 공간 크기 결정
•
메모리에서 읽은 값을 어떻게 해석할 지 결정
•
데이터 타입에 의한 메모리 공간의 확보와 참조
◦
데이터 타입에 따라 메모리 공간을 얼마나 잡고 읽어들어야 할지 확인하기 위해
(메모리 공간의 크기)
동적 타이핑
•
타입 언어
◦
정적 : 데이터의 타입을 사전에 정의 (int, char 등의 키워드 이용)
◦
동적 : 타입을 사전에 정의 X (JS : var, let, const)
•
JS는 변수의 선언이 아닌 할당에 의해 타입이 결정(타입 추론)된다.
선언시는 무조건 undefined
•
재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다.
var foo;
console.log(typeof foo); // undefined
foo = 3;
console.log(typeof foo); // number
foo = 'Hello';
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
JavaScript
복사
•
변수 : 타입X, 값 : 타입O.
현재 변수에 할당되어 있는 값에 의해 변수의 타입이 동적으로 결정
동적 타입 언어와 변수
•
동적 타입 언어의 구조적 단점
◦
변화하는 변수 값을 추적하기 어렵고, 값을 확인하기 전에는 타입을 확신할 수 없다.
◦
유연성은 높지만 신뢰성이 떨어진다.
•
동적 변수 사용 시 유의 사항
◦
변수는 꼭 필요한 경우에 한해 사용
◦
변수의 유효범위를 최대한 좁게하여 변수 부작용을 억제
◦
전역변수는 최대한 사용 X
◦
변수보다는 상수를 사용
◦
변수 이름은 변수의 목적이나 의미를 파악할 수 있도록 네이밍