기본 패턴
// 단순 조건
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 체인보다 의도가 명확하게 드러납니다.
// 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보다 짧지만, 중첩하면 읽기 어렵습니다.
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와 장황함
전통 switch는 case 블록에 break가 없으면 다음 케이스로 실행이 넘어가는 fall-through가 발생합니다. 의도하지 않은 fall-through는 찾기 어려운 버그가 됩니다. 또 break를 매 케이스마다 써야 해서 코드가 장황해집니다.
// ❌ 전통 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과 함께 쓸 때 특히 강력합니다.
// ✅ 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(->)를 써서 이 문제를 원천 차단하세요.
// ❌ 전통 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