Menu

C의 do-while 반복문: 문법, 예제, 그리고 쓰는 시점

본문을 먼저 실행하는 C의 반복문: do-while이 검사 전에 한 번의 실행을 보장하는 방식, 왜 세미콜론으로 끝나는지, 이를 위해 만들어진 메뉴와 재시도 패턴, 그리고 평범한 while 반복문과의 차이.

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

언제나 한 번은 실행되는 반복문

while 반복문은 행동하기 전에 검사하므로 0번 실행될 수 있습니다. 보통은 그게 맞습니다. 하지만 정확히 반대인 경우도 있습니다. 프롬프트를 보여 주기 전에는 다시 물어봐야 할지 알 수 없고, 무언가를 읽기 전에는 사용자의 입력을 판단할 수 없습니다. do-while은 검사를 끝으로 옮기므로, 본문이 먼저 실행되고 조건은 한 번 더 갈지만 결정합니다.

조건 i < 5는 처음부터 거짓입니다. while 반복문은 0번 실행되고, do-while은 정확히 한 번 실행됩니다. 둘의 차이는 그것이 전부입니다.

문법, 그리고 그 세미콜론

do {
    // 본문 - 항상 최소 한 번 실행됨
} while (condition);

읽는 순서가 실행 순서 그대로입니다. 본문을 do(실행)하고, 조건이 while(성립하는 동안) 다시 실행합니다.

닫는 괄호 뒤의 세미콜론은 반드시 필요합니다. do ... while (조건);은 하나의 문장이고, C의 문장은 세미콜론으로 끝납니다. 빼먹으면 컴파일러가 계속 읽어 나가다가 한참 아래에서 문법 오류를 보고합니다. 진짜 실수가 오류가 가리키는 줄에서 몇 줄 떨어져 있는 경우가 많은 이유죠.

여기는 C에서 while (조건);처럼 세미콜론을 붙이는 것이 버그가 아니라 올바른 유일한 자리이기도 합니다. 평범한 while 반복문에서 같은 문장 부호는 빈 본문을 만들고 보통 무한 루프가 되지만, 여기서는 do를 닫는 역할입니다.

본문이 한 문장이면 중괄호는 선택이지만, C의 다른 모든 제어 구조와 마찬가지로 그래도 써 주세요.

입력 검증 패턴

do-while이 만들어진 이유가 바로 이것입니다. 받아들일 만한 값인지 알려면 먼저 읽어야 하므로, 읽기가 검사보다 앞서야 합니다.

반복문은 통과하는 값이 나올 때까지 계속 읽고, 잘못된 값을 거부하는 그 조건이 곧 한 번 더 돌라고 요청하는 조건이기도 합니다. 이를 while로 쓰면 읽기가 두 번 나와야 합니다. 조건을 준비하기 위해 반복문 앞에 한 번, 본문 끝에 또 한 번. do-while이 없애 주는 것이 바로 이 중복입니다.

실제 입력을 받는다면 본문에서 scanf를 호출하게 됩니다.

int age;
do {
    printf("Enter your age (1-120): ");
    if (scanf("%d", &age) != 1) {
        while (getchar() != '\n') { }   /* 잘못된 줄을 버림 */
        age = -1;                        /* 한 번 더 돌게 만듦 */
    }
} while (age < 1 || age > 120);

줄의 나머지를 비우는 안쪽 while에 주목하세요. scanf가 변환에 실패하면 문제의 텍스트가 여전히 입력 버퍼에 남아 있어서 이후의 모든 읽기도 그 위에서 실패합니다. 프롬프트만 찍으며 영원히 도는 반복문이 되는 것이죠. 버퍼를 비우는 것까지가 이 패턴의 일부입니다.

메뉴 패턴

또 하나의 고전적인 용도입니다. 선택지를 보여 주고, 선택을 읽고, 그에 따라 행동하고, 사용자가 그만둘 때까지 반복합니다. 검사할 선택이 생기기 전에 메뉴가 먼저 나타나야 합니다.

switch 안의 break는 반복문이 아니라 switch를 끝냅니다. 둘이 같은 키워드를 쓰기 때문에 정확히 짚고 넘어갈 만한 부분입니다. 여기서 반복문은 choice != 4가 거짓이 되어 끝납니다. switch 안에서 반복문을 빠져나가고 싶다면 return이나 플래그 변수를 써야 합니다. break만으로는 할 수 없습니다.

