제어문(control flow statement)은 조건에 따라 코드 블록을 실행(조건문)하거나 반복 실행(반복문)할 때 사용한다.
8.1 블록문
블록문(block statement/compound statement)은 0개 이상의 문을 중괄호로 묶은 것으로, 코드 블록 또는 블록이라고 부르기도 한다.
블록문은 하나의 실행 단위로 취급된다.
// [예제 08-01]
// 블록문
{
var foo = 10;
}
// 제어문
{
var x = 1;
if (x < 10){
x++;
}
// 함수 선언문
function sum(a,b){
return a + b
}
8.2 조건문
조건문(conditional statement)은 주어진 조건식(conditional expression)의 평가 결과에 따라 코드 블록(블록문)의 실행을 결정한다. 조건식은 불리언 값으로 평가될 수 있는 표현식이다.
8.2.1 if … else문
if… else문은 주어진 조건식(불리언 값으로 평가될 수 있는 표현식)의 평가 결과, 즉 논리적 참 또는 거짓에 따라 실행할 코드 블록을 결정한다.
if (조건식) {
// 조건식이 참이면 이 코드 블록이 실행된다.
} else {
// 조건식이 거짓이면 이 코드 블록이 실행된다.
}
// [예제 08-02]
var num = 2;
var kind;
// if문
if (num > 0) {
kind = '양수'; // 음수를 구별할 수 없다.
}
console.log(kind); // 양수
// if...else 문
if (num > 0) {
kind = '양수';
} else {
kind = '음수'; // 0은 음수가 아니다.
}
console.log(kind); // 양수
// if...else if 문
if (num > 0) {
kind = '양수';
} else if (num < 0) {
kind = '음수';
} else {
kind = '영';
}
console.log(kind); // 양수
8.2.2 switch 문
switch문은 주어진 표현식을 평가하여 그 값과 일치하는 표현식을 갖는 case 문으로 실행 흐름을 옮긴다.
switch (표현식) {
case 표현식1:
// switch 문의 표현식과 표현식1이 일치하면 실행될 문;
break;
case 표현식2:
// switch 문의 표현식과 표현식2가 일치하면 실행될 문;
break;
default:
// switch 문의 표현식과 일치하는 표현식이 없을 때 실행될 문;
}
// 동일한 조건을 실행할 때
switch (표현식) {
case 표현식1:
case 표현식2:
// switch 문의 표현식과 표현식1 또는 표현식2가 일치하면 실행될 문;
break;
default:
// switch 문의 표현식과 일치하는 표현식이 없을 때 실행될 문;
}
8.3 반복문
반복문은 조건식의 평가 결과가 참인 경우 코드 블록을 실행한다. 그 후 조건식을 다시 평가하여 여전히 참인 경우 코드 블록을 다시 실행한다.
8.3.1 for문
for문은 조건식이 거짓으로 평가될 때까지 코드 블록을 반복 실행한다.
for (변수 선언문 또는 할당문; 조건식; 증감식) {
조건식이 참인 경우 반복 실행될 문;
}
// [예제 08-10]
for (let i = 0; i < 2; i++) {
console.log(i);
}
/*
0
1
*/
// 무한루프
for (;;) {
// 반복 실행될 문;
}
8.3.2 while 문
while 문은 주어진 조건식의 평가 결과가 참이면 코드 블록을 계속해서 반복 실행한다.
for 문은 반복 횟수가 명확할 때 주로 사용하고, while 문은 반복 횟수가 불명확할 때 주로 사용한다.
var count = 0;
// count가 3보다 작을 때까지 코드 블록을 계속 반복 실행한다.
while (count < 3) {
console.log(count); // 0 1 2
count++;
}
// 무한루프
while (true) {
// 반복 실행될 문;
}
8.3.3 do…while 문
do…while 문은 코드 블록을 먼저 실행하고 조건식을 평가한다. 따라서 코드 블록은 무조건 한 번 이상 실행된다.
// [예제 08-17]
// count가 3보다 작을 때까지 코드 블록을 계속 반복 실행한다.
do {
console.log(count); // 0 1 2
count++;
} while (count < 3);
8.4 break 문
break 문은 코드 블록을 탈출한다. 정확히는 레이블 문 또는 반복문의 코드 블록을 탈출한다.
// [예제 08-21]
// outer라는 식별자가 붙은 레이블 for문
outer: for (let i = 0; i < 3; i++) {
for (let j = 0; j < 3; j++) {
// i + j === 3이면 outer라는 식별자가 붙은 레이블 for문을 탈출한다.
if (i + j === 3) {
break outer;
}
console.log(`inner [${i}, ${j}]`);
}
}
console.log('Done');
8.5 continue 문
continue 문은 반복문의 코드 블록 실행을 현 지점에서 중단하고 증감식으로 실행 흐름을 이동시킨다.
// [예제 08-23]
var string = "Hello world.";
var search = 'l';
var count = 0;
// 문자열은 유사 배열이므로 for 문으로 순회할 수 있다.
for (var i = 0; i < string.length; i++) {
// 'l'이 아니면 현 지점에서 실행을 중단하고 반복문의 증감식으로 이동한다.
if (string[i] !== search) continue;
count++; // continue문이 실행되면 이 문은 실행되지 않는다.
}
console.log(count); // 3
// 참고로 String.prototype.match 메서드를 사용해도 같은 동작을 한다.
const regexp = new RegExp(search, 'g');
console.log(string.match(regexp).length); // 3