식과 문이란 무엇인가...

식.. 간단히 살펴보자

식은 expression이라고 한다. 간단히 말해 하나의 값이 되는 것. 여기서 값이란 기본값은 물론 객체 등의 참조값도 포함이 된다.

자바스크립트가 인정하는 식에는

  1. 값 식: 값 자체도 식으로 인정

  2. 연산식: 연산자가 포함된 경우 결과는 반드시 하나의 값이 되어 최종적으로는 값 식이 된다.

  3. 리터럴: 리러털은 대부분 객체 생성을 위한 일종의 매크로임. 리터럴의 결과는 참조값이 된다.

    {} // 오브젝트 리터럴
    function(){} // 함수리터럴
    [] // 배열리터럴
    /abcd/ // 정규식 리터럴
  4. 함수호출: 함수를 호출한 결과는 값이 된다. 자바는 void 를 반환하면 값이 될 수 없지만, JS 는 명시적으로 값을 반환하지 않아도 undefined 가 반환되어 언제나 값으로 수렴된다.

위 4종류를 자세히 읽어보면 알겠지만, 모든 식은 오직 값 식 만이 존재한다. 결론적으로 다른 모든 식은 하나의 값에 수렴하여 값 식이 되는 것이므로 값 == 식 으로 이해하자.

문.. 간단히 살펴보자

문이란 statement 라 한다. 의미 상으로 인터프리터에게 내리는 지시문이라 할 수 있다.

따라서 문은 파싱된 이후에 아무것도 남지 않게 되므로 값으로 쓸 수 없다.

var a = if (b) return 3; // 에러!!

위의 코드는 에러가 발생한다. 왜 에러가 발생하는지 설명할 수 있나?

위에서 사용한 if (식) 문; 형식은 미리 인터프리터에 정의된 제어문 이다. if 문은 식이 참일 때 지정된 문을 실행하도록 되어있는 인터프리터를 위한 지시자 일 뿐 어떠한 값도 될 수 없다.

따라서 위의 예시와 같이 a에 if 를 할당하려고해도 아무것도 없으므로 할당이 불가능하다.

문 은 당연하게도 인터프리터의 파싱 규칙 그 자체이므로 언어 규격 상 매우 엄격하게 정의되어 있다. 자바스크립트에서 허용되는 문은 다음과 같다.

  1. 제어문: 미리 엄격하게 정의된 형식의 문 들이다. ex) if, if else, switch, for, for in, while, do while, case, label, continue, break, return, var, try, catch

  2. 공문(빈문): 아무것도 없는 문도 문으로 인정한다. while 문은 while (식) 문 ; 와 같은 형태인데 아래와 같은 구문에서 문이 비어있는 공문이기 때문에 에러가 발생하지 않는다.

    while (i--) // 식은 있지만, 문은 없는 공문이다. 하지만 에러 발생x
  3. 식문: 자바스크립트의 가장 큰 특징. 식을 문으로 인정한다. 식은 값이므로 값문 이라고 해도 무방함. 따라서 아래와 같은 식문이 전부 정상적으로 사용이 가능하다.

    3;          // 식문
    'aaa';      // 식문
    func();     // 식문
    {a: 'test'};// 식문
    3+5;        // 식문

문 자체는 단일한 하나의 문장이다. 하지만, 중괄호로 묶어 마치 하나의 문처럼 사용할 수 있는데 이를 중문이라고 한다. (단 한줄로 된 상대적인 개념은 단문이라고 한다.)

다양한 제어문에서 문이 올 자리는 단문 또는 중문이 올 수 있다. if 문의 경우 if (식) 문; 의 형태인데, 아래와 같이 단문도 올 수 있고 중문 또한 올 수 있다.

if (3) 5; // 5는 값식 ==> 식문 으로 성립!

if (1) {  // if(값식) 중문 {식문; 식문;} 으로 성립!
  5;
  6;
}

자바나 c계열에서는 중문을 만들면 변수의 스코프도 동시에 생성되어 지역변수 개념이 생긴다. JS 에서는 변수란 해시맵의 KEY 이므로 함수를 통한 스코프객체를 만들어야 변수를 쓸 수 있다. 따라서 단지 중문을 생성한 것만으로는 지역 스코프가 생성되지 않는다!!!

Last updated