while과 do-while 반복문
때로는 반복 횟수를 미리 알 수 없거나, 특정 조건이 만족될 때까지 계속 반복해야 하는 경우가 있습니다.
예를 들어 사용자가 올바른 값을 입력할 때까지 계속 입력받거나, 파일의 끝에 도달할 때까지 데이터를 읽는 것과 같은 상황이 있을 수 있습니다.
이런 경우에 적합한 반복문이 바로 while
문과 do-while
문입니다.
이 장에서는 이 두 반복문의 특징과 사용법에 대해 자세히 알아보겠습니다.
while
문: 조건이 참인 동안 반복
while
문은 주어진 조건이 참(true)인 동안 코드 블록을 반복적으로 실행합니다.
for
문과 달리 초기화 및 증감 부분이 명시적으로 분리되어 있어, 반복 횟수보다는 '조건'에 중점을 둔 반복에 더 적합합니다.
// (초기화는 보통 while 문 바깥에서 수행)
while (조건) {
// 조건이 true인 동안 반복적으로 실행할 코드
// (이 안에 조건을 변경시킬 코드가 반드시 포함되어야 함!)
}
조건
: 매 반복이 시작되기 전에 평가됩니다. 이조건
이true
이면 반복 몸체가 실행되고,false
이면while
문이 종료됩니다.{ }
(중괄호): 조건이 참일 때 실행될 코드 블록입니다.while
문은for
문과 달리 초기화와 증감 부분이 명시적으로 포함되어 있지 않습니다. 따라서, 무한 루프에 빠지지 않도록 조건이 언젠가false
가 되도록 반복 몸체 내에서 적절히 변수를 변경하는 코드가 필수적으로 포함되어야 합니다.
while
문의 실행 흐름
- 조건 부분이 평가됩니다.
- 만약 조건이
true
이면,while
문의 반복 몸체({ }
안의 코드)가 실행됩니다. - 반복 몸체 실행이 끝나면, 다시 1번 단계로 돌아가 조건 부분을 평가합니다.
- 조건이
false
가 될 때까지 2, 3번 과정을 반복합니다. - 조건이
false
가 되면while
문이 종료되고 다음 코드가 실행됩니다.
#include <iostream>
int main() {
int i = 1; // 초기화
while (i <= 5) { // 조건
std::cout << i << " ";
i++; // 증감
}
std::cout << std::endl; // 출력: 1 2 3 4 5
return 0;
}
#include <iostream>
int main() {
int age;
std::cout << "나이를 입력하세요 (1-120): ";
std::cin >> age;
// 나이가 유효한 범위(1-120)에 들어올 때까지 반복
while (age < 1 || age > 120) {
std::cout << "잘못된 나이입니다. 1에서 120 사이의 숫자를 다시 입력하세요: ";
std::cin >> age;
}
std::cout << "입력하신 나이: " << age << std::endl; // 출력: 입력하신 나이: (사용자가 입력한 유효한 나이)
return 0;
}
while (true)
는 영원히 참이므로 무한 루프를 만듭니다.
이 경우, break
문을 사용하여 특정 조건이 만족되면 루프를 강제로 종료할 수 있습니다.
#include <iostream>
#include <string>
int main() {
std::string command;
std::cout << "명령을 입력하세요 ('exit'을 입력하면 종료):" << std::endl;
while (true) { // 무한 루프
std::cout << "> ";
std::cin >> command;
if (command == "hello") {
std::cout << "안녕하세요!" << std::endl;
} else if (command == "exit") {
std::cout << "프로그램을 종료합니다." << std::endl;
break; // 'exit'이 입력되면 루프 탈출
} else {
std::cout << "알 수 없는 명령입니다." << std::endl;
}
}
return 0;
}
do-while
문: 최소 한 번은 실행되는 반복
do-while
문은 while
문과 유사하지만, 조건을 반복 몸체 실행 후에 평가한다는 점에서 차이가 있습니다.
이로 인해 do-while
문의 반복 몸체는 조건의 참/거짓 여부와 관계없이 최소 한 번은 반드시 실행됩니다.
do {
// 최소 한 번은 실행될 코드
// (이 안에 조건을 변경시킬 코드가 반드시 포함되어야 함!)
} while (조건); // 조건 뒤에 세미콜론(;) 필수!
do
블록 안의 코드가 먼저 실행됩니다.- 그 후에
while
괄호 안의조건
이 평가됩니다. 조건
이true
이면do
블록으로 돌아가 다시 실행하고,false
이면 반복문이 종료됩니다.while (조건);
뒤에 반드시 세미콜론(;
)을 붙여야 합니다.
do-while
문의 실행 흐름
do
블록의 반복 몸체({ }
안의 코드)가 실행됩니다.- 조건 부분이 평가됩니다.
- 만약 조건이
true
이면, 1번 단계로 돌아가 반복 몸체를 다시 실행합니다. - 조건이
false
가 되면do-while
문이 종료되고 다음 코드가 실행됩니다.
#include <iostream>
int main() {
int num;
// do-while은 최소 한 번은 실행되므로, 첫 입력 유도 메시지를 루프 안에 넣기 편리
do {
std::cout << "0에서 9 사이의 숫자를 입력하세요: ";
std::cin >> num;
} while (num < 0 || num > 9); // num이 유효한 범위에 들어올 때까지 반복
std::cout << "입력하신 숫자: " << num << std::endl;
return 0;
}
만약 사용자가 첫 입력으로 5를 입력하면 do
블록이 한 번 실행된 후 num < 0 || num > 9
가 false
가 되어 루프가 종료됩니다.
사용자가 첫 입력으로 10을 입력하면 do
블록이 한 번 실행된 후 조건이 true
가 되어 다시 입력을 요청하게 됩니다.
#include <iostream>
int main() {
int choice;
do {
std::cout << "\n--- 메뉴 ---" << std::endl;
std::cout << "1. 게임 시작" << std::endl;
std::cout << "2. 설정" << std::endl;
std::cout << "3. 종료" << std::endl;
std::cout << "선택: ";
std::cin >> choice;
switch (choice) {
case 1:
std::cout << "게임을 시작합니다!" << std::endl;
break;
case 2:
std::cout << "설정 화면으로 이동합니다." << std::endl;
break;
case 3:
std::cout << "게임을 종료합니다. 안녕히 가세요!" << std::endl;
break;
default:
std::cout << "잘못된 선택입니다. 다시 입력해주세요." << std::endl;
break;
}
} while (choice != 3); // choice가 3이 아니면 계속 반복
return 0;
}
이 예시에서 메뉴는 최소 한 번은 출력되고 사용자의 입력을 받습니다.
사용자가 3을 입력하기 전까지 계속 메뉴가 반복됩니다.
for
vs while
vs do-while
비교
특징 | for 문 | while 문 | do-while 문 |
---|---|---|---|
초기화, 조건, 증감 | 한 줄에 명시적으로 표현 | 초기화는 외부, 증감은 내부에서 수동 관리 | 초기화는 외부, 증감은 내부에서 수동 관리 |
반복 실행 조건 | 루프 시작 전 조건 검사 | 루프 시작 전 조건 검사 | 루프 실행 후 조건 검사 |
최소 실행 횟수 | 0번 (조건이 처음부터 false이면) | 0번 (조건이 처음부터 false이면) | 1번 (조건과 관계없이) |
적합한 상황 | 반복 횟수가 명확할 때 (예: 배열 순회), 규칙적인 증감이 필요할 때 | 조건이 만족될 때까지 반복할 때 (예: 파일 읽기, 사용자 입력) | 최소 한 번은 실행해야 할 때 (예: 메뉴 시스템, 유효성 검사) |
주의사항 | 무한 루프 방지를 위해 조건과 증감 확인 | 무한 루프 방지를 위해 증감(조건 변경) 코드 필수 | while 뒤에 세미콜론(;) 필수, 무한 루프 방지를 위해 증감(조건 변경) 코드 필수 |
무한 루프 (Infinite Loops)
반복문의 조건이 항상 true
로 평가되도록 작성되면 무한 루프(Infinite Loop) 가 됩니다.
이는 프로그램이 끝나지 않고 계속 실행되는 상태를 만듭니다. 의도적인 경우가 아니면 버그로 이어집니다.
일반적인 무한 루프의 원인
while
문에서 조건을 변화시키는 코드가 없거나 잘못된 경우.for
문에서 조건이 항상true
인 경우 (예:for (;;)
).
int counter = 0;
while (counter < 5) { // counter는 항상 0이므로 조건이 항상 true
std::cout << "반복 중..." << std::endl;
// counter++; // 이 증감 코드가 없어서 무한 루프!
}
의도적인 무한 루프는 위에서 본 while (true)
와 같이 사용하며, break
문을 통해 특정 시점에 루프를 탈출해야 합니다.