값
값(value)은 식(표현식, expression)이 평가(evaluate)되어 생성된 결과를 말한다. 다시 말하면, [값은 식이 평가되어 생성된 결과]다. 여기서 평가란 식을 해석해서 값을 생성하거나 참조하는 것을 의미한다.
1 + 2; // 3
위의 식(1 + 2)은 평가되어 값 3을 생성한다. 모든 값은 데이터 타입을 가지며 메모리에 2진수, 비트(bit)의 나열로 저장된다.
메모리에 저장된 값은 데이터 타입에 따라 다르게 해석된다.
- 메모리에 저장된 값 0100 0000은 숫자로 65, 문자로 '@'다.
- 메모리에 저장된 값 0100 0001은 숫자로 65, 문자로 'A'다.
- 메모리에 저장된 값 0100 0010은 숫자로 66, 문자로 'B'다.
변수는 하나의 값을 저장하기 위해 (확보한 메모리 공간 자체 or 메모리 공간을 식별하기 위해) 붙인 이름이다. 따라서 변수에 할당되는 것은 값이다.
var sum = 1 + 2;
1 + 2는 평가된(해석하여 값을 생성) 값 3이 sum에 할당된다. 1 + 2가 아니다. 평가된 결과인 값 3이 할당되는 것이다. 그러므로 할당되기 전에 평가되어 값 3을 생성해야 한다
리터럴(literal)
사람이 이해할 수 있는 약속된 '문자'나 '기호'를 사용해 값을 생성하는 표기법(notation)을 말한다.
문자(아라비아 숫자, 알파벳, 한글 등)
기호( ' ', " ", ., [ ], // 등)
[일상 생활에서의 숫자 3]과 [프로그래밍에서의 3]은 같은 3이지만 다른 의미를 가진다.
- [일상 생활]에서 숫자 3은 물리적 물체의 양, 시간 측정, 숫자 순위 등을 나타낼 수 있다.
- [프로그래밍]에서 숫자 3은 특정 수량을 나타내는 리터럴 값으로 사용된다.
3
여기 3이 있다. 프로그래밍에서의 3은 일상적으로 알고 있는 아라비아 숫자 3이 아니라, 숫자 리터럴 3이다. 즉, 사람이 이해할 수 있는 [아라비아 숫자 3]을 사용해 [숫자 리터럴 3]을 코드에 기술하면 자바스크립트 엔진은 이를 평가해 숫자 값 3을 생성한다.
리터럴 목록
- 정수 리터럴 - 150
- 부동소수점 리터럴 - 5.5
- 문자열 리터럴 - 'hello'
- 불리언 리터럴 - true, false
- null 리터럴 - null
- undefined 리터럴 - undefined
- 객체 리터럴 - { nam: 'James', age: '22' }
- 배열 리터럴 - [ 1, 2, 3, 4, 5 ]
- 함수 리터럴 - function add(a, b) { return a + b; }
- 정규 표현식 리터럴 - /[0-9]+/
- 2진수 리터럴 - 0b01000001 (0b로 시작)
- 8진수 리터럴 - 0o101 (0o로 시작)
- 16진수 리터럴 - 0x41 (0x로 시작)
표현식 (expression)
[표현식은 값으로 평가될 수 있는 문]이다. 여기서, 평가는 새로운 값을 생성하거나 기존값을 참조한다는 뜻이다. 표현식은 (리터럴, 식별자, 연산자, 함수 호출 등의 조합으로 이루어지지만 값으로 평가된다는 점은 동일하다.
즉, 값으로 평가되면(새로운 값 생성 or 기존값 참조) 모두 표현식이다. 반대로 표현식은 값으로 평가된다. 이런 식으로 표현식과 표현식이 평가된 값은 동등 관계다. '동치(equivalent)'.
ex. 1 + 2는 3과 동치다. 이때, 1 + 2는 3과 같다.
(JS의 표현식 1 + 2는 평가되어 3을 생성)
따라서 표현식은 값처럼 사용할 수 있다. 이 말은 문법적으로 값이 위치할 수 있는 자리에 표현식도 올 수 있다는 것을 뜻한다.
var score = 10;
여기서 10은 리터럴이다. 리터럴 10은 JS 엔진에 의해 평가되어 값을 생성하므로 리터럴은 그 자체로 표현식이다.
score; // 10
변수 식별자(예제의 score)를 참조하면 변수 값으로 평가된다. 식별자 참조는 값을 생성하지는 않지만 값으로 평가되므로 표현식이다.
var x = 1 + 2;
// 식별자 표현식 x는 값(3)으로 평가된다.
// 값으로 평가 가능하다는 건 ↔ 새로운 값 or 기존 값 참조한다는 의미
x + 3; // 6
위 예제 x + 3은 표현식이다. + 연산자는 좌항과 우항의 값을 산술 연산하는 연산자이므로 좌항과 우항에는 숫자 값이 위치해야 한다. 이때 좌항 x는 식별자 표현식이다. 즉 x는 숫자 값 3(할당된)으로 평가된다. 따라서 숫자 값이 위치해야 할 자리에 표현식 x를 사용할 수 있다. 이처럼 표현식은 다른 표현식의 일부가 되어 새로운 값을 만들어낼 수 있다.
문 (statement)
문은 프로그램을 구성하는 기본 단위이자 최소 실행 단위로, 컴퓨터에게 어떤 일을 수행하도록 명령하는 역할을 한다. 이러한 문의 집합이 프로그램이며, 문을 작성하고 순서에 맞게 나열하는 것이 프로그래밍이다.
문을 명령문이라고도 부른다. (명령)문. 즉, 문(statement)는 컴퓨터에 내리는 명령이다. 문이 실행되면 명령이 실행된다.
문은 여러 토큰으로 구성된다. 여기서 토큰(token)은 더 이상 나눌 수 없으면서 특정 의미와 기능을 한다. 다시 말해, 이 토큰들이 모여 구문적으로 유효한 프로그램을 형성한다.
문은 선언(명령)문, 할당(명령)문, 조건(명령)문, 반복(명령)문 등으로 구분할 수 있다. [변수 선언문은 변수가 선언되도록 하는 명령문]이고, [할당문은 값이 할당되도록하는 명령문]이고, [조건문은 조건에 따라 코드 블록이 결정되어 실행되도록 명령하는 문]이고, [반복문은 특정 코드들이 반복 실행되도록 하는 명령문]이다.
코드 예시
ex. 변수 선언문
let name = "John";
ex. 할당문
let x = 5;
x = x + 1;
ex. 함수선언문
function greet(name) {
console.log("Hello, " + name + "!");
}
ex. 조건문
let num = 10;
if (num > 5) {
console.log("The number is greater than 5");
} else {
console.log("The number is less than or equal to 5");
}
ex. 반복문
for (let i = 0; i < 5; i++) {
console.log("The value of i is: " + i);
}
표현식인 문과 표현식이 아닌 문
문은 프로그램을 구성하는 기본 단위이자 최소 실행 단위라고 했다. 문에는 표현식인 문과 표현식이 아닌 문이 있다. [표현식인 문은 값으로 평가될 수 있는 문]이고, [표현식이 아닌 문은 값으로 평가될 수 없는 문]이다.
표현식인 문 ↔ 값으로 평가될 수 있는 문
표현식이 아닌 문 ↔ 값으로 평가될 수 없는 문
이 둘을 구분 짓는 것은 '값으로 평가되는가?'에 대한 여부다. 혹은 변수에 할당이 가능한지(*값으로 평가될 수 있어야 변수 할당이 가능) 보면 된다. 표현식인 문은 값으로 평가되므로 변수에 할당할 수 있기 때문이다. 반대로 표현식이 아닌 문은 값으로 평가할 수 없으므로 변수에 할당하면 에러가 발생한다.
var x;는 값이 아니므로 표현식이 아닌 문이다(변수 선언문). 그러므로 var x;라는 값으로 평가될 수 없는 것을 foo라는 변수에 할당하니 에러가 발생했다.
var x;
x = 10;
var x; 자체는 값으로 평가될 수 없기 때문에 표현식이 아닌 문이고, x = 10;은 값처럼 사용할 수 있기 때문에, 표현식인 문이다. 그러므로 위 할당문은 표현식인 문이다.
// x = 10은 x 변수에 할당한 값 10으로 평가된다.
// 따라서 foo 변수에는 값 10이 할당된다.
var foo = x = 10;
값 10이 x에 할당
→ x가 foo에 할당
→ foo는 값 10으로 평가된다.
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."