do-while 루프 – C언어 강의 12

do-while 루프

do while 루프는 간단히 말하면 최소 한번은 실행하는 while 루프입니다. while 문이 있으면 충분하지 왜 do while 까지 나와서 혼란스럽게 하느냐? 에 대한 의문을 가질 수도 있습니다. 이에 대해서는 스택오버플로우의 질문과 답변에서 처럼 코드의 중복을 제거하기 위해서이다 – 라는게 가장 설득력이 있습니다.

C언어가 세상에 나온 것은 지금으로 부터 50년전의 이야기라서 70년대에 C언어의 창시자 데니스 리치와 그의 동료 커니핸이 저술한 The C Programming Language 에는 다음과 같이 써있습니다.

-> test의 센스를 예외로 하면 do-while 은 파스칼의 repeat-until 문과 동등하다. 경험적으로 do-while문은 while 문이나 for 문보다는 적게 사용된다. 그럼에도 때때로 가치가 있다… (itoa 함수 사례)

->do-while은 필요하다. 적어도 편리하다.

참고로 itoa 함수는 정수형을 문자열로 변환하는 함수로 ANSI Standard 는 아닙니다. 여기 내용을 보면 do-while은 파스칼의 영향을 받았고 사용이 빈번하지는 않지만 가끔씩 쓸 때가 있다고 합니다. 스택오버플로우에서 보면 비슷합니다. 자주 사용하지 않으니까 이게 왜 있는 건지 모르겠다는 사람도 있고 필요하다는 주장도 있습니다. 어떤게 맞는 건지는 절대적인 기준은 없는지도 모릅니다. 귀도 반 로썸이 만든 파이썬의 경우 do while 문이 없는데 do while 을 자주 쓰는 사람들은 불편하니까 비슷한 로직을 만들어서 사용하기도 합니다.

Stephen Prata의 C 기초 플러스(C Primer Plus)의 do-while 부분을 보면 ‘탈출 조건 루프’라고 이름 붙이고 최소한 한 번은 실행해야 하는 경우에만 제한적으로 사용하도록 제한해야 한다고 설명합니다.

do-while 예제

do-while 은 아래의 형식입니다. while(expression); 끝에 세미콜론으로 끝나는 것에 주의합니다. body는 단일문일 수도 있고 복합문일 수도 있습니다.

do{
    statement; //body of loop
}while(expression);

다음은 사용자에게 입력 받은 숫자를 더하는 예제입니다. 한번은 입력받아야 되니까 do-while 이 효과가 있습니다.

#include <stdio.h>

int main(void) 
{
    int sum = 0;
    int number = 0;
    int running = 0;

    do{
        printf("숫자를 입력하면 더합니다(종료는 q)");
        running = scanf("%d", &number);
        sum += number;
        printf("sun : %d\n", sum);

    }while(running == 1);

    printf("\nclosed...\n");

    return 0; 
}

이걸 그냥 while 문으로 바꾸면 아래와 같습니다. do { } 내부에 다 넣느냐 바깥에 빠지는가의 문제가 될 수도 있는데 반복하는 코드가 더 복잡하고 길수록 가독성이 좋습니다.

#include <stdio.h>

int main(void) 
{
    int sum = 0;
    int number = 0;
    
    printf("숫자를 입력하면 더합니다(종료는 q)");
    
    while(scanf("%d", &number)){
        sum += number;
        printf("sun : %d\n", sum);
        printf("숫자를 입력하면 더합니다(종료는 q)");
    }

    printf("\nclosed...\n");

    return 0; 
}

요약

do-while 문은 while 문의 보충적인 문법에 가까우니까 비교적 간단하게 다뤄봤습니다. 복잡한 개념에 혼동이 오면 그냥 do-while 이것은 한번은 실행한다. while문은 조건 테스트에서 그냥 떨어질 수도 있기 때문에 한번도 실행하지 않을 수도 있지만 do-while은 어쨋든 한번의 실행은 보장합니다.

참고문서

language agnostic – Why use a “do while” loop? – Stack Overflow

tutorials/dowhile_k_r.c at main · neokayken/tutorials (github.com)

Leave a Comment