Lesson 5

조건문(if/switch)

4 min Views 1

if/else, switch, 삼항 연산자의 올바른 사용법과 패턴을 배우고, 조건문을 더 읽기 좋게 작성하는 리팩터링 기법을 익힌다.

조건문 — 프로그램이 판단하는 방법

조건문은 특정 조건에 따라 실행할 코드를 분기시킵니다. 단순히 문법을 외우는 것보다, 어떤 상황에 어떤 패턴을 쓰는 것이 더 읽기 좋은가를 이해하는 것이 중요합니다.

if / else if / else

// 기본 구조
if (조건식) {
  // 조건이 true일 때
} else if (다른조건) {
  // 두 번째 조건이 true일 때
} else {
  // 모두 false일 때
}

// 실제 예시
function classify(score) {
  if (score >= 90) {
    return "A";
  } else if (score >= 80) {
    return "B";
  } else if (score >= 70) {
    return "C";
  } else if (score >= 60) {
    return "D";
  } else {
    return "F";
  }
}

classify(85); // "B"

중괄호 생략 — 하지 마세요

// 한 줄이라도 중괄호 생략은 위험
if (isLoggedIn) doSomething(); // 괜찮아 보이지만...

// 나중에 한 줄 추가하면 버그 발생
if (isLoggedIn)
  doSomething();
  logAction(); // 이 줄은 if와 무관하게 항상 실행됨!

// 항상 중괄호를 쓰세요
if (isLoggedIn) {
  doSomething();
  logAction();
}

switch 문

하나의 값을 여러 케이스와 비교할 때 사용합니다. if/else if 체인보다 의도가 명확합니다.

const day = "Monday";

switch (day) {
  case "Monday":
  case "Tuesday":
  case "Wednesday":
  case "Thursday":
  case "Friday":
    console.log("평일");
    break;
  case "Saturday":
  case "Sunday":
    console.log("주말");
    break;
  default:
    console.log("알 수 없는 요일");
}

// break를 빠뜨리면 fall-through 발생 (버그 주의!)
switch (x) {
  case 1:
    console.log("one");
    // break 없음!
  case 2:
    console.log("two"); // x가 1이어도 실행됨!
    break;
}

switch vs if/else 선택 기준

// switch가 적합: 하나의 값을 여러 고정값과 비교
switch (status) {
  case "pending": ...
  case "active": ...
  case "closed": ...
}

// if/else가 적합: 범위 비교, 복합 조건
if (score >= 90 && isBonus) { ... }
if (age > 18 || hasPermission) { ... }

조건문 리팩터링 패턴

1. 조기 반환(Early Return)으로 중첩 줄이기

// 나쁜 예: 중첩이 깊어질수록 읽기 어려움
function processOrder(user, order) {
  if (user) {
    if (user.isActive) {
      if (order) {
        if (order.amount > 0) {
          // 실제 로직
          return "처리 완료";
        }
      }
    }
  }
  return "오류";
}

// 좋은 예: 조기 반환으로 중첩 제거
function processOrder(user, order) {
  if (!user) return "유저 없음";
  if (!user.isActive) return "비활성 유저";
  if (!order) return "주문 없음";
  if (order.amount <= 0) return "금액 오류";

  // 조건 통과, 실제 로직만 남음
  return "처리 완료";
}

2. 객체 리터럴로 switch 대체

// switch 방식
function getIcon(status) {
  switch (status) {
    case "success": return "✅";
    case "error":   return "❌";
    case "warning": return "⚠️";
    default:        return "ℹ️";
  }
}

// 객체 리터럴 방식 (더 간결)
function getIcon(status) {
  const icons = {
    success: "✅",
    error:   "❌",
    warning: "⚠️",
  };
  return icons[status] ?? "ℹ️";
}

3. 삼항 연산자 올바른 사용

// 좋은 사용: 단순한 이진 선택
const label = isLoggedIn ? "로그아웃" : "로그인";
const className = isActive ? "active" : "inactive";

// 나쁜 사용: 복잡한 로직은 if/else로
// 읽기 어렵고 디버깅 힘듦
const result = a > b
  ? a > c ? a : c
  : b > c ? b : c;

// 함수로 분리하거나 if/else 사용
function maxOfThree(a, b, c) {
  if (a > b && a > c) return a;
  if (b > c) return b;
  return c;
}

Nullish 패턴 — 조건문 없이 안전하게

// 조건문 없이 null 처리
const port = config.port ?? 3000;
const name = user?.profile?.displayName ?? "익명";

// 조건문으로 쓰면
const port2 = config.port !== null && config.port !== undefined
  ? config.port
  : 3000;
// → ?? 한 줄이 훨씬 명확

실전 예시: 로그인 상태에 따른 UI 분기

function renderHeader(user) {
  // 1단계: 로그인 여부
  if (!user) {
    return renderGuestHeader();
  }

  // 2단계: 역할별 분기
  const roleActions = {
    admin: () => renderAdminHeader(user),
    manager: () => renderManagerHeader(user),
    member: () => renderMemberHeader(user),
  };

  const renderFn = roleActions[user.role];
  if (!renderFn) {
    return renderMemberHeader(user); // 알 수 없는 역할 → 기본 처리
  }

  return renderFn();
}
조건문 작성의 원칙: 중첩은 최대 2단계까지만. 그 이상이면 함수 분리나 조기 반환을 고려하세요. 조건문이 길어질수록 테스트하기도, 읽기도 어려워집니다.

관련 검색어  ·  자바스크립트 조건문, if else 사용법, switch 문법, 조기 반환 패턴, 삼항 연산자 활용, 조건문 리팩터링

채용정보
공지사항
인사이트
MY