모던 자바스크립트 Deep Dive: 8장 제어문

08장 제어문

  • 조건에 따라 코드 블록을 실행하거나 반복 실행할 때 사용함
  • 제어문을 사용하면 위에서 아래 방향으로 순차적으로 실행되는 코드의 실행 흐름을 인위적으로 제어할 수 있다.

블록문

  • 0개 이상의 문을 중괄호로 묶은 것으로 코드 블록 또는 블록이라고 부른다.
  • 자바스크립트는 블록문을 하나의 실행 단위로 취급
  • 단독으로 사용할 수 있지만 일반적으로 제어문이나 함수를 정의할때 사용
  • 블록문은 언제나 문의 종료를 의미하는 자체 종결성을 갖기 때문에 블록문의 끝에는 세미콜론을 붙이지 않는다!
//블록문
{
 var foo = 0; 
}

//제어문
var x = 1;
if(x<10){
  x++;
}

//함수 선언문
function sum(a,b){
  return a + b;
}

조건문

  • 주어진 조건식의 평가 결과에 따라 코드 블록의 실행을 결정
  • 조건식은 불리언 값으로 평가될 수 있는 표현식

if ... else문

  • 주어진 조건식의 평가 결과에 따라 실행할 코드 블록을 결정한다.
  • 조건식의 평가 결과가 true일 경우 if문의 코드 블록이 실행되고, false일 경우 else 문의 코드 블록이 실행됨
if(조건식){
 //조건식이 참이면 이 코드 블록이 실행됨 
}
else{
  //조건식이 거짓이면 이 코드 블록이 실행됨
}
  • 조건식을 추가해 조건에 따라 실행될 코드 블록을 늘리고 싶으면 else if문을 사용
if(조건식1){
 //조건식 1이 참이면 이 코드 블록이 실행됨 
}
else if(조건식2){
 //조건식 2가 참이면 이 코드 블록이 실행됨 & else if는 2번 이상 사용할 수 있다
}
else{
  //조건식1,2가 거짓이면 이 코드 블록이 실행됨
}
  • 만약 코드 블록 내의 문이 하나뿐이라면 중괄호 생략 가능
  • 대부분의 if...else문은 삼항 조건 연산자로 바꿔 쓸 수 있음
var x = 2;
var result;

if(x%2){
  result = '홀수';
}else{
  result = '짝수';
}
//위의 if...else문과 같은 의미
result = x%2 ? '홀수' : '짝수';

switch문

  • 주어진 표현식을 평가하여 그 값과 일치하는 표현식을 갖는 case문으로 실행 흐름을 옮김
  • case 문은 상황을 의미하는 표현식을 지정하고 콜론으로 마치며 그 뒤에 실행할 문들을 위치시킴
  • switch 문의 표현식과 일치하는 case 문이 없다면 실행 순서는 default 문으로 이동.
    • default문은 선택사항으로 사용하지 않아도 됨
switch(표현식){
  case 표현식1:
    //표현식과 표현식 1이 일치하면 실행될 문
    break;
  case 표현식2:
    //표현식과 표현식 2가 일치하면 실행될 문
    break;
  default :
    // 표현식과 일치하는 case문이 없을 때 실행될 문
}
  • 만약 if...else 문으로 해결할 수 있다면 되도록 switch문 보단 if...else문을 사용하자.
  • 하지만 가독성이 더 좋다면 switch문을 사용하도록 하자

반복문

  • 조건식의 평가 결과가 참인 경우 코드 블록을 실행해 조건식을 다시 평가하여 여전히 참인 경우 코드 블록을 다시 실행하며 조건식이 거짓일 때까지 반복됨

for문

  • 조건식이 거짓으로 평가될 때까지 코드 블록을 반복 실행
for(변수 선언문 또는 할당문; 조건식; 증감식){
 //조건이 참일 경우 반복 실행될 문 
}

for(var i = 0; i<2; i++){
  console.log(i);
}
  • for 문의 변수 선언문,조건식,증감식은 모두 옵션으로 반드시 사용할 필요는 없지만 어떤 식도 선언하지 않으면 무한루프가 된다. (코드 블록을 무한히 반복 실행하는 문)
for(;;){...}
  • for 문 내에 for 문을 중첩해 사용할 수 있다.
for(var i = 0; i<2; i++){
  for(var j = 0; j<2; j++){
    console.log(i,j);
  }
}

while문

  • 주어진 조건식의 평가 결과가 참이면 코드 블록을 계속해서 반복 실행
  • for문은 반복 횟수가 명확할 때 주로 사용, while문은 반복 횟수가 불명확할 때 주로 사용
  • while문은 조건문의 평가 결과가 거짓이 되면 코드 블록을 실행하지 않고 종료
  • 만약 조건식의 평가 결과가 불리언 값이 아니면 불리언 값으로 강제 변환하여 논리적 참, 거짓을 구별한다!
var count = 0;

while(count < 5){
  console.log(count);
  count++;
}
  • 조건식의 평가 결과가 언제나 참이면 무한루프가 됨
while(true){...}
  • 무한 루프에서 탈출하기 위해선 코드 블록 내에 if 문으로 탈출 조건을 만들고 break 문으로 코드 블록을 탈출
var count = 0;

while(true){
  console.log(count);
  count++;
  if(count === 10)break; //count가 10이면 코드 블록을 탈출
}

do...while문

  • 코드 블록을 먼저 실행하고 조건식을 평가한다. 즉, 무조건 한번 이상은 실행하고 싶을 때 이용한다.
var count = 0;

do{
  console.log(count); // 0 1 2 3 4
  count++;
}while(count < 5);

break문

  • 레이블 문, 반복문(for,for...in,for...of,while,do...while) 또는 switch문의 코드 블록을 탈출
  • 위의 코드 블록 외에 break문을 사용하게 되면 SyntaxError가 발생한다.
if(true){
	break; //SyntaxError
}
  • 레이블 문 : 식별자가 붙은 문
  • 프로그램의 실행 순서를 제어하는데 사용 됨
  • switch 문의 case 문과 default 문도 레이블 문
  • 레이블 문을 탈출하려면 break 문에 레이블 식별자를 지정
//foo라는 레이블 식별자가 붙은 레이블 문
foo : console.log('foo');

bar : {
  console.log(1);
  break bar; //bar 레이블 블록문을 탈출
  console.log(2);
}
  • 만약 중첩된 for 문일때 내부 for문에서 break 문을 실행하면 내부 for문을 탈출해 외부 for 문으로 진입한다.
  • 내부 for 문이 아닌 외부 for문을 탈출하고 싶을 때 레이블 문을 사용할 수 있다.
outer : for(let i = 0; i < 3; i++){
  for(let j = 0; j < 3; j++){
    if(i+j = 5) break outer;
  }
}
  • 레이블 문이 중첩된 for 문 외부로 탈출할 때는 유용하지만 그 밖의 경우엔 프로그램의 흐름이 복잡해져 가독성이 나빠지고 오류를 발생시킬 가능성이 높아져 권장하지는 않는다.

continue문

  • 반복문의 코드 블록 실행을 현 지점에서 중단하고 반복문의 증감식으로 실행 흐름을 이동시킴
  • break 문처럼 반복문을 탈출하진 않음
var string = "Hello world.";
var search = "w";
var count = 0;

for(var i = 0; i < string.length; i++){
 if(string[i] !== search)continue; // 'w'가 아니면 현 시점의 실행은 중단하고 반복문의 증감식으로 이동
  count++;// continue문이 실행되면 이 문은 실행되지 않는다.
}