Java시작과 문법

조건 분기 — if와 switch

`if`와 `switch`를 언제 선택하는지, 현대 Java의 switch expression이 어떻게 fall-through 버그와 보일러플레이트를 없애는지 정리합니다.

마지막 수정 2026년 3월 27일

기본 패턴

java
// 단순 조건
if (score >= 60) {
    System.out.println("합격");
}

// if-else if-else — 범위 조건
if (score >= 90) {
    grade = "A";
} else if (score >= 80) {
    grade = "B";
} else {
    grade = "C";
}

// 삼항 연산자 — 한 줄 조건 대입
String result = score >= 60 ? "합격" : "불합격";

// switch expression — 값 종류가 명확히 갈릴 때
String label = switch (status) {
    case ACTIVE   -> "활성";
    case INACTIVE -> "비활성";
    case PENDING  -> "대기";
};

설명

if vs switch — 분기 구조를 선택하는 기준

if는 조건을 직접 평가하므로 범위 비교(score >= 90), 복합 조건(a && b), 타입 검사처럼 값의 종류가 아닌 조건식이 중심일 때 적합합니다.

switch는 하나의 값이 여러 케이스 중 하나에 정확히 매핑될 때 더 읽기 좋습니다. 분기 수가 늘수록 if-else if 체인보다 의도가 명확하게 드러납니다.

java
// if가 맞는 경우 — 범위 조건
if (temperature < 0) {
    System.out.println("빙점 이하");
} else if (temperature < 20) {
    System.out.println("서늘함");
} else {
    System.out.println("따뜻함");
}

// switch가 맞는 경우 — 값이 명확히 갈림
switch (dayOfWeek) {
    case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> System.out.println("평일");
    case SATURDAY, SUNDAY -> System.out.println("주말");
}

삼항 연산자 — 단순 분기를 한 줄로

조건 ? 참일 때 값 : 거짓일 때 값 형태로 단순 조건 대입을 한 줄로 표현합니다. if-else보다 짧지만, 중첩하면 읽기 어렵습니다.

java
int age = 20;

// ✅ 단순 대입에 적합
String label = age >= 18 ? "성인" : "미성년자";

// ✅ 메서드 인수에 인라인으로
System.out.println("등급: " + (score >= 90 ? "A" : score >= 80 ? "B" : "C"));

// ❌ 중첩 삼항 — 읽기 어려움, if-else if로 풀기
String grade = score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : "F";

전통 switch의 문제 — fall-through와 장황함

전통 switchcase 블록에 break가 없으면 다음 케이스로 실행이 넘어가는 fall-through가 발생합니다. 의도하지 않은 fall-through는 찾기 어려운 버그가 됩니다. 또 break를 매 케이스마다 써야 해서 코드가 장황해집니다.

java
// ❌ 전통 switch — break 누락 시 fall-through 버그
switch (value) {
    case 1:
        System.out.println("one");
        // break 빠짐 — 아래 case 2도 실행됨
    case 2:
        System.out.println("two");
        break;
}

switch expression — 값을 반환하고 fall-through가 없는 분기

Java 14+의 switch expression은 두 문제를 모두 해결합니다. -> 화살표 문법은 fall-through가 없고, 분기 결과를 변수에 직접 할당할 수 있습니다. 컴파일러가 모든 케이스를 처리했는지 확인해 주므로 enum과 함께 쓸 때 특히 강력합니다.

java
// ✅ switch expression — fall-through 없음, 값 반환
String grade = switch (score / 10) {
    case 10, 9 -> "A";
    case 8     -> "B";
    case 7     -> "C";
    default    -> "F";
};

// 여러 줄이 필요하면 yield로 값 반환
String message = switch (status) {
    case ACTIVE -> "활성 상태입니다.";
    case PENDING -> {
        log.info("대기 중");
        yield "처리 대기 중입니다.";
    }
    default -> "알 수 없는 상태";
};

빠른 정리

상황적합한 선택
범위·복합 조건 (>=, &&)if
단순 조건 한 줄 대입삼항 연산자 (? :)
값이 명확히 갈리는 분기 (3개 이상)switch
분기 결과를 변수에 대입switch expression (->)
enum의 모든 케이스 처리 강제switch expression + enum
여러 케이스가 같은 결과case A, B, C ->

주의할 점

전통 switch에서 break를 빠뜨리면 다음 case로 fall-through가 일어납니다. 신규 코드에서는 arrow syntax(->)를 써서 이 문제를 원천 차단하세요.

java
// ❌ 전통 switch — break 누락 시 의도치 않은 fall-through
switch (value) {
    case 1:
        System.out.println("one"); // break 없으면 아래도 실행
    case 2:
        System.out.println("two");
}
// 출력: "one" 그리고 "two"

// ✅ arrow syntax — fall-through 없음, 의도가 명확
switch (value) {
    case 1 -> System.out.println("one");
    case 2 -> System.out.println("two");
}

참고 링크

2 sources