icon
4장 : 제어문

while과 do-while 반복문

때로는 반복 횟수를 미리 알 수 없거나, 특정 조건이 만족될 때까지 계속 반복해야 하는 경우가 있습니다.

예를 들어 사용자가 올바른 값을 입력할 때까지 계속 입력받거나, 파일의 끝에 도달할 때까지 데이터를 읽는 것과 같은 상황이 있을 수 있습니다.

이런 경우에 적합한 반복문이 바로 whiledo-while입니다.

이 장에서는 이 두 반복문의 특징과 사용법에 대해 자세히 알아보겠습니다.


while 문: 조건이 참인 동안 반복

while 문은 주어진 조건이 참(true)인 동안 코드 블록을 반복적으로 실행합니다.

for 문과 달리 초기화 및 증감 부분이 명시적으로 분리되어 있어, 반복 횟수보다는 '조건'에 중점을 둔 반복에 더 적합합니다.

while 문 형식
// (초기화는 보통 while 문 바깥에서 수행)
while (조건) {
    // 조건이 true인 동안 반복적으로 실행할 코드
    // (이 안에 조건을 변경시킬 코드가 반드시 포함되어야 함!)
}
  • 조건: 매 반복이 시작되기 전에 평가됩니다. 이 조건true이면 반복 몸체가 실행되고, false이면 while 문이 종료됩니다.
  • { } (중괄호): 조건이 참일 때 실행될 코드 블록입니다.
  • while 문은 for 문과 달리 초기화와 증감 부분이 명시적으로 포함되어 있지 않습니다. 따라서, 무한 루프에 빠지지 않도록 조건이 언젠가 false가 되도록 반복 몸체 내에서 적절히 변수를 변경하는 코드가 필수적으로 포함되어야 합니다.

while 문의 실행 흐름

  1. 조건 부분이 평가됩니다.
  2. 만약 조건true이면, while 문의 반복 몸체({ } 안의 코드)가 실행됩니다.
  3. 반복 몸체 실행이 끝나면, 다시 1번 단계로 돌아가 조건 부분을 평가합니다.
  4. 조건false가 될 때까지 2, 3번 과정을 반복합니다.
  5. 조건false가 되면 while 문이 종료되고 다음 코드가 실행됩니다.
예시 1: 1부터 5까지 출력하기 (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;
}
예시 2: 사용자로부터 올바른 나이 입력받기 (while 문)
#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 문을 사용하여 특정 조건이 만족되면 루프를 강제로 종료할 수 있습니다.

예시 3: 무한 루프와 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 (조건); // 조건 뒤에 세미콜론(;) 필수!
  • do 블록 안의 코드가 먼저 실행됩니다.
  • 그 후에 while 괄호 안의 조건이 평가됩니다.
  • 조건true이면 do 블록으로 돌아가 다시 실행하고, false이면 반복문이 종료됩니다.
  • while (조건); 뒤에 반드시 세미콜론(;)을 붙여야 합니다.

do-while 문의 실행 흐름

  1. do 블록의 반복 몸체({ } 안의 코드)가 실행됩니다.
  2. 조건 부분이 평가됩니다.
  3. 만약 조건true이면, 1번 단계로 돌아가 반복 몸체를 다시 실행합니다.
  4. 조건false가 되면 do-while 문이 종료되고 다음 코드가 실행됩니다.
예시 1: 사용자로부터 최소 한 번은 입력받기
#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 > 9false가 되어 루프가 종료됩니다.

사용자가 첫 입력으로 10을 입력하면 do 블록이 한 번 실행된 후 조건이 true가 되어 다시 입력을 요청하게 됩니다.

예시 2: 메뉴 선택 (do-while 활용)
#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 비교

특징forwhiledo-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 문을 통해 특정 시점에 루프를 탈출해야 합니다.