while과 do-while 반복문
반복 횟수를 미리 모를 때는 종료 조건을 중심으로 반복문을 설계합니다.
while은 시작 전에 조건을 검사해 한 번도 실행되지 않을 수 있습니다.
do-while은 본문을 먼저 실행하므로 최소 한 번의 동작이 필요한 입력 메뉴에 적합합니다.
두 문법 모두 상태가 실제로 종료 조건 쪽으로 변하지 않으면 무한 반복이 됩니다.
이 절에서는 진입 조건, 상태 변화, 종료 보장을 한 묶음으로 확인합니다.
while은 진입 전에 조건을 검사한다
입력이 이미 완료 상태라면 본문을 건너뛰는 것이 자연스러운 작업에 사용합니다.
조건에 쓰는 값이 어디에서 갱신되는지 바로 찾을 수 있어야 합니다.
do-while은 첫 실행을 보장한다
사용자에게 메뉴를 한 번 보여 준 뒤 계속할지 묻는 흐름처럼 첫 동작이 조건보다 앞설 때 적합합니다.
단순히 while을 대체하는 문법은 아닙니다.
메뉴나 재시도 입력처럼 본문을 최소 한 번 보여 줘야 하는 문제에서 do-while이 자연스럽습니다. 같은 동작을 while로 옮기면 첫 실행을 위해 초기값이나 중복 호출이 필요해지는지 비교해 봅니다.
public class ConditionalLoops {
public static void main(String[] args) {
int remaining = 3;
while (remaining > 0) {
System.out.println("remaining=" + remaining);
remaining--;
}
int menuShows = 0;
do {
menuShows++;
System.out.println("show menu");
} while (menuShows < 1);
}
}출력에는 조건 검사가 첫 실행 뒤에 있다는 사실이 드러납니다. 시작값이 이미 종료 조건을 만족하도록 바꿔도 한 줄이 출력된다면 do-while의 진입 보장을 제대로 관찰한 것입니다.
remaining=3
remaining=2
remaining=1
show menuwhile은 진입 전에 멈출 수 있고 do-while은 조건이 거짓이어도 본문을 한 번 실행합니다.
루프 상태는 종료 방향으로 움직여야 한다
카운터 감소, 입력 갱신, 큐 소비 가운데 무엇이 조건을 거짓으로 만드는지 설명합니다.
외부 상태만 기다리는 반복은 타임아웃과 중단 정책도 필요합니다.
반복이 끝나려면 조건에 쓰인 상태가 매번 종료 쪽으로 움직여야 합니다. 증가식을 지우거나 반대 방향으로 바꿔 무한 반복이 생기는 이유를 확인하되, 실습할 때는 최대 반복 횟수 같은 안전장치를 두세요.
int value = 0;
while (value > 0) {
System.out.println("never");
}
do {
System.out.println("once");
} while (value > 0);
// while (remaining > 0) { } // remaining이 바뀌지 않아 무한 반복조건 기반 반복은 시작 가능 여부와 매 반복의 상태 변화, 최종 탈출 경로가 모두 설명되어야 합니다.