[js 딥다이브] 8. 제어문 정리

미아·2022년 10월 30일
0

js 딥다이브

목록 보기
5/10
  • 제어문(control flow statement) : 조건에 따라 코드 블록 실행 or 반복실행할때 사용
    -> 일반적인 코드 : 위 -> 아래
    -> 제어문 사용시 : 코드 실행 흐름 인위적 제거 가능!

8.1 블록문

-블록문 : 0개 이상의 문을 {}(중괄호)로 묶은 것 (= 코드블록, 블록)
✔ 끝에 세미콜론 안붙인다(자체 종결성 가짐)

// 블록문
{
  var foo = 10;
}

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

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

8.2 조건문

  • 조건문 : 주어진 조건식의 평가결과에 따라(t / f) 코드블록의 실행 결정함.

8.2.1 if...else문

if(조건식1) {
	// 조건식이 참일 경우 해당 코드 블록이 실행된다.
} 
else if(조건식2) {
	// 조건식2가 참일 경우 해당 코드 블록이 실행된다.
}
else {
	// 조건식이 거짓일 경우 해당 코드 블록이 실행된다.
}
  • 만약 조건식이 boolean 값 아닐경우? 강제 변환되어 실행
  • 코드 블록 내의 문이 하나뿐이라면 중괄호를 생략할 수 있다.
let x = 2;
let result;

if(x%2) { 2%2는 0이고, 0은 false로 암묵적 강제 변환된다.
	result = '홀수';
} else {
	result = '짝수';
}

let result = x % 2 ? '홀수' : '짝수'; //요렇게 바꾸기 가능
  • 경우의 수가 세가지라면~

    let num = 2;
    let kind = num ? (num > 0 ? '양수': '음수') : '영'; 
    //(num) true면 (num > 0 ? '양수': '음수') 
    //false면 '영'
  • 삼항 조건 연산자 => 변수 할당 가능(if...else문은 안됨~!)

8.2.1 switch문

  • switch문 : 주어진 표현식 평가해서 그 값과 일치하는 표현식 갖는 case문으로 실행 흐름 옮긴다.
    💥 case 뒤에는 !!! : 붙는거 !!! 잊지 말자!!!
  • 일치하는 표현식 없으면 => default 문으로 이동(선택사항임)
    💥 case 문에 해당하는 문의 마지막에 break문 사용안하면 => 풀스루(fall through) 됨(case문의 표현식과 일치 안하더라도 끝까지 이동)
// (월을 영어로 변환한다!)
 let g_month = +prompt("월을 입력하세요!"); //입력받고 -> 월 영어로 변환
    let m_name;

    switch (g_month){
        case 1: m_name = "Jan";
        break;
        case 2: m_name = "Feb";
        break;
        case 3: m_name = "Mar";
        break;
        case 4: m_name = "Apr";
        break;
        case 5: m_name = "May";
        break;
        case 6: m_name = "Jun";
        break;
        case 7: m_name = "Jly";
        break;
        case 8: m_name = "Aug";
        break;
        case 9: m_name = "Sep";
        break;
        case 10: m_name = "Oct";
        break;
        case 11: m_name = "Nov";
        break;
        case 12: m_name = "Dec";
        break;

        default: m_name = "invalid name";
      

    }
    console.log(m_name);
  • 일부러 폴스루 활용하는 경우
let year = 2000; // 2000년은 윤년으로 2월이 29일이다.
    let month = 2;
    let 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:
        // 윤년(29일까지 있는) 계산 알고리즘
        // 1. 연도가 4로 나누어떨어지는 해(2000, 2004, 2008, 2012, 2016, 2020...)는 윤년이다.
        // 2. 연도가 4로 나누어떨어지더라도 연도가 100으로 나누어떨어지는 해(2000, 2100, 2200...)는 평년이다.
        // 3. 연도가 400으로 나누어떨어지는 해(2000, 2400, 2800...)는 윤년이다.
        days = ((year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0)) ? 29 : 28;
        break;
    default:
        console.log('Invalid month');
    }

        console.log(days); // 29

8.3 반복문

  • 반복문 : 조건식 평가 결과 참인 경우 코드블록 실행함. => 거짓일때까지 계~속 반복

8.3.1 for문

  • 중첩 for문
        for( let i = 1; i <= 6 ; i++){
            for(let j = 1; j <= 6; j++){
                if(i + j == 6){
                    console.log(`[${i}, ${j}]`);
                }
            }
        }
  • 결과

8.3.2 while문

  • while문은 주어진 조건식 평가 결과 참이면 => 반복 실행
    💥 for문은 반복 횟수가 명확할 때 주로 사용하고 while문은 반복횟수가 불명확할 때 주로 사용한다.
   let i = 0;
        while( i < 3){
            console.log(i);
            i++;
        }

        // while(true){
        //     ...무한루프
        // }

        //무한루프 탈출 위해서는
        let count = 0; 
        
        while(true){
            console.log(count);
            count++;

        if(count === 3){
            break;
            //0,1,2
        }
        }
  • 무한루프 탈출하려면 => break문

8.3.2 do...while문

  • while문과 똑같지만 , 조건문이 false여도 무조건 한번은 실행
 let i = 0;

    do {
        console.log(i) //0하나만 찍음
    }
    while(i != 0) 
    
let count = 0;

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

8.4 break문

-break문 : 레이블문(식별자 붙은 문), 반복문, switch 문의 코드 블록 탈출
(이외에 사용시 SyntaxError)

// foo 라는 식별자가 붙은 레이블 문
foo: {
	console.log(1);
    break foo;
    console.log(2);
}

console.log('Done');//1, Done 출력
// outer라는 식별자가 붙은 레이블 for 문
outer : for(let i=0; i<3; i++) {
	for(let j=0; j<3; j++) {
    	if(i+j === 3) break outer;
    }
}
  • 일반적으로 label문은 for문 탈출시 유용하지만, 가독성때문에 권장은 안함

8.5 continue문

  • continue문 : 반복문의 코드 블록 실행을 현 시점에서 중단하고, 반복문의 증감식으로 실행흐름 이동시킴.
let string = "Hello World";
let search = "l";
let count = 0;

for(let i=0; i<string.length; i++) {
	if(string[i] !== search) continue;
    count++; // continue 문이 실행되면 해당 문은 실행되지 않는다.
    // 애는 string[i] !== search일때만 실행.
}

console.log(count); // 3 , string[i] !== search의 갯수

// String.prototype.match 메서드를 사용해도 같은 동작을 한다.
const regexp = new RegExp(search, 'g');
console.log(string.match(regexp).length); // 3
  • 위 예제는 다음 코드와 동일하게 동작
for(let i=0; i<string.length; i++) {
	if(string[i] === search) {
    count++;}
}
profile
새로운 것은 언제나 재밌어 🎶

0개의 댓글