본문 바로가기

Computer Study

반복문 비교 및 차이 개념잡기

반복문(while, do~while, for) 비교 및 차이 개념잡기

세 종류 모두 비슷한 명령을 여러 번 반복한다는 근본적인 목적은 동일하지만 형식이 조금 다를 뿐이다. 비슷한 반복문을 쓸데없이 이렇게 많이 만들어 놓았을 리는 없고 세 종류가 약간씩 다른 차이점이 있다. 그래서 실무에서 제어 구조를 작성할 때 상황에 따라 적절한 반복문을 선택해서 사용해야 한다. 각 반복문의 특징과 차이점에 대해 연구해 보자.

while 문

루프를 계속할 조건만 있고 초기식이나 증감식이 없다. 아예 제어 변수라는 개념이 없으며 루프 내부에서 조건식의 진위 여부를 변경해야 한다. 그래서 while문은 반복 횟수가 가변적이다. 사용자의 입력이나 네트워크의 변화, 특정 신호의 입력 등 언제 발생할지 모르는 조건에 대해 반복할 때는 while문을 쓰는 것이 적합하다.

즉, while 문은 지정된 식이 false가 될 때까지 하나의 문이나 문 블록을 반복하여 실행합니다. 각 루프를 실행하기 전에 expression을 테스트하기 때문에 while 문은 0번 이상 실행됩니다. while 루프는 Exit 문을 지원하지 않는다는 점을 제외하고는 do while ... 루프와 비슷합니다.

do~while 문

while문과 마찬가지로 제어 변수가 없고 반복 횟수가 가변적이지만 조건을 점검하는 시기가 다르다. while문은 루프로 들어가기 전에 조건을 점검하지만 do~while문은 일단 명령을 실행한 후 루프 계속 여부를 점검한다. 그래서 while문은 조건에 따라 한 번도 실행되지 않을 수도 있지만 do~while문은 최소한 한 번은 실행된다는 차이점이 있다. 요약하자면 while문은 선평가 후실행문이며 do~while문은 선실행 후평가문이다.


즉, do~while 문은 문의 고정된 블록을 무한정 실행하는 데 사용합니다. do While ... loop는 해당 조건을 평가하고 조건이 true일 경우 그 뒤에 나오는 문을 평가합니다. 이 작업이 끝나면 다시 조건을 평가하고 조건이 true일 경우 문을 다시 평가합니다. 조건이 false일 때까지 이 과정을 계속 반복합니다.


for 문

가장 큰 특징은 제어 변수를 사용한다는 점이다. 루프를 통제하는 변수를 선언하고 이 변수가 일정한 범위의 값을 가지는 동안 명령을 계속 반복한다. 그래서 통상 for문은 반복 횟수가 이미 정해져 있고 루프 중간에서 탈출하는 경우가 별로 없다. 물론 break문으로 강제로 탈출할 수도 있지만 일반적으로 반복 횟수가 정해져 있다.

그래서 for문은 1~100까지, 1번 학생~60번 학생까지의 경우처럼 미리 정해진 횟수만큼 반복할 때 가장 편리하다. 또한 문장안에 초기식, 조건식, 증감식이 포함되어 있어서 루프의 선두만 봐도 변수의 변화를 쉽게 파악하고 변경할 수 있다.

즉, for 루프를 사용하면 식 시퀀스를 여러 번 평가할 수 있습니다. 이것은 수식을 평가하는 동안 많아야 한 번 각 식을 통과하는 If 및 Select 식과는 다릅니다. for 루프는 식을 평가해야 하는 횟수를 미리 알고 있는 경우 가장 좋은 방법입니다.

부연 설명

초기식을 먼저 실행하고 루프로 진입하며 매 명령을 실행할 때마다 증감식을 실행하면 while문으로도 for문과 똑같은 구조를 만들 수 있다. 물론 완전히 같지는 않아서 루프 내부에서 continue명령을 사용할 때의 효과가 약간 달라진다. 반대로 while (조건) 명령;도 for (;조건;) 명령; 형식으로 변환할 수 있다. 제어문에 따른 실행 속도나 코드의 크기는 거의 차이가 없으므로 실행 속도는 제어문을 선택하는 기준이 아니다.

하지만 어느 쪽이 더 효율적이고 코드의 가독성이 높은지, 부작용은 없는지를 비교해 보면 세가지 반복문 중 가장 적절한 것이 있을 것이다. 세가지 제어 구조의 특징을 잘 파악해야 상황에 가장 적절한 반복문을 선택할 수 있다. 1~100까지 숫자의 합계를 구하는 루프는 for문이 가장 적당하다. 반복 범위가 미리 정해져 있고 이 값이 루프내에서 사용되어야 하므로 제어 변수를 쓰는 것이 효율적이며 코드도 훨씬 더 짧고 명료하다.

 예를 들어, 숫자 맞추기 게임에서는 사용자가 입력한 숫자와 컴퓨터가 생각한 숫자를 비교하기 위해 do~while 문을 사용한다. 이 경우 왜 do~while 루프가 가장 적절한가 하면 일단 사용자로부터 값을 입력받아야만 루프를 탈출할 것인지 계속할 것인지를 결정할 수 있기 때문이다. 즉, 조건을 점검하기 전에 일단 사용자로부터의 입력을 최소한 한 번은 먼저 받아야만 하는 것이다. 만약 이 프로그램을 while문으로 작성했다고 해 보자.

 while (input!=num) {

     scanf("%d",&input);

     ....

}

 이렇게 되면 정수값을 입력받기도 전에 input이 num과 같은지를 비교해야 하는데 이때 input이 가진 값은 초기화되지 않은 쓰레기값이기 때문에 정상적인 비교가 되지 않는다. 그래서 이 경우는 선평가 후실행문인 while은 적절하지 못하며 선실행 후평가문인 do~while이 적절하다.

세 반복문의 순서도를 그려보면 다음과 같다. 조건 평가와 명령을 실행하는 순서, 제어 변수에 대한 처리 등에 있어서 각각 고유한 특징이 있는데 이 순서도를 보고 자신이 이해한 것과 같은지 비교, 정리해 보자.

'Computer Study' 카테고리의 다른 글

표준 디스플레이 크기  (0) 2012.07.08
개발자도구 오류  (0) 2012.04.26
SSD 최적화 작업  (0) 2011.09.14
win7 시계 요일 표시하기  (0) 2011.09.12
윈도우7 가젯(날씨) 사용하기  (0) 2011.07.31