진취적 삶
08 제어문 본문
제어문은 조건에 따라 코드 블록을 실행하거나 반복, 실행할때 사용한다.
제어문을 사용하면 코드의 실행 흐름을 인위적으로 제어
코드의 실행 순서가 변경되는것은 직관적인 코드의 흐름을 혼란스럽게 함
나중에 살펴볼 forEach ,map, filter,reduce 같은 고차 함수를 통해 복잡성 해결
8.1 블록문
js는 블록문을 하나의 실행 단위로 취급한다.
블록문은 언제나 문의 종료를 의미하는 자체 종결성을 갖는다 .
8.2 조건문
8.2.1 if ..else 문
var num = 2;
var kind;
if (num > 0) {
kind = "양수";
} else if (num < 0) {
kind = "음수";
} else {
kind = "영";
}
console.log(kind);
var x = 2;
var result;
if (x % 2) {
result = "홀수";
} else {
result = "짝수";
}
console.log(result);
이것을 삼항 연산자로 바꾸면
result = x%2 ? '홀수':'짝수'
console.log(result);
8.2.2 switch 문
다양한 상황(case) 에 따라 실행할 코드 블록을 결정하는데 사용한다.
var month = 11;
var monthName;
switch (month) {
case 1:
monthName = "Jan";
case 2:
monthName = "fab";
case 3:
monthName = "mar";
case 4:
monthName = "apr";
case 5:
monthName = "may";
case 6:
monthName = "jun";
case 7:
monthName = "jul";
case 8:
monthName = "aug";
case 9:
monthName = "sep";
case 10:
monthName = "oct";
case 11:
monthName = "nov";
case 12:
monthName = "dec";
default:
monthName = "invalid month";
}
console.log(monthName);
해당 코드를 실행하면 nov 대신 invalid month 가 출력된다. 이는 switch 문이 끝날때까지 이후의 모든 case 문과 defalut 문을 실행했기 때문이다 . 이것을 폴스루 라고 한다.
이것을 해결할려면 case 문에 마지막에 break 를 넣어주면된다.
var month = 11;
var monthName;
switch (month) {
case 1:
monthName = "Jan";
break;
case 2:
monthName = "fab";
break;
case 3:
monthName = "mar";
break;
case 4:
monthName = "apr";
break;
case 5:
monthName = "may";
break;
case 6:
monthName = "jun";
break;
case 7:
monthName = "jul";
break;
case 8:
monthName = "aug";
break;
case 9:
monthName = "sep";
break;
case 10:
monthName = "oct";
break;
case 11:
monthName = "nov";
break;
case 12:
monthName = "dec";
break;
default:
monthName = "invalid month";
}
console.log(monthName);
default 문의 실행이 종료되면 switch 문을 빠져나가기 때문에 break 를 생략해주는게 일반적
폴스루를 통해 윤년 쉽게 구하기
var year = 2023;
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");
}
8.3 반복문
8.3.1 for 문
조건식이 거짓으로 평가될때까지 코드 블록을 반복 실행한다.
for(var i =0; i<2; i++ ) {
console.log(i);
}
//0
//1
8.3.2. while문
주어진 조건식의 평가 결과가 참이면 코드블록을 계속해서 반복 실행한다.
for문은 반복횟수가 명확할때 , while문은 반복회수가 불명확할때 사용한다.
var count =0;
while(count<3) {
console.log(count)
count++
}
8.3.3 do …while문
코드 블록을 먼저 실행하고 조건식을 평가한다.
무조건 한번 이상 실행된다 .
var count =0;
do {
console.log(count)
count++;
}while(count<3)
8.4 break 문
레이블 문 ,반복문 (for, for …in ,for … of ,while , do.. while) 또는 switch 문의 코드 블록을 탈출한다.
레이블 문 ,반복문 ,switch 문의 코드 블록외 break 문을 사용하면 문법에러가 발생한다 .
레이블 문 : 식별자가 붙은 문
foo : {
console.log(1);
break foo;
console.log(2);
}
console.log('done')
중첩된 for 문의 내부 for문에서 break 문을 실행하면 내부 for문을 탈출하여 외부 for문으로 진입한다.
내부 for문이 아닌 외부 for 문을 탈출하려면 label 문을 사용한다.
label 문은 for 외부로 탈출할때 유용하지만 그 밖의 경우에는 일반적으로 권장하지 않음
가독성이 나빠진다.
outer: for (var i = 0; i < 3; i++) {
for (var j = 0; j < 3; j++) {
if (i + j == 3) break outer;
console.log(`inner [${i}, ${j}]`);
}
}
console.log("done");
break 문으로 불필요한 반복을 회피할수 있다.
var string = "hello world ";
var search = "l";
var index;
for (var i = 0; i < string.length; i++) {
if (string[i] === search) {
index = i;
break;
}
}
console.log(index);
8.5 continue 문
반복문의 코드 블록 실행을 현 지점에서 중단하고 반복문의 증감식으로 실행 흐름을 이동시킨다.
var string = "hello world";
var search = "l";
var count = 0;
for (var i = 0; i < string.length; i++) {
if (string[i] !== search) continue;
count++;
}
console.log(count);
'개발 도서 > 자바스크립트 deepdive' 카테고리의 다른 글
06 데이터 타입 (0) | 2023.07.11 |
---|---|
07 연산자 (0) | 2023.07.11 |
09 타입 변환과 단축 평가 (0) | 2023.07.11 |
10 객체 리터럴 (0) | 2023.07.11 |
02 자바스크립트란? (0) | 2023.07.10 |