보장된 첫 실행이 버그가 될 때

본문이 어떤 검사보다도 먼저 실행되기 때문에, do-while은 존재하지도 않는 데이터를 태연히 처리해 버립니다.

/* 버그: n이 0일 때도 a[0]을 출력함 */
int i = 0;
do {
    printf("%d\n", a[i]);
    i++;
} while (i < n);

n == 0이면 빈 배열에서 a[0]을 읽습니다. 미정의 동작입니다. 비어 있을 수 있는 컬렉션을 도는 반복문에는 검사가 먼저 오는 while이나 for가 필요합니다.

경험칙은 이렇습니다. 0번 실행이 실제로 드물다는 정도가 아니라 문제의 성격상 불가능할 때만 do-while을 쓰세요. 사용자에게 물어보기, 목표가 나올 때까지 주사위 굴리기, 후보를 만들어 검사하기 - 이런 일들은 첫 실행 전에는 정말로 판단할 수 없습니다. 리스트를 훑는 일은 그렇게 주장할 수 없습니다.

do-while 안의 break와 continue

둘 다 동작하는데, continue에는 알아 둘 만한 반전이 있습니다. 본문의 맨 위가 아니라 조건 검사로 점프한다는 점입니다.

본문 맨 위의 i++continue가 중간에 끊는 회차를 포함해 매번 실행되므로, 반복문은 계속 진행됩니다. 갱신을 continue 뒤에 두면 반복문이 멈춰 버립니다. while 반복문이 가진 것과 똑같은 함정입니다.

break는 즉시 반복문을 빠져나가며 조건 검사를 아예 건너뜁니다.

세 가지 반복문 중에 고르기

C의 세 반복문은 표현력이 같습니다. 선택의 기준은 어느 쪽이 의도를 잘 드러내느냐입니다.

for        카운터, 한계, 증가폭이 한데 모임 - "n번"
while      조건이 바뀔 때까지 반복, 한 번도 안 돌 수 있음 - "~할 때까지"
do-while   같지만 첫 실행이 보장됨 - "최소 한 번"

실제로 do-while은 셋 중 압도적으로 가장 드뭅니다. 대부분의 반복문은 횟수를 세거나 빈 경우를 처리해야 하고, 둘 다 검사가 맨 위에 있길 원합니다. while 반복문의 조건을 준비하려고 바로 앞에서 문장 하나를 복사해 붙이고 있는 자신을 발견했다면 그때 do-while을 꺼내세요. 그 중복이 신호입니다.

자주 묻는 질문

C에서 do-while 반복문은 어떻게 작성하나요?

do { 본문 } while (조건); 형태로, 본문이 먼저 오고 검사가 뒤에 오며 전체 문장이 세미콜론으로 끝납니다. 본문은 항상 최소 한 번 실행되고, 조건이 0이 아닌 동안 반복됩니다.

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

검사가 어디에 있느냐입니다. while 반복문은 첫 실행 전에 조건을 검사하므로 0번 실행될 수 있습니다. do-while은 나중에 검사하므로 항상 최소 한 번은 실행됩니다. 보장된 첫 실행이 문제의 성격상 정말로 필요할 때만 do-while을 고르세요.

do-while 반복문 끝에 왜 세미콜론이 필요한가요?

do ... while (조건);이 하나의 문장이고, C의 다른 모든 문장처럼 세미콜론으로 끝나기 때문입니다. 빼먹으면 컴파일러가 문장의 나머지를 계속 읽으므로, 그 뒤에 오는 아무 줄이나 가리키는 헷갈리는 문법 오류가 납니다.

do-while 반복문은 언제 써야 하나요?

반복 여부를 알기 위해서라도 본문이 먼저 실행되어야 할 때입니다. 선택을 읽기 전에 메뉴를 보여 주거나, 입력이 유효할 때까지 다시 물어보거나, 값을 만든 뒤 검사하는 경우죠. 조건을 미리 검사할 수 있다면 while 반복문이 더 분명하게 의도를 드러냅니다.

Coddy programming languages illustration

Coddy로 코딩 배우기

시작하기