JS DeepDive 08장 제어문

한칙촉·2024년 1월 22일

블록문

: 0개 이상의 문을 중괄호로 묶은 것

  • 자바스크립트는 블록문을 하나의 실행 단위로 취급
  • 언제나 문의 종료를 의미하는 자체 종결성을 가짐
    → 블록문의 끝에는 세미콜론을 붙이지 X
// 블록문
{
  var foo = 10;
}

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

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

조건문

: 주어진 조건식의 평가 결과에 따라 코드 블록(블록문)의 실행을 결정
(조건식 = 불리언 값으로 평가될 수 있는 표현식)

if... else 문

if (조건식1) {
  // 조건식1이 참이면 이 코드 블록이 실행됨
} else if (조건식2) {
  // 조건식2가 참이면 이 코드 블록이 실행됨
} else {
  // 조건식1과 조건식2가 모두 거짓이면 이 코드 블록이 실행됨
}
  • 조건식이 불리언 값이 아닌 값으로 평가되면 자바스크립트 엔진에 의해 암묵적으로 불리언 값으로 강제 변환되어 실행할 코드 블록을 결정
  • if문과 else 문은 2번 이상 사용할 수 없지만 else if 문은 여러 번 사용 가능
  • 코드 블록 내의 문이 하나뿐이라면 중괄호 생략 가능
  • 대부분의 if... else 문은 삼항 조건 연산자로 바꿀 수 있음

var x = 2;

// 0은 false로 취급됨
var result = x % 2 ? '홀수' : '짝수';
console.log(result); // 짝수
  • 삼항 조건 연산자는 값으로 평가되는 표현식을 만듦
  • if... else 문은 표현식이 아닌 문이므로 변후에 할당할 수 없음



switch 문

: 주어진 표현식을 평가하여 그 값과 일치하는 표현식을 갖는 case 문으로 실행 흐름을 옮김

switch(표현식) {
  case 표현식1:
    switch 문의 표현식과 표현식1이 일치하면 실행;
    break;
  case 표현식2:
    switch 문의 표현식과 표현식2이 일치하면 실행;
    break;
  default:
    switch 문의 표현식과 일치하는 case문이 없을 때 실행;
}
  • 표현식과 일치하는 case 문이 없다면 실행 순서는 default 문으로 이동
  • switch 문은 논리적 참, 거짓보다는 다양한 상황(case)에 따라 실행할 코드 블록을 결정
  • 폴스루 = case 문으로 실행 흐름이 이동하여 문을 실행한 후 switch 문을 탈출하지 않고 switch 문이 끝날 때 까지 이후의 모든 case 문과 defualt 문을 실행
    → 코드 블록에서 탈출하는 역할을 하는 break 문이 필요
  • default 문에는 break 문을 생략하는 것이 일반적 (switch 문의 맨 마지막에 위치)

반복문

: 조건식의 평가 결과가 참인 경우 코드 블록을 실행, 그 후 조건식을 다시 평가하여 여전히 참인 경우 코드 블록을 다시 실행
(조건식이 거짓일 때까지 반복)

for 문

: 조건식이 거짓으로 평가될 때까지 코드 블록을 반복 실행

for(변수 선언문 또는 할당문; 조건식; 증감식;) {
  조건식이 참인 경우 반복 실행될 문
}
  • 변수 선언문은 단 한 번만 실행됨
  • 조건식의 평가 결과가 true면 증감문이 아닌 코드 블록으로 실행 흐름 이동

for( ;; ) {
   ... 
}
  • 어떤 식도 선언하지 않으면 무한루프가 됨

while 문

: 주어진 조건식의 평가 결과가 참이면 코드 블록을 계속해서 반복 실행

  • 반복 횟수가 불명확할 때 주로 사용
  • 조건식의 평가 결과가 불리언 값이 아니면 불리언 값으로 강제 변환하여 논리적 참, 거짓을 구별
  • 무한루프에서 탈출하기 위해서는 코드 블록 내에 if 문으로 탈출 조건을 만들고 break 문으로 코드 블록을 탈출

do... while 문

: 코드 블록을 먼저 실행하고 조건식을 평가
→ 코드 블록은 무조건 한 번 이상 실행됨


break 문

: 레이블 문, 반복문(for, for... in, for... of, while, do... while), 또는 switch 문의 코드 블록을 탈출

// foo라는 레이블 식별자가 붙은 레이블 문
foo : console.log('foo');
foo : {
  console.log(1);
  break foo; // foo 레이블 블록문을 탈출
  console.log(2);
}
console.log('Done!');

/* 출력
1
Done!
*/

continue 문

: 반복문의 코드 블록 실행을 현 지점에서 중단하고 반복문의 증감식으로 실행 흐름을 이동시킴 (반복문 탈출 X)

var string = 'Hello World';
var search = 'l';
var count = 0;

for (var i=0; i < string.length; i++) {
  // 'l'이 아니면 카운트를 증가시키지 않음
  if (string[i] === search) {
    count++;
    // code
    // code
    // code
  }
}

for (var i=0; i < string.length; i++) {
  if (string[i] !== search) continue;
    
  count++;
  // code
  // code
  // code
}

// String.prototype.match 메서드를 사용해도 같은 동작
const regexp = new RegExp(search, 'g');
console.log(string.match(regexp).length);
  • if 문 내에서 실행해야 할 코드가 길다면 continue 문을 사용하는 편이 가독성이 더 좋음
    → if 문 밖에 코드 작성이 가능
profile
빙글빙글돌아가는..

0개의 댓글