제어문은 조건에 따라 코드 블록을 실행하거나 반복 실행할 때 사용한다.

<aside> <img src="/icons/chat_gray.svg" alt="/icons/chat_gray.svg" width="40px" /> 제어문을 사용하면 코드의 실행 흐름을 인위적으로 제어할 수 있지만, 직관적인 코드의 흐름을 이해하기 어렵게 만들어 가독성을 해친다는 단점이 있다. forEach, map, filter, reduce 같은 고차함수를 사용한 함수형 프로그래밍 기법에서는 제어문의 사용을 억제하여 복잡성을 해결하고자 노력한다.

</aside>

8.1 블록문 (block statement/compound statement)

블록문은 0개 이상의 문을 중괄호로 묶은 것으로, 코드 블록 또는 블록이라고도 부른다.

자바스크립트는 블록문을 하나의 실행 단위로 취급하며, 단독으로 사용할 수 있으나 제어문이나 함수를 정의할 때 사용하는 것이 일반적이다.

블록문은 언제나 자체 종결성을 갖기 때문에 블록문의 끝에는 세미콜론을 붙이지 않는다.

8.2 조건문 (conditional statement)

조건문으 주어진 조건식의 평가 결과에 따라 코드 블록의 실행을 결정한다.

조건식은 boolean 값으로 평가될 수 있는 표현식이다.

자바스크립트는 if … else 문과 switch 문으로 두 가지 조건문을 제공한다.

8.2.1 if .. else 문

주어진 조건식의 평가 결과에 따라 실행할 코드 블록을 결정한다.

조건식을 추가하여 조건에 따라 실행될 코드 블록을 늘리고 싶으면 else if 문을 사용한다.

else if 문과 else 문은 옵션이며, else if문은 여러 번 사용할 수 있다.

코드 블록 내의 문이 하나뿐이라면 중괄호를 생략할 수 있다.

if ( 조건식1 ) {
	  // 조건식1이 참이면 이 코드 블록이 실행된다.
} else if ( 조건식2 ) {
	  // 조건식2가 거짓이면 이 코드 블록이 실행된다.
} else {
	  // 조건식1,2 모두 거짓이면 이 코드 블록이 실행된다.
}

만약 if 문의 조건식이 boolean 값이 아닌 값으로 평가되면 자바스크립트 엔진에 의해 암묵적으로 boolean 값으로 강제 변환되어 실행할 코드 블록을 결정한다.

8.2.2 switch 문

주어진 표현식을 평가하여 그 값과 일치하는 표현식을 갖는 case 문으로 실행 흐름을 옮기고, 만약 일치하는 case 문이 없다면 실행 순서는 default 문(옵션)으로 이동한다.

switch 문의 표현식은 boolean 값보다는 문자열이나 숫자 값인 경우가 많다. → 논리적 참, 거짓보다는 다양한 상황에 따라 실행할 코드 블록을 결정할 때 사용한다.

fall through를 방지하기 위해 break 문을 사용하기도 한다.

default 문은 switch 문의 맨 마지막에 위치하므로 별도로 break 문이 필요 없다는 점에서 일반적으로 break 문을 생략한다.

switch (( 표현식 )) {
	case 표현식1: ( 실행문1 )
		break;
	case 표현식2: ( 실행문2 )
		break;
	default: ( 실행문3 )
}

fall through를 활용해 여러 개의 case 문을 하나의 조건으로 사용할 수도 있다.

switch (( 표현식 )) {
	case 표현식1: 표현식2: 표현식3:
		( 실행문a )
		break;
	default: ( 실행문b )
}

8.3 반복문 (loop statement)

조건식의 평가 결과가 참인 경우 코드 블록을 실행하는 과정을 조건식이 거짓일 때까지 반복한다.

자바스크립트는 세 가지 반복문인 for 문, while 문, do … while 문을 제공한다.

<aside> <img src="/icons/chat_gray.svg" alt="/icons/chat_gray.svg" width="40px" /> 이외에도 자바스크립트는 forEach 메서드(배열을 순회할 때 사용), for … in 문(객체의 프로퍼티를 열거할 때 사용), for … of 문(ES6에서 도입된 iterable을 순회할 때 사용)과 같이 반복문을 대체할 수 있는 다양한 기능을 제공한다.

</aside>

8.3.1 for 문