0%

제어문

오늘 한 것

제어문

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

조건문

조건문은 조건식(Boolean)을 판단하여 참 거짓에 따라 실행할 코드 블록을 정한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 대표적인 if else 문이다.
if (조건식) {
// 조건식이 참이면 이 코드 블록이 실행된다.
} else {
// 조건식이 거짓이면 이 코드 블록이 실행된다.
}

// else if 문이 새로 등장한다. '아님 말고' 느낌으로 써준다.
if (조건식1) {
// 조건식1이 참이면 이 코드 블록이 실행된다.
} else if (조건식2) {
// 조건식2가 참이면 이 코드 블록이 실행된다.
} else {
// 조건식1과 조건식2가 모두 거짓이면 이 코드 블록이 실행된다.
}

if… else… else if…를 배웠다면 아래의 switch 문도 알아보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
switch (표현식) {
case 표현식1:
switch 문의 표현식과 표현식1이 일치하면 실행될 문;
// break를 사용하지 않으면 표현식이 참이더라도 맨밑으로 내려간다. 의도한게 아니라면 까먹지 말자.
break;

case 표현식2:
switch 문의 표현식과 표현식2가 일치하면 실행될 문;
break;

//default는 필수가 아닌 선택, 어차피 마지막이라 break가 필요 없다.
default:
switch 문의 표현식과 일치하는 표현식을 갖는 case 문이 없을 때 실행될 문;
}

반복문

반복문(loop statement)은 조건식의 평가 결과가 참인 동안 코드 블록을 계속 반복 실행한다. 반복 과정에서 매번 조건식을 다시 평가히여 참인 경우 코드 블록을 반복, 거짓일 경우 끝이 난다.

for

아래 예시는 i가 0 부터 시작하여 2 보다 작은 동안 i를 매번 1씩 증가시키면서 코드블록을 반복하는 반복문이다.

1
2
3
for (var i = 0; i < 2; i++) {
console.log(i);
}

결과는 아래와 같다. i가 0일 때, 1일 때 두번 실행됐다.

1
2
0
1

for 문을 무한루프로 활용하는 법이다.

1
2
// 무한루프
for (;;) { ... }

while

1
2
3
4
5
6
7
var count = 0;

// count가 3보다 작을 때까지 코드 블록을 계속 반복 실행한다.
while (count < 3) {
console.log(count); // 0 1 2
count++;
}

탈출하는 경우 break를 사용한다!

1
2
3
4
5
6
7
8
9
var count = 0;

// while의 무한루프
while (true) {
console.log(count);
count++;
// count가 3이면 코드 블록을 탈출한다.
if (count === 3) break;
} // 0 1 2

do…while

do를 먼저 실행한 후 반복문으로 들어간다. 그냥 while문과 실행 순서가 다른 것을 이용할 수 있다.

1
2
3
4
5
6
7
var count = 0;

// while과 다른 점은 조건식 비교 이전에 do를 실행한 후 조건식과 비교한다.
do {
console.log(count);
count++;
} while (count < 3); // 0 1 2

break와 continue

break

  • break문은 엄밀하게 말하면 코드 블록 탈출이 아닌, 레이블 문, 반복문(for, for…in, for…of, while, do…while) 또는 switch 문의 코드 블록을 탈출하는 것이다.
  • 레이블 문, 반복문, switch 문의 코드 블록 외에 break 문을 사용하면 SyntaxError(문법 에러)가 발생한다.
1
2
3
if (true) {
break; // Uncaught SyntaxError: Illegal break statement
}
  • break문은 레이블 문에서도 쓰인다.
  • 레이블 문은 프로그램의 실행 순서를 제어하는 데 사용한다. 사실 switch 문의 case 문과 default 문도 레이블 문이다. 레이블 문을 탈출하려면 break 문에 레이블 식별자를 지정한다.
1
2
// foo라는 레이블 식별자가 붙은 레이블 문
foo: console.log("foo");
1
2
3
4
5
6
7
8
9
10
// outer라는 식별자가 붙은 레이블 for 문
outer: for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
// i + j === 3이면 outer라는 식별자가 붙은 레이블 for 문을 탈출한다.
if (i + j === 3) break outer;
console.log(`inner [${i}, ${j}]`);
}
}

console.log("Done!");
  • break outer를 만나면 outer 레이블이 달린 for 문을 탈출한다.
  • 레이블 문은 중첩된 for 문 외부로 탈출할 때 유용하지만 그 밖의 경우에는권장하지 않는다.
  • 레이블 문을 사용하면 프로그램의 흐름이 복잡해져서 가독성이 나빠지고 오류를 발생시킬 가능성이 높아지기 때문이다.

continue

  • continue 문은 반복문의 코드 블록 실행을 현 지점에서 중단하고 반복문의 증감식으로 실행 흐름을 이동시킨다.
  • 반복문을 아예 탈출하는 break문과는 다르다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 문자열에서 특정 문자의 개수를 세는 예

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

오늘 느낀 것

  • 제어문은 C나 JAVA 때도 했지만 오래전이라 다시 복기하는 심정으로 정리했다.
  • 다시 공부해보니 새롭게 알게 된 사실도 있고 애매하게 알고있던 부분도 명쾌해졌다.

Nyong’s GitHub