Menu

자바 while 반복문: 문법, do-while, 흔한 함정

자바 while 반복문 설명 - 조건을 먼저 검사하는 while, 최소 한 번은 실행되는 do-while, 센티넬 값까지 입력 읽기, break와 continue, 그리고 무한 루프 피하기.

이 페이지에는 실행 가능한 에디터가 있습니다 - 편집하고 실행하면 결과를 바로 볼 수 있습니다.

카운터가 없을 때

for 반복문은 미리 설정해 두는 카운터를 중심으로 만들어집니다. 하지만 깔끔한 횟수가 없는 반복도 많습니다. 파일이 끝날 때까지 줄을 계속 읽기, 맞을 때까지 비밀번호를 계속 묻기, 1이 될 때까지 숫자를 계속 반으로 나누기 같은 경우입니다. 이런 경우에는 while 반복문이 자연스럽게 어울립니다 - 조건이 참인 동안 그냥 반복할 뿐입니다.

while 반복문은 맨 처음을 포함해 매번 실행 전에 조건을 검사합니다. 조건이 처음부터 거짓이면 본문은 한 번도 실행되지 않습니다.

조건 count > 0이 먼저 검사되고, 참이면 본문이 실행된 다음, 다시 위로 돌아가 또 검사합니다. count-- 줄이 결국 조건을 거짓으로 만드는 부분입니다 - 이를 빼면 반복문은 영원히 돕니다.

while 반복문의 구조

이미 알고 있는 세 부분으로 된 for 반복문과 비교해 보세요. while 반복문은 그 세 가지 일을 분리합니다. 설정은 반복문 전에 하고, 조건은 괄호 안에 들어가며, 갱신은 본문 안에 위치합니다.

int i = 0;              // 초기화 - 반복문 전
while (i < 5) {         // 조건 - 매번 검사됨
    System.out.println(i);
    i++;                // 갱신 - 직접 기억해야 함
}

마지막 부분이 함정입니다. for 반복문에서는 갱신이 조건 바로 옆에 있어서 잊기 어렵습니다. while 반복문에서는 본문 속의 또 하나의 문장일 뿐입니다 - 가장 흔한 버그는 이것을 빼먹어 프로그램을 멈추게 만드는 것입니다.

do-while: 본문을 최소 한 번 실행하기

때로는 반복할지 결정하기도 전에 본문이 먼저 한 번 실행되어야 합니다. do-while 반복문은 조건을 끝에서 검사하므로 본문은 항상 최소 한 번 실행됩니다.

입력이 유효한지 알 수 있으려면 최소 한 번은 묻고 읽어야 하는데, 바로 그것이 do-while이 주는 것입니다. while (...) 뒤의 세미콜론에 주의하세요 - 이는 필수이며, 빠뜨리면 흔한 컴파일 오류가 됩니다.

일반 while과의 차이는 조건이 처음부터 거짓일 때 분명하게 드러납니다.

do-while body만 출력됩니다. while 반복문은 첫 검사 전에 x < 5가 거짓이었기 때문에 본문을 완전히 건너뜁니다.

센티넬 값까지 반복하기

while의 고전적 용도 하나는 특별한 "정지" 값, 즉 센티넬(sentinel)까지 읽는 것입니다. 여기에는 카운터가 없습니다. 데이터가 멈추라고 할 때까지 그냥 계속하는 것입니다.

패턴은 반복문 전에 한 번 읽고, 그다음 매번 끝에서 다시 읽는 것입니다. 그래야 조건이 항상 새로운 입력을 검사합니다. 본문 안의 두 번째 읽기를 잊으면 value는 절대 바뀌지 않고 무한 루프가 됩니다.

while 반복문에서의 break와 continue

breakcontinue는 여기서도 for 반복문과 똑같이 동작합니다. break는 즉시 반복문을 빠져나갑니다. continue는 곧장 조건 검사로 돌아가 현재 실행의 나머지를 건너뜁니다.

이는 1 3 5 7 9를 출력합니다. while (true)는 일부러 스스로는 절대 멈추지 않습니다 - 유일한 출구는 break입니다. while 반복문에서 continue를 쓸 때는 조심하세요. 갱신이 본문의 일부이기 때문에, 카운터를 전진시키기 전에 continue로 맨 위로 돌아가는 것은 반복문을 조용히 멈추게 하는 길입니다. 위 예제에서는 n++가 먼저 실행되므로 안전합니다.

무한 루프를 조심하세요

조건은 결국 거짓이 되어야 하며, 그것은 전적으로 본문 안의 무언가가 바뀌는 것에 달려 있습니다. 흔한 두 가지 원인은 갱신을 잊는 것과 잘못된 방식으로 갱신하는 것입니다.

int i = 0;
while (i < 5) {
    System.out.println(i);   // i가 절대 바뀌지 않음 -> 영원히 실행됨
}
int i = 0;
while (i != 10) {
    i += 3;   // 0, 3, 6, 9, 12... 10을 그대로 건너뜀 -> 영원히 실행됨
}

첫 번째는 i가 한 번도 갱신되지 않아 멈춥니다. 두 번째는 카운터가 조건이 찾는 정확한 값을 건너뛰어 멈춥니다 - 단계가 정확히 맞지 않을 수 있을 때는 !=보다 <<=를 선호하세요. while (true)는 보장된 break있다면 괜찮습니다. 실수로 만든 것은 그저 버그일 뿐입니다.

다음: for-each 반복문

while 반복문은 조건이 바뀔 때까지 반복하고 깔끔한 횟수가 없을 때 알맞은 도구입니다. 하지만 배열이나 리스트의 모든 요소를 그저 방문하고 싶을 때(인덱스도, 관리할 조건도 없이)는 더욱 깔끔한 것이 있습니다 - 향상된 for-each 반복문입니다. 그것이 다음 페이지입니다.

자주 묻는 질문

자바에서 while과 do-while의 차이는 무엇인가요?

while 반복문은 첫 번째 실행 전에 조건을 검사하므로 본문이 0번 실행될 수도 있습니다. do-while 반복문은 먼저 본문을 한 번 실행한 다음 끝에서 조건을 검사하므로 항상 최소 한 번은 실행됩니다. 반복할지 결정하기 전에 작업이 먼저 일어나야 할 때(예: 입력을 받은 다음 검증할 때)는 do-while을 사용하세요.

자바에서 for 반복문 대신 while 반복문을 언제 써야 하나요?

깔끔한 카운터가 없고 단지 어떤 조건이 바뀔 때까지 반복하고 싶을 때 while 반복문을 사용하세요 - 사용자가 quit을 입력할 때까지 입력 읽기, 값이 준비될 때까지 폴링하기, 큐가 빌 때까지 처리하기 등입니다. 반복 횟수를 알거나 셀 수 있는 명확한 인덱스가 있을 때는 for 반복문을 사용하세요.

자바에서 무한 while 반복문을 어떻게 멈추나요?

본문 안의 무언가가 결국 조건을 거짓으로 만들도록 반드시 보장하세요(카운터 감소, 포인터 전진, 플래그 설정 등). 의도적인 while (true) 반복문이라면 if로 감싼 break를 안에 두세요. 반복문이 멈추지 않고 매달려 있다면, 보통 원인은 조건이 의존하는 변수를 갱신하는 것을 잊은 것입니다.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기