모던 자바스크립트 Deep Dive 5: 표현식과 문
값이란 무엇인가?
값이란 표현식이 평가되서 생성된 결과
를 말한다.
모든 값은 데이터 타입을 갖는데 메모리에 저장된 똑같은 이진수 값이라도 데이터 타입에 따라 이진수 값이 해석되는 결과가 다르다.
예를 들어, 메모리에 0100 0001이란 이진수 값이 저장되어있다고 하자. 이 값의 데이터 타입이 number이면 65
지만 string이면 "A"
이다.
값을 변수에 할당하려면 표현식이 평가가 되어야한다.
다음과 같은 코드가 있다.
var sum = 10 + 20;
위 코드는 저번에 변수에 어떻게 값이 할당되는지
에 대해 표현식 관점에서 설명하자면 다음과 같다.
10 + 20이란 표현식이 평가되어서 30이란 결과 값이 생성되어 sum이 참조하고있는 메모리 공간에 저장된다.
따라서 30이란 값이 sum 변수에 할당하기 위해서는 10 + 20 표현식이 평가가 되어야한다.
리터럴
리터럴은 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법이다.
예를 들어, 숫자 리터럴 값 5를 코드에 작성하면 자바스크립트 엔진은 5라는 표현식을 평가해 5를 메모리에 저장한다.
리터럴 값을 평가하는 시점은 런타임
때이다.
표현식
먼저, 표현식에 대한 정의를 내리면 다음과 같다.
표현식은 값으로 평가될 수 있는 문(statement)이다. 표현식이 평가되면 새로운 값을 생성하거나 기존 값을 참조한다.
정의를 읽어보면 무슨 말인지 감이 잘 안온다. 예를 들면 다음과 같은 문(statement)가 있다고 하자
var score = 100;
위 코드에서 100은 리터럴이다. 자바스크립트 엔진은 100을 평가되어 100이란 값을 score가 참조하고 있는 메모리 공간에 저장한다. 따라서 리터럴은 표현식이다.
var score = 50 + 50;
score;
위 코드에서 자바스크립트 엔진이 50 + 50을 평가되어 결과 값 100을 score가 참조하고 있는 메모리 공간에 저장한다. 따라서 50 + 50은 표현식이다.
두번째 라인인 score;
문은 자바스크립트 엔진이 변수가 참조하고 있는 메모리에 저장된 값으로 평가된다. 즉, 식별자 선언이 된 식별자 참조하는 문도 표현식이다.
위의 두가지 예시로 알 수 있는건 값으로 평가될 수 있는 문은 모두 표현식이라는 것이다.
표현식인 문 vs 표현식이 아닌 문
문에는 표현식인 문과 표현식이 아닌 문이 있다. 다시 말해 값으로 평가될 수 있는 문은 표현식인 문이고, 값으로 평가될 수 없는 문은 표현식이 아닌 문이다.
이걸 구별하는 방법은 변수에 할당해 보는 것
이다. 표현식인 문은 값으로 평가되기 때문에 변수에 할당할 수 있고, 표현식이 아닌 문은 값으로 평가할 수 없으므로 변수에 할당할 수 없다.
var x;
x = 100;
var foo = var x; // Error
위의 코드에서 2번째 라인은 변수에 할당할 수 있다. 그 이유는 100이란 리터럴 값이 표현식이기 때문이다.
반면, 3번째 라인에서 에러가 발생한다. 그 이유는 var x
문은 값으로 평가될 수 없는 문이기 때문이다.
그렇다면 다음 코드의 결과는 어떨까?
var foo = (x = 100);
console.log(foo);
위의 결과는 foo에 100이라는 결괴값이 출력된다. 그 이유는 x = 100
문은 표현식이다. 즉, 값으로 평가될 수 있기 때문에 1번째 라인은 값으로 평가될 수 있는 문이다.