제어 흐름은 문장이 실행되는 순서를 결정합니다. Java는 조건문(, ), 반복문(, , ), 분기 문(, , )을 제공하며, switch 표현식 같은 현대적 개선도 함께 제공합니다.
ifswitchforwhiledo-whilebreakcontinuereturnif (score >= 90) {
grade = "A";
} else if (score >= 80) {
grade = "B";
} else {
grade = "F";
}
// 삼항 연산자 — 값에 대한 간결한 if/else
String status = (age >= 18) ? "adult" : "minor";
switch (day) {
case 1: name = "Mon"; break; // ⚠️ break 필요 — 아니면 FALL THROUGH 됨
case 2: name = "Tue"; break;
default: name = "Unknown";
}
전통적인 switch는 각 case 뒤에 break가 필요합니다 — 잊으면 fall-through(실행이 다음 case로 계속됨)가 발생하는데, 이는 악명 높은 버그의 원천입니다.
// 화살표 문법: fall-through 없음, 값을 반환, 더 간결함
String name = switch (day) {
case 1 -> "Mon";
case 2 -> "Tue";
case 6, 7 -> "Weekend"; // 여러 레이블
default -> "Unknown";
};
현대적 switch 표현식은 fall-through를 제거하고, 값을 반환할 수 있으며, 더 깔끔합니다 — 새 코드에서 선호됩니다.
// for — 반복 횟수를 알 때
for (int i = 0; i < 10; i++) { ... }
// 향상된 for-each — 컬렉션/배열을 순회
for (String item : items) { ... }
// while — 각 반복 전에 조건을 검사
while (condition) { ... }
// do-while — 본문이 최소 한 번 실행됨 (조건은 나중에 검사)
do { ... } while (condition);
for (int i = 0; i < 10; i++) {
if (i == 5) break; // 루프를 완전히 빠져나감
if (i % 2 == 0) continue; // 다음 반복으로 건너뜀
}
return result; // 메서드를 빠져나감
// 레이블이 붙은 break — 중첩 루프를 빠져나감
outer:
for (...) {
for (...) {
if (found) break outer; // 두 루프 모두를 빠져나감
}
}
break는 루프를 빠져나가고, continue는 다음 반복으로 건너뛰며, return은 메서드를 빠져나가고, 레이블이 붙은 break는 중첩 루프를 한 번에 빠져나갈 수 있습니다.
제어 흐름은 모든 프로그램에서 논리와 결정을 표현하는 기본 메커니즘입니다 — 사소하지 않은 모든 메서드가 이를 사용합니다.
구조와 그 미묘한 점을 이해하는 것이 필수적입니다. switch fall-through 함정(과 더 안전한 현대적 switch 표현식), while과 do-while의 차이(최소 한 번 실행), 깔끔한 컬렉션 순회를 위한 for-each, 그리고 분기 문(중첩 루프를 위한 레이블 break 포함)입니다.
이들을 숙달하고 — 현대적이고 오류가 적은 형태(switch 표현식, for-each)를 선호하는 것 — 은 올바르고 읽기 쉬운 Java 로직을 작성하고 흔한 제어 흐름 버그를 피하는 데 근본적입니다.