'값(value)', '표현식(expression)', '문(statement)' 등의 정확한 정의가 무엇인지 알아봅니다.

값(value)

값(value)은 표현식(expression)이 평가(evaluate)돼 생성된 결과를 말합니다.

평가란 식을 해석해 값을 생성하거나 참조하는 것을 의미합니다. 아래의 식은 '평가'돼 '값' 30을 생성합니다.

10 + 20
10 + 20

모든 값은 데이터 타입을 가지고, 메모리에 비트의 나열로 저장됩니다. 이렇게 저장된 값은 데이터 타입에 따라 다르게 해석됩니다.

var value = 10 + 20
var value = 10 + 20

위 코드에서 변수 value에 할당되는 것은 10 + 20이 아닌 그 평과의 결과인 30입니다. 값은 이 코드처럼 식을 통해 생성할 수도 있지만, 값을 생성하는 가장 기본적인 방법은 리터럴을 이용하는 것입니다.

리터럴(literal)

리터럴(literal)은 사람이 이해할 수 있는 문자 혹은 약속된 기호를 이용해 값을 생성하는 표기법(notation)을 말합니다.

3 // 숫자 리터럴 3
3 // 숫자 리터럴 3

이 코드에서 3은 단순히 숫자 3이 아니라 '숫자 리터럴'입니다. 사람이 이해할 수 있는 아라비아 숫자를 사용해 숫자 리터럴 3을 넣으면 JS 엔진은 이를 평가해 숫자 '값' 3을 생성합니다.

즉 리터럴은 사람이 이해할 수 있는 문자 또는 기호('', "", ,, ., [], {} 등)로 표기한 코드를 의미합니다. 값을 생성하기 위해 미리 약속한 일종의 표기법인 것입니다.

리터럴을 통해 다양한 타입의 값을 생성할 수 있습니다.

리터럴예시
정수100
부동소수점10.5
2진수0b01000001
8진수0o101
16진수0x41
문자열'Hello', "Hello"
booleantrue, false
nullnull
undefinedundefined
객체{food: "custard cream", price: 100}
배열[1, 2, 3]
함수function() {}
정규 표현식/[a-z]/g

표현식(expression)

값으로 평가될 수 있는 모든 문(statement)을 말합니다. 표현식이 평가되면 새로은 값을 생성하거나 기존 값을 참조하게 됩니다. 방금 살펴본 리터럴도 값으로 평가되기 때문에 그 자체로 표현식입니다.

// 리터럴 표현식
10
;("안녕!")

// 식별자 표현식 (앞서 선언이 진행됐다고 하면)
sum
person.name
arr[1]

// 연산자 표현식
10 + 20
sum = 10
sum !== 10

// 함수, 메소드 표현식 (앞서 선언이 진행됐다고 하면)
squate()
person.setName()
// 리터럴 표현식
10
;("안녕!")

// 식별자 표현식 (앞서 선언이 진행됐다고 하면)
sum
person.name
arr[1]

// 연산자 표현식
10 + 20
sum = 10
sum !== 10

// 함수, 메소드 표현식 (앞서 선언이 진행됐다고 하면)
squate()
person.setName()

문법적으로 값이 위치할 수 있는 자리에는 표현식도 위치할 수 있다는 점을 알아둡시다.

문(statement)

프로그램을 구성하는 기본 단위이자 최소 실행 단위를 말합니다. 명령문이라고도 부르며, 문의 집합이 곧 프로그램이고, 문을 작성하고 순서에 맞게 배치하는 것이 프로그래밍입니다.

하나의 문은 여러 토큰으로 구성됩니다. 이 때 토큰이란 문법적인 의미를 가지고 문법적으로 더이상 나눌 수 없는 코드의 기본 요소를 의미합니다.

const sum = 1 + 2
const sum = 1 + 2

여기에서 const, sum, =, 1, +, 2, ; 각각이 바로 토큰입니다.

세미콜론

;은 문의 종료를 나타내는데 이는 생략이 가능합니다. JS 엔진에 문의 끝이라고 예측되는 지점에 자동으로 세미콜론을 붙여주는 ASI(Automatic Semicolon Insertion) 기능이 있기 때문입니다.

ASI에 의존해도 될지 말아야 할지는 논쟁거리입니다. 대부분은 세미콜론 사용을 권장합니다.

표현식인 문과 표현식이 아닌 문

표현식은 문의 일부일 수도 있고, 그 자체로 문이 될 수도 있습니다. 값으로 평가될 수 있는지 없는지를 생각해보면 쉽게 구분할 수 있습니다.

표현식인 문은 값처럼 사용할 수 있습니다.

var foo = (bar = 3)
// 할당문은 그 자체로 표현식이므로 값처럼 쓸 수 있습니다.
var foo = (bar = 3)
// 할당문은 그 자체로 표현식이므로 값처럼 쓸 수 있습니다.