[딥다이브] 8장 제어문

1. 블록문

- 0 개이상의 문을 중괄호로 묶은것
- 코드블록 or 블록 이라고 부름
- 자체 종결성을 가지기 때문에 세미콜론 안붙임

    //블록문
    {
        var yelim = 27;
    }

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

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

2. 조건문

- 평가 결과에 따라 블록의 실행을 결정
- 불리언 값으로 평가
  • if..else문

    //if..else문
    if(조건식){
        // 조건식이 함이면 이 코드블록이 실행
    } else {
        //조건식이 거짓이면 이 코드블록이 실행
    }
    
    //조건식 추가
    if(조건식1){
        //조건식1이 참이면 이 코드블록이 실행
    } else if (조건식2){
        //조건식2가 참이면 이 코드블록 실행
    } else {
        //조건식1가 조건식2가 모두 거짓이면 이 코드 블록이 실행된다.
    }
    • else if 문과 else 문은 옵션이란것을 알아두자.
      (else if 문은 여러번 사용가능하다.)

      
      var yelim = 27;
      var adult;
      
      //if 문
      if (yelim > 20) {
          adult = '어른';
      }
      
      console.log(adult);//어른
      
      //if...else 문
      
      if(yelim > 20) {
          adult = '어른';
      } else {
          adult = '어른아님';
      }
      console.log(adult);//어른
      
      //if..else if 문
      if(yelim > 20){
         adult = '어른'; 
      } else if (20 > yelim > 11){
          adult = '청소년'
      } else{
          adult = '아기'
      }
      console.log(adult);//어른
    • 코드내의 문이 하나면 중괄호 생략 가능

      var yelim = 27;
      var growUp
      
      if (yelim > 20)  growUp = '어른'
      else if (20 > yelim > 11)  growUp = '청소년'
      else (11 > yelim)  growUp = '아기'
      
      console.log(growUp);// 어른
    • 대부분 if...else 문은 삼항 조건 연산자로 바꿔쓸수 있음.
      (불린이 등장!)

      var yelim = 45;
      var diet;
      
      if(yelim % 5){
          diet = '더 노력'
      } else{
          diet = '성공'
      }
      consol.log(diet);
      
      |
      |
      |var diet = yelim % 5 ? '더 노력' : '성공';
      consol.log(diet);
    • 세가지의 경우

      var yelim = 45;
      var diet = yelim ? ( yelim > 43 ? '더 노력' : '성공') : '유지';
      
      console.log(diet);
      //더 노력
      // 기분이 좋진 않네  ^^..
  • switch 문

    • if..else 와는 달리 다양한 상황에 따라 실행할 코드 블록을 결정할떄 사용한다.

      //월을 영어로 변환
      var month = 11;
      var monthName;
      
      switch (month) {
          case 1: monthName = 'January';
              break;
          case 2: monthName = 'February';
              break;
          case 3: monthName = 'March';
              break;
          case 4: monthName = 'April';
              break;
          case 5: monthName = 'May';
              break;
          case 6: monthName = 'June';
              break;
          case 7: monthName = 'July';
              break;
          case 8: monthName = 'August';
              break;
          case 9: monthName = 'September';
              break;
          case 10: monthName = 'October';
              break;
          case 11: monthName = 'November';
              break;
          case 12: monthName = 'December';
              break;
          default : monthName = 'Invalid month';
      }
      
      console.log(monthName);
    • break; 를 안쓰면 마지막 문장이 송출되는 '폴스루' 현상이 일어난다.

    • '폴스루' 현상을 이용한 윤년계산법

      var year = 2000;
       //2000년은 윤년으로 2월 29일
      var month = 2;
      var days = 0;
      
      switch (month) {
          case 1: case 3: case 5: case 7: case 8: case 10: case 12:
              days = 31;
              break;
          case 4: case 6: case 9: case 11:
              days = 30;break;
          case 2:
              days = ((year % 4 ==== 0 && year % 100 ! == 0) || (year % 400 === 0)) ? 29 : 28;
              break;
          default:
              console.log("Invalid month");
      }
      
      console.log(days); //29
    • 왠만하면 if..else 문을 이용하자, 하지만 조건이 너무 많아서 switch 문의 가독성이 더 좋다면 switch 문을 사용하도록

3. 반복문

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

  • for문, while문, do..while문

  • 대체가능메서드

    forEach //배열순회
    for...in //객체의 프로퍼티 열거
    for...of // 이터러블 순회
  • for 문

    • 조건문이 거짓일떄까지 코드블록 반복실행

      for ( var yellim = 27; yelim < 30; yelim++ ) {
          console.log(yelim);
      }
      // yelim은 27/ 30이하까지 증감식 yelim++ 가 실행된다,yelim++ 은 선할당 후증가라는 사실을 기억
    • 역으로 이용

      for ( var yelim = 27; yelim >= 20; yelim-- ) {
          console.log(yelim);
      }
    • for 문대 for문 중첩사용시

      var h = 'hamburger';
      var s = 'snack';
      
      for ( var h = 450; h <= 500; h++ ) {
          for( var s = 300; s <= 500; s++){
              if ( h + s === 800) console.log(`[${h}, ${s}]`);
          }
      }
  • while 문

    • 조건문의 평가결과가 참일시 반복실행, 반복횟수가 불명확할때 주로 사용

      var yelim = 45;
      
      while ( yelim >= 42){
          console.log(yelim); 
          yelim--;
      }
    • 조건이 참이면 무한루프가 됨, 탈출하기 위해선 if문으로 탈출조건을 만들고, break 문으로 코드블록 탈출!

      var yelim = 45;
      
      //무한루프
      while (true){
          console.log(yelim);
          yelim--;
          //yelim 이 42면 코드블록을 탈출한다.
          if(yelim === 42) break;
      }
  • do..while 문

    • 코드블록 먼저실행, 조건식 평가,
      반복실행 x

      ```js
      var yelim = 46;
      
      do{
          console.log(yelim);
          yelim--;
      } while ( yelim < 42);
      ```

##4. break 문

  • 불필요한 반복을 회피할수 있어 유용

  • 레이블문, 반복문, switch 문의 코드 블록 외에 사용시 SyntaxError(문법에러)가 발생

    //yelim 이라는 식별자가 붙은 레이블 블록문
    yelim: {
        console.log(1);
        break yelim; //탈출
        console.log(2);
    }
    
    console.log('getFreedom!');//1, getFreedom!
    • 중첩된 for문의 내부 for문에서 break문 실행시 외부 for문으로 진입(외부 for문에서 탈출시 레이블문 이용)

      var name = 'yelim';
      var search = 'l';
      var index;
      
      for(var i = 0; i < name.length; i++){
          if(name[i] === search){
              index = i;
              break;
          }
      }
      
      console.log(index);//20
      
      // String, prototype, indexOf 메서드를 사용해도 동일
      
      console.log(name.indexOf(search)); //2
  1. continue 문
  • 반복문의 코드블록을 현시점 중단, 반복문의 증감식으로 실행흐름을 이동
var name = 'yelim';
var search = 'l';
var count = 0;

for (var i = 0; i < name.length; i++) {
    // 'l'이 아니면 증가시키지 않는다.
    if(name[i] !== search) continue; count++;
}

console.log(count);//3

// String, prototype, match 메서드를 사용해도 동일
  • continue 를 사용함으로써 if 문 밖에도 코드를 작성할수 있음

좋은 웹페이지 즐겨찾기