조건에 따라 실행 흐름을 나누는 조건문은 자바에서도 if와 switch 두 가지다. 기본 문법은 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에는 없는 기능이다.
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를 넣어야 한다.
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보다 약간의 비용이 더 든다. 보통은 신경 쓸 정도가 아니지만, "문자열 비교가 공짜는 아니다"라는 감각은 가져둘 만하다.
'language > java' 카테고리의 다른 글
| [자바프로그래밍] 02. 변수·자료형·연산자 (0) | 2026.07.13 |
|---|---|
| [자바프로그래밍] 01. 자바 특징과 역사 (0) | 2026.07.01 |