관리 메뉴

진취적 삶

08 제어문 본문

개발 도서/자바스크립트 deepdive

08 제어문

hp0724 2023. 7. 11. 12:44

제어문은 조건에 따라 코드 블록을 실행하거나 반복, 실행할때 사용한다.

제어문을 사용하면 코드의 실행 흐름을 인위적으로 제어

코드의 실행 순서가 변경되는것은 직관적인 코드의 흐름을 혼란스럽게 함

나중에 살펴볼 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