[ javascript ] 공식문서 읽고 열흘 벼락치기: Control Flow and Error Handling

김쟇연·2025년 9월 4일
post-thumbnail

📝 Day 03 – 제어 흐름과 오류 처리 (Control Flow and Error Handling)

공식 문서 해당 챕터 바로가기 ! 🐱


들어가며

코드를 짜다 보면 그냥 위에서 아래로 줄줄 실행하는 걸로는 안 된다. 상황에 따라 코드 길목을 갈라버려야 하고, 예기치 못한 사고에는 에러를 두들겨 패서 제압해야 한다.

JavaScript는 이런 경우를 위해 다양한 제어 흐름(control flow) 문과 에러 처리(error handling) 문을 제공한다. 아래에서 주요 개념과 예시를 살펴보자.




블록 문 (Block Statement)

중괄호 {} 안에 여러 문을 묶어 하나의 단위로 만든다.

{
  statement1;
  statement2;
}

예를 들어, while 같은 반복문과 함께 사용된다.

while (x < 10) {
  x++;
}

👉 블록 문 안에서 var로 선언한 변수는 블록 밖에서도 그대로 보인다. 반면 letconst는 블록 안에서만 유효하다.

var x = 1;
{
  var x = 2;
}
console.log(x); // 2



조건문 (Conditional Statements)

if...else

조건식이 참일 때와 거짓일 때 실행할 문을 나눈다.

if (condition) {
  statement1;
} else {
  statement2;
}

조건이 여러 개라면 else if로 이어 붙인다.

if (score >= 90) {
  grade = "A";
} else if (score >= 80) {
  grade = "B";
} else {
  grade = "C";
}

👉 항상 중괄호 {}를 써서 가독성과 안전성을 지키는 게 좋다.

Falsy 값

조건문에서 거짓으로 평가되는 값은 다음과 같다:

  • false
  • undefined
  • null
  • 0
  • NaN
  • "" (빈 문자열)

그 외의 값은 모두 참으로 평가된다. 특히 객체는 비어 있어도 무조건 참이다.

if (new Boolean(false)) {
  console.log("실행됨!"); // true 취급
}

switch

여러 경우의 수를 다룰 때 switch 문을 사용한다.

switch (fruit) {
  case "Apple":
    console.log("사과는 500원");
    break;
  case "Banana":
    console.log("바나나는 300원");
    break;
  default:
    console.log("해당 과일 없음");
}

👉 break를 쓰지 않으면 다음 case까지 실행이 이어진다. 필요한 경우 의도적으로 break를 빼서 “fall-through”를 활용할 수 있다.


break

break는 반복문이나 switch 문에서 흐름을 즉시 종료할 때 사용한다.

for (let i = 0; i < 5; i++) {
  if (i === 3) break;
  console.log(i);
}
// 0, 1, 2까지만 출력
  • 반복문: 가장 안쪽의 루프를 빠져나온다.
  • switch: 해당 case 실행 후 바로 블록을 빠져나온다.

👉 label과 함께 쓰면 특정 외부 루프만 골라 끊을 수도 있다.

outer: for (let i = 0; i < 3; i++) {
  for (let j = 0; j < 3; j++) {
    if (j === 1) break outer;
    console.log(i, j);
  }
}
// (0,0)만 출력하고 외부 루프까지 종료



예외 처리 명령문 (Exception Handling Statements)

throw

예외를 직접 발생시킬 수 있다.

throw "문자열 오류";
throw new Error("잘못된 입력");

try...catch

문제가 생길 수 있는 부분을 try로 감싸고, 에러가 발생하면 catch가 처리한다.

try {
  riskyOperation();
} catch (err) {
  console.error(err);
}

finally

예외 발생 여부와 상관없이 반드시 실행되는 부분이다. 파일 닫기, 리소스 정리 등에 자주 쓰인다.

try {
  openMyFile();
} catch (e) {
  console.error(e);
} finally {
  closeMyFile(); // 무조건 실행
}

👉 finallyreturn이나 throw보다 우선한다. 따라서 기존 반환값이나 예외를 덮어쓸 수 있으니 주의해야 한다.




Error 객체 활용

Error 객체를 활용하면 에러를 더 체계적으로 다룰 수 있다.

try {
  throw new Error("문제가 발생했습니다");
} catch (e) {
  console.error(e.name);    // Error
  console.error(e.message); // 문제가 발생했습니다
}

👉 단순히 "문자열"을 던지는 것보다 Error 객체를 쓰는 편이 유지보수에 유리하다.




마무리

  • 블록 문 {}으로 여러 문을 묶는다.
  • 조건문if...elseswitch로 흐름을 제어한다.
  • Falsy 값false, 0, "", null, undefined, NaN 여섯 가지뿐이다.
  • throw + try...catch + finally로 예외를 처리한다.
  • Error 객체를 활용하면 더 명확하고 관리하기 쉬운 에러 핸들링이 가능하다.

👉 쉽게 말하면, 조건문은 갈림길 지도, 예외 처리는 안전망이라고 보면 된다.

profile
그래도 해야지 어떡해

0개의 댓글