제어문(control flow statement)
: 조건에 따라 코드 블록 실행 or 반복실행할때 사용-블록문
: 0개 이상의 문을 {}(중괄호)로 묶은 것 (= 코드블록, 블록)
✔ 끝에 세미콜론 안붙인다(자체 종결성 가짐)
// 블록문
{
var foo = 10;
}
// 제어문
var x = 1;
if (x < 10) {
x++;
}
// 함수 선언문
function sum(a, b) {
return a + b;
}
조건문
: 주어진 조건식의 평가결과에 따라(t / f) 코드블록의 실행 결정함.if(조건식1) {
// 조건식이 참일 경우 해당 코드 블록이 실행된다.
}
else if(조건식2) {
// 조건식2가 참일 경우 해당 코드 블록이 실행된다.
}
else {
// 조건식이 거짓일 경우 해당 코드 블록이 실행된다.
}
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문은 안됨~!)switch문
: 주어진 표현식 평가해서 그 값과 일치하는 표현식 갖는 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
반복문
: 조건식 평가 결과 참인 경우 코드블록 실행함. => 거짓일때까지 계~속 반복 for( let i = 1; i <= 6 ; i++){
for(let j = 1; j <= 6; j++){
if(i + j == 6){
console.log(`[${i}, ${j}]`);
}
}
}
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문
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);
-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;
}
}
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++;}
}