language/java

[자바프로그래밍] 03. 조건문 (if·switch)

렁치 2026. 7. 26. 13:11

조건에 따라 실행 흐름을 나누는 조건문은 자바에서도 ifswitch 두 가지다. 기본 문법은 C와 거의 같지만, 자바의 switch문자열 비교가 된다는 결정적 차이가 있다.


1. if 문

// if ~ else
if (score >= 90)
    System.out.println("합격");
else
    System.out.println("불합격");

조건이 참이면 if 블록을, 거짓이면 else 블록을 실행한다. 자바는 boolean만 조건으로 받으므로, if (n)처럼 정수를 바로 조건에 넣을 수 없고 반드시 if (n != 0)처럼 비교식을 써야 한다. C에서 정수를 그대로 조건에 넣던 습관이 자바에선 막혀서, 처음엔 답답했지만 의도가 분명해지는 효과가 있었다.

여러 조건을 순서대로 검사할 땐 else if를 잇는다.

if (score >= 90)      grade = 'A';
else if (score >= 80) grade = 'B';
else if (score >= 70) grade = 'C';
else                  grade = 'F';

큰(좁은) 조건부터 위에 두는 게 핵심이다. score >= 70을 맨 위에 두면 90점도 거기서 걸려 C가 되어버린다.


2. switch 문

하나의 값을 여러 case와 비교해 분기한다.

자바 switch의 case 값 제약
case에는 문자·정수·문자열 리터럴(JDK 1.7+)만 올 수 있다. 변수·수식·실수·논리값은 쓸 수 없다. 특히 문자열 switch가 되는 건 자바의 편리한 점으로, C에는 없는 기능이다.
String s = "예";
switch (s) {
    case "예":    ...; break;
    case "아니요": ...; break;
    default:      ...;
}

문자열을 switch로 분기할 수 있다는 게 C와 비교돼 편했다. C에선 문자열 비교를 strcmp로 일일이 해야 했는데, 자바는 case에 바로 문자열을 쓸 수 있었다.

여러 case가 같은 동작을 공유하게 묶을 수도 있다.

switch (month) {
    case 3: case 4: case 5:
        System.out.println("봄"); break;
    case 6: case 7: case 8:
        System.out.println("여름"); break;
    default:
        System.out.println("그 외");
}
break를 빼면 다음 case로 흐른다 (fall-through)
case 끝에 break가 없으면 아래 case들이 break를 만날 때까지 줄줄이 실행된다. 위 계절 예처럼 일부러 묶을 때를 빼면 반드시 break를 넣어야 한다.

실습으로 익히기

점수를 10으로 나눈 값을 case로 쓰면, 범위 조건을 switch로 깔끔하게 표현할 수 있다.

int iCase = iScore / 10;          // 95 → 9, 100 → 10
switch (iCase) {
    case 10: bScholar = true;     // break 없음! → case 9로 흐름
    case 9:  grade = 'A'; break;  // 100점은 A + 장학금 둘 다 처리
    case 8:  grade = 'B'; break;
    case 7:  grade = 'C'; break;
    default: grade = 'F';
}

여기서 case 10에 일부러 break를 빼서 case 9로 흘려보내는 fall-through를 활용했다. 100점은 "장학금 표시 + 학점 A"를 한 번에 처리하는 영리한 방식이다. 평소엔 함정인 fall-through를 의도적으로 쓴 예라, 같은 기능도 알고 쓰면 도구가 된다는 걸 느꼈다.


오늘 느낀 점

  • 자바 switch가 문자열을 받는다는 게 C 대비 가장 큰 편의였다. strcmp 없이 case에 문자열을 바로 쓰니 코드가 훨씬 읽기 쉬웠다.
  • boolean만 조건으로 받는 엄격함이, 처음엔 불편했지만 if (n) 같은 모호함을 없앤다는 점에서 의도가 분명한 코드를 만들게 했다.
  • fall-through를 함정이 아니라 도구로 쓴 점수 예제가 인상적이었다. 위험한 기능도 정확히 알면 활용처가 있다는 걸 배웠다.

한 걸음 더

  • 점수처럼 연속된 범위를 switch로 다루려면 score / 10 같은 변환이 필요하다. switch는 "값이 정확히 일치하는가"만 보기 때문에, 90~99를 한 번에 묶으려면 9라는 대표값으로 바꿔야 하는 것이다. 범위 조건은 if가 자연스럽고, 딱 떨어지는 값 분기는 switch가 깔끔하다는 원칙이 여기서도 통한다.
  • 최신 자바(14+)에는 화살표(->)를 쓰는 새로운 switch 문법(switch expression)이 있다. fall-through 실수를 막고 값을 바로 반환할 수 있어 더 안전하다. 다만 기본기는 전통적인 case ~ break 형태로 익히는 게 순서다.
  • 문자열 switch가 내부적으로는 문자열의 해시값을 비교한 뒤 실제 값을 한 번 더 확인하는 방식으로 동작한다. 즉 겉으론 간단해 보여도 정수 switch보다 약간의 비용이 더 든다. 보통은 신경 쓸 정도가 아니지만, "문자열 비교가 공짜는 아니다"라는 감각은 가져둘 만하다.