LHJ

I'm a FE developer.

5. 표현식과 연산자

20 Apr 2020 » js_lj

표현식(expression) 은 값으로 평가될 수 있는 문입니다.
즉 결과가 값인 문과, 표현식이 아닌 문의 차이를 이해하는 것이 매우 중요합니다.
이 차이를 이해해야만 자바스크립트의 요소들을 효과적으로 조합할 수 있습니다.

표현식이 아닌 문(statement) 은 일종의 지시라고 생각할 수 있고, 표현식무언가를 요청하는 것이라고 생각할 수 있습니다.
자, 직장에 첫 출근했다고 상상해 봅시다.
상사가 다가와서 “당신이 할 일은 볼트 A를 너트 B에 끼우는 일입니다.”라고 말합니다.
상사가 한 말은 표현식이 아닌 문입니다.
상사는 당신에게 조립한 결과물을 요청한 것이 아니라, 그저 조립할 것을 지시했을 뿐입니다.
상사가 “볼트 A를 너트 B에 끼우고, 내가 검사할 수 있도록 가져오세요.” 라고 말했다면 그건 표현식입니다.
당신은 지시를 받았고, 그 결과를 반환해야 합니다.

“어떻든 결과는 마찬가지 아닌가? 조립한 결과를 그냥 두든, 상사에게 가져가든 조립된 건 마찬가지인데.” 라고 생각할 수도 있습니다.

프로그래밍 언어라고 상황이 180도 달라지는 건 아닙니다.
표현식이 아닌 뭔가를 합니다.
하지만 그 결과를 명시적으로 반환하는 것은 표현식입니다.

표현식은 값이 됩니다.
그 결과를 다른 표현식에 결합해서 다른 값을 얻을 수 있습니다.
그 값을 또 다른 표현식에 결합해서 또 다른 값을 얻는 식으로 이어질 수 있습니다.
표현식이 아닌 문은 이런 식으로 결합할 수 없습니다.

표현식은 값이 되므로 할당에 쓸 수 있습니다.
즉, 표현식의 결과를 변수나 상수, 프로퍼티에 할당할 수 있습니다.
표현식의 예를 하나 들어 봅시다.
곱셈은 표현식입니다.
이해하기 쉽겠죠?
두 숫자를 곱하면 결과가 나옵니다.
매우 단순한 문 두 개를 봅시다.

let x;
x = 3 * 5;

첫 번째 행은 선언문입니다.
우리는 변수 x가 있다고 선언했습니다.
물론 두 행을 결합할 수 있지만, 그렇게 하면 요점이 잘 드러나지 않습니다.
두 번째 행을 잘 봅시다.
이 행에는 사실 표현식이 두 개 있습니다.
첫 번째 표현식은 3 * 5 입니다.
곱셈 표현식이고, 결과는 15입니다.
그 다음은 값 15를 변수 x에 할당한 표현식입니다.
할당은 그 자체가 표현식입니다.
음? 표현식은 값이 된다고 했는데, 그럼 할당 표현식은 어떤 값이 되는 걸까요?
물론 할당 표현식도 값이 됩니다.
x만 값 15를 할당 받는 것이 아니라, 전체 표현식의 결과도 값 15입니다.
할당은 표현식이고, 따라서 값이 되므로, 다른 변수에 다시 할당할 수 있습니다.
좀 우스꽝스럽지만, 다음 예제를 보십시오.

let x, y;
y = x = 3 * 5;

이제 x와 y 두 변수가 있고 값은 모두 15입니다.
이런 일이 가능한 것은 곱셈과 할당이 모두 표현식이기 때문입니다.
자바스크립트는 이렇게 표현식이 결합된 것을 보면 쪼갤 수 있는 만큼 쪼개서 한 부분씩 실행합니다.

let x, y;
y = x = 3 * 5;      //원래 문
y = x = 15;         // 곱셈 표현식을 평가했습니다.
y = 15; 
                    // 첫 번째 할당을 평가했습니다. x는 이제 15이고, 
                    //y는 아직 undefined입니다.
15; 
                    // 두 번째 할당을 평가했습니다. y는 이제 15입니다. 
                    //전체 문의 결과는 15입니다. 이 값은 사용하지도 않았고 
                    //어딘가에 할당하지도 않았으니 그냥 버려집니다.

그러면 이제 자바스크립트는 어떤 원칙으로 표현식을 그런 순서로 실행하는가 하는 의문이 들겁니다.
즉, y = x를 먼저 실행해서 y에 값을 undefined를 할당하고 그 다음에 곱셈을 해서 y는 undefined로 남고 x는 15가 될 수도 있지 않느냐는 의문 말입니다.
자바스크립트가 표현식을 평가하는 순서를 연산자 우선순위라 부르며, 이 장에서 설명할 겁니다.

표현식은 대부분 연산자(operator) 표현식입니다.
즉 곱셈 표현식은 곱셈 연산자(*)피연산자(operand) 두 개로 이루어집니다.
피연산자는 서로 곱하는 두 숫자이며 피연산자 자체도 표현식입니다.

연산자 표현식이 아닌 표현식에는 식별자 표현식(변수와 상수 이름)과 리터럴 표현식 두 가지가 있습니다.
이름만 봐도 알 수 있을 겁니다.
변수와 상수, 리터럴은 그 자체가 표현식입니다.
표현식은 모두 평등합니다.
값이 되는 것은 모두 표현식이므로, 변수와 상수, 리터럴이 모두 표현식인 것은 당연합니다.