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)