
값(value)은 식(표현식expression)이 평가(evaluate)되어 생성된 결과를 말한다.
여기서 평가란 식을 해석해서 값을 생성하거나 참조하는 것을 의미한다.
모든 값은 데이터 타입을 가지며, 메모리에 2진수, 즉 비트의 나열로 저장된다.
메모리에 저장된 값은 데이터 타입에 따라 다르게 해석될 수 있다.
변수는 하나의 값을 저장하기 위해 확보한 메모리 공간 자제 또는 그 메모리 공간을 식별하기 위해 붙인 이름이다.
따라서 이 변수에 할당되는 것은 값이다.
리터럴(literal)은 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법(notation)을 말한다.
ex) 자바스크립트에 3을 입력하면 이 3은 단순한 아라비아 숫자가 아니라 숫자 리터럴이다. 사람이 이해할 수 있는 아라비아 숫자를 사용해 숫자 리터럴 3을 코드에 기술하면 자바스크립트 엔진은 이를 평가해 숫자 값 3을 생성한다.
리터럴은 값을 생성하기 위해 미리 약속한 표기법이라고 할 수 있다.
| 리터럴 | 예시 | 비고 |
|---|---|---|
| 정수 리터럴 | 100 | |
| 부동소수점 리터럴 | 10.5 | |
| 2진수 리터럴 | 0b0100001 | 0b로 시작 |
| 8진수 리터럴 | 0o101 | ES6에서 도입, 0o로 시작 |
| 16진수 리터럴 | 0x41 | ES6에서 도입, 0x로 시작 |
| 문자열 리터럴 | 'Hello' "World" | |
| 불리언 리터럴 | true false | |
| null 리터럴 | null | |
| undefined 리터럴 | undefined | |
| 객체 리터럴 | { name: 'Lee', address: 'Seoul' } | |
| 배열 리터럴 | [ 1, 2, 3 ] | |
| 함수 리터럴 | function() {} | |
| 정규 표현식 리터럴 | /[A-Z] +/g |
표현식(expression)은 값으로 평가될 수 있는 문(statement)이다. 즉 표현식이 평가되면 새로운 값을 생성하거나 기존 값을 참조한다.
score;
값으로 평가될 수 있는 문은 모두 표현식이다.
문(statement)은 프로그램을 구성하는 기본 단위이자 최소 실행 단위다.
문의 집합으로 이뤄진 것이 바로 프로그램이며, 문을 작성하고 순서에 맞게 나열하는 것이 프로그래밍이다.
| 종류 | 실행값 |
|---|---|
| 선언문 | 변수가 선언 됨 |
| 할당문 | 값이 할당 됨 |
| 조건문 | 지정한 조건에 따라 실행할 코드블록({ ... })이 결정되어 실행 |
| 반복문 | 특정코드 블록이 반복 실행됨 |
세미콜론(;)은 문의 종료를 나타낸다.
자바스크립트 엔진은 세미콜론으로 문이 종료된 위치를 파악하고 순차적으로 하나씩 문을 실행한다. 따라서 문을 끝낼 때는 세미콜론을 붙여야한다.
단, 0개 이상의 문을 중괄호로 묶은 코드 블록 뒤에는 세미콜론을 붙이지 않는다.
ex) if문, for문, 함수 등
이러한 코드 블록은 언제나 문의 종료를 의미하는 자체 종결성을 갖기 때문이다.
자바스크립트 엔진이 소스코드를 해석할 때 문의 끝이라고 예측되는 지점에 세미콜론을 자동으로 붙여주는 세미콜론 자동 삽입 기능이 암묵적으로 수행되기 때문이다.
그러나 동작과 개발자의 예측이 일치하지 않는 경우가 간혹 있기도 하고, TC39에서도 세미콜론 사용을 권장하는 분위기 이므로 사용하는 것이 좋을듯 싶다!!
표현식인 문과 표현식이 아닌 문을 구별하는 가장 간단하고 명료한 방법은 변수에 할당해 보는 것이다.
- 표현식이 아닌 문은 값처럼 사용할 수 없다.
- 변수 선언 문은 표현식이 아닌 문이므로 값으로 평가될 수 없다.
값처럼 사용할 수 없기 때문에
ex) 조건문- 이에 비해 할당문은 그 자체가 표현식이므로 값처럼 사용할 수 있다.
** 크롬 개발자 도구에서 표현식이 아닌 문을 실행하면 언제나 undefined를 출력한다. 이를 완료 값이라고 하는데, 완료 값은 표현식의 평가 결과가 아니다. 따라서 다른 값과 같이 변수에 할당할 수 없고, 참조할 수도 없다.
데이터 타입은 값의 종류를 말한다.
자바스크립트의 모든 값은 데이터 타입을 갖는다.
| 구분 | 데이터타입 | 설명 |
|---|---|---|
| 원시 타입 | 숫자 타입 | 숫자, 정수와 실수 구분 없이 하나의 숫자 타입만 존재 |
| 문자열 타입 | 문자열 | |
| 불리언 타입 | 논리적 참(true)과 거짓(false) | |
| undefined 타입 | var 키워드로 선언된 변수에 암묵적으로 할당되는 값 | |
| null 타입 | 값이 없다는 것을 의도적으로 명시할 때 사용하는 값 | |
| 심벌 타입 | ES6에서 추가된 7번째 타입 | |
| 객체 타입 | 객체, 함수, 배열 등 |
자바스크립트는 대소문자를 구별하므로 NaN값을 NAN, Nan, nan과 같이 표현하면 에러가 발생하므로 주의해야한다.
*템플릿 리터럴은 멀티라인 문자열, 표현식 삽입, 태그드 템플릿 등 편리한 문자열 처리 기능을 제공한다.
| 이스케이프 시퀀스 | 의미 |
|---|---|
| \0 | Null |
| \b | 백스페이스 |
| \f | 폼피드: 프린터로 출력할 경우 다음페이지의 시작 지점으로 이동한다. |
| \n | 개행: 다음 행으로 이동 |
| \r | 개행: 커서를 처음으로 이동 |
| \t | 탭(수평) |
| \v | 탭(수직) |
| uXXXX | 유니코드 ex) '\u0041'은 'A' |
| \' | 작은 따옴표 |
| \" | 큰 따옴표 |
| \ | 백슬래시 |
불리언 타입의 값은 논리적 참, 거짓을 나타내는 true와 false 뿐이다.
undefined 타입의 값은 undefined가 유일하다.
null 타입의 값은 null이 유일하다.
자바스크립트는 대소문자를 구별하므로 null은 Null, NULL과 다르다.
변경 불가능한 원시 타입의 값이다.
자바스크립트는 객체 기반의 언어이며, 자바스크립트를 이루고 있는 거의 모든 것이 객체라는 것이다.
6가지의 원시타입 이외의 값은 모두 객체 타입이다.
변수에 할당되는 값의 데이터 타입에 따라 확보해야할 메모리 공간의 크기가 결정되기 때문에 데이터 타입이 필요하다.
C나 자바 같은 정적 타입 언어는 변수를 선언할 때 변수에 할당할 수 있는 값의 종류, 즉 데이터 타입을 사전에 선언해야한다.
이를 명시적 타입 선언 이라 한다.
정적 타입 언어는 변수의 타입을 변경할 수 없으며, 변수에 선언한 타입에 맞는 값만 할당할 수 있다. 그러므로 컴파일 시점에서 타입 체크(선언한 데이터 타입에 맞는 값을 할당했는지 검사하는 처리)를 수행한다.
자바스크립트는 정적 타입 언어와 다르게 변수를 선언할 때 타입을 선언하지 않는다. 다만, var, let, const 키워드를 사용해 변수를 선언할 뿐이다.
미리 선언한 데이터 타입의 값만 할당할 수 있는 것이 아닌, 어떠한 데이터 타입의 값이라도 자유롭게 할당할 수 있다.
자바스크립트의 변수는 선언이 아닌 할당에 의해 타입이 결정된다. 그리고 재할당에 의해 변수의 타입은 언제든지 동적으로 변할 수 있다.
이러한 특징을 동적타이핑이라고한다.
대표적인 동적타입 언어는 자바스크립트, 파이썬, PHP, 루비, 리스프, 펄 등이 있다.
기본적으로 변수는 타입을 갖지 않는다. 하지만 값은 타입을 갖는다.
-> 따라서 현재 변수에 할당되어 있는 값에 의해 변수의 타입이 동적으로 결정된다고 표현하는 것이 더 적절하다.