-
(x = 1) + 5 는 왜 가능한가? 할당문이 값으로 평가되는 이유개발/자바스크립트로의 깊은 잠수 2026. 3. 11. 21:35
자바스크립트에서의 할당문은 값으로 평가되는 표현식입니다.
let x; // 변수 x 선언 console.log((x = 1) + 5); // 6 을 출력한다왜 이런 짓이 가능하도록 만들어졌을까요?

표현식과 문
알아보기에 앞서 표현식과 문이 무엇인지에 대한 정의를 짚어 보겠습니다.
`let x;` 는 변수 선언문입니다.
`x = 1;` 은 할당문임과 동시에 표현식입니다.
표현식(expression)은 값으로 평가될 수 있는 문(statement)이다. 즉, 표현식이 평가되면 새로운 값을 생성하거나 기존 값을 참조한다.
- 이웅모, 『모던 자바스크립트 Deep Dive』, 위키북스, 2020, p.52따라서 문보다 표현식이 더 좁은 개념이라고 볼 수 있습니다.
문은 무엇일까요? 정의는 아래와 같이 할 수 있습니다.
문(statement)은 프로그램을 구성하는 기본 단위이자 최소 실행 단위다. 문의 집합으로 이뤄진 것이 바로 프로그램이며, 문을 작성하고 순서에 맞게 나열하는 것이 프로그래밍이다.
- 이웅모, 『모던 자바스크립트 Deep Dive』, 위키북스, 2020, p.54문은 또한 선언문, 할당문, 조건문, 반복문 등으로 구분할 수 있습니다.
왜 할당문은 표현식이 되었나
얼핏 보면 할당문은 값으로 평가될 필요가 없어 보입니다.
할당문의 목적 자체가 변수에 값을 할당하는 것인데, 할당하는 행위가 왜 또 값으로 평가되는 걸까요?
그냥 아래와 같이 쓰면 안되는 걸까요?
let x; // 변수 x 선언 x = 1; // x에 1을 할당 console.log(x + 5); // 6 을 출력한다맨 위에 쓴 코드보다 이해하기도 쉽고, 읽기도 쉬워 보입니다.
그런데 이게 찾아보니 나름대로 이유가 있었습니다.
C-like language
자바스크립트는 C로부터 많은 영향을 받은 언어입니다.
C가 만들어지던 1972년 당시의 언어 디자이너들은 언어를 만들기 위해 간결한 문법, 컴파일 친화성, 기계어와의 밀접한 연결성, 유연성 등을 중점적으로 고려했습니다.
이 시기의 많은 초기 언어들은 운영체제나 컴파일러같은 저수준(low-level) 처리를 위해 만들어졌어요. 따라서 코드 문법도 이런 저수준 처리가 유리하도록 개발되었습니다.
할당문이 값으로 평가되도록 하면 아래와 같은 패턴이 가능했습니다.
while ((c = getchar()) != EOF) { ... }코드 라인을 별도로 추가하지 않더라도 값을 읽어서 바로 while문에 집어넣는 문법이 가능한 것입니다.
꽤 엘레강스하고 효율적입니다.
특히 이때는 메모리가 부족하던 시절이기 때문에 코드를 짧게 쓰는 것도 의미가 있었습니다.
그리고 아래와 같은 할당 체이닝(chaining)도 가능했습니다.
a = b = c = 0; // c = 0이 0으로 평가되고, b = (평가값)이 평가되고, 다시 a = (평가값)이 되는 구조이런 간결한 표현식을 중요한 가치로 뒀던 시절입니다.
그리고 이런 언어 디자인은 CPU 친화적이기도 합니다.
CPU는 내부적으로 이런 짓을 합니다.
1. 값 연산
2. 어딘가에 저장 (레지스터라든지..)
3. 저장한 값을 결과로 사용
연산의 결과를 어딘가에 저장하고, 값으로 사용하는 이 과정 자체가 할당식을 값으로 사용하는 패턴과 굉장히 비슷합니다.
그래서 C언어도 이런 식으로 디자인 된 것입니다.
그럼 자바스크립트는 왜 C-like language가 되었느냐.
자바스크립트의 개발자 브랜든 아이크는 필요에 의해 열흘만에 자바스크립트를 만들었다고 알려져 있습니다.
그래서 기존 개발자들에게 친숙하게 다가갈 수 있는 언어 설계가 필요했습니다.
당시의 개발자들에게 가장 친숙한 언어는 C언어였습니다.
그래서 많은 부분을 C로부터 차용했고, 그래서 서로 닮아 있어요.
'개발 > 자바스크립트로의 깊은 잠수' 카테고리의 다른 글
자바스크립트같은 약타입 언어에 강한 컨벤션을 강제하는 건 쓸데없는 짓일까? 그럴거면 다른거 쓰지 (1) 2026.04.08 자바스크립트의 빈 배열([])은 빈 문자열(""), 0이지만 boolean일 땐 true로 변환되는 이유 (0) 2026.04.01 어차피 다 똑같은 반복인데 for문만 사용하면 안되는걸까 (1) 2026.03.25 자바스크립트에서 함부로 덧셈하지 마라 (0) 2026.03.18 브라우저는 메모리를 어떻게 관리하길래 크롬 탭 하나가 700MB씩 먹는걸까 (0) 2026.03.04