반복문

마블현·2024년 3월 20일

C언어

목록 보기
8/17

while문

while문은 특정 조건을 주고 그 조건을 만족하는 동안 특정 영역을 계속해서 반복하는 반목문이다.

while(num < 3)		// 반복의 조건은 num < 3
{
	printf("Hello world! \n");
    num++;
}

소괄호 안에는 반복의 조건을 명시하고, 이 조건이 만족되는 동안 중괄호 안에 존재하는 코드가 반복 실행되는 구조이다.

1. num의 값이 0부터 시작한다고 가정한다.
num은 0이니 조건에 충족하고, 문장을 출력한 뒤 num의 값을 1 증가한다.
2. num의 값은 1로 조건에 충족하고, 문장을 출력한 뒤 num의 값을 1 증가한다.
3. num의 값은 2로 조건에 충족하고, 문장을 출력한 뒤 num의 값을 1 증가한다.
4. num의 값은 3으로 조건에 충족하지 않고, 이때 while문을 탈출해 그 다음 행을 실행하게 된다.

만약 num++; 의 문장이 존재하지 않아 num의 값이 증가하지 않는다면, 계속 조건을 충족하므로 프로그램이 종료되지 않고 계속 실행된다. 이를 무한루프라고 한다.
따라서 반복문에서는 반복의 조건을 무너뜨리기 위한 최소한의 연산이 필요하다.

  • 반복의 대상이 하나의 문장이라면 중괄호는 생략 가능
while(num < 3)
	printf("Hello world! \n", num++);

while문의 실행흐름

int main(void)
{
	int num = 0;
    while(num < 3)	// 3회 반복
    {
    	printf("Hello world! \n");
        num++;
    }
    ...
}

이후에 2단계와 3단계를 반복하다가, 2단계에서 비교연산의 결과가 '거짓'으로 나온다면(조건에 만족하지 않는다면), 반복영역을 실행하지 않고 while문을 탈출한다.

while문의 순서도 (flow chart)

무한루프의 구성

반복조건이 와야 할 위치에 0이 아닌 값이 올 경우, 무한루프가 형성된다.

while( 1 )
{
	printf("Hello world! \n");
}

1은 '참'을 의미하는 대표적인 값이므로 반복조건은 항상 '참'이 되어 빠져나가지 못하는 반복문이 구성된다.

무한루프는 프로그래머의 실수가 아닌, 필요에 의해서 만들어지기도 한다.

while문의 중첩

'while문의 중첩'은 while문 안에 while문이 포함된 상황을 뜻한다.

#include <stdio.h>

int main(void)
{
	int cur = 2;
    int is = 0;
    
    while(cur < 10)		// 2단에서 9단까지 반복
    {
    	is = 1;
        while(is < 10)	// 각 단의 1부터 9의 곱
        {
        	printf("%d × %d = %d \n", cur, is, cur*is);
            is++;
        }
        cur++;			// 다음 단으로 넘어가기 위한 증가
    }
    return 0;
}

이처럼 while문의 중첩을 통해 코드를 간소화 할 수 있다.


do ~ while문에 의한 문장의 반복

while문과 do~while문의 차이는 반복의 조건을 검사하는 시점에 있다.

do~while문의 구성과 흐름

do~while문은 반복조건을 뒷부분에서 검사한다. 이렇듯 반복조건을 뒷부분에서 검사하기 때문에 반복영역을 최소한 한번은 실행하는 구조이다. while문은 반복조건을 만족하지 못하면 반복영역을 한번도 실행하지 않는다.

do
{
	printf("Hello world! \n");
    num++;
} while (num < 3)

do 다음에 등장하는 중괄호가 반복영역이고, 중괄호에 이어서 등장한 것이 반복 조건이다. 위의 코드는 다음 실행흐름을 갖는다.반복여부 확인 후, 조건에 맞지 않다면 do ~ while문을 탈출한다.

do~while문을 사용하는 상황

do~while문과 while문은 매우 유사하기 때문에 while문은 do~while문으로, do~while문은 while문으로 바꿀 수 있다.

while(num<10)
{
	printf("%d×%d=%d \n", dan, num, dan*num);
    num++;
}
do
{
	printf("%d×%d=%d \n", dan, num, dan*num);
    num++;
} while(num<10);

그럼 while문은 언제 쓰는거고, do~while문은 언제쓰는 걸까?

  • 대부분의 경우 do~while문이 while문을 대체할 수 있다.
    하지만 while문의 경우, 반복의 조건이 앞 부분에 위치해서 코드를 작성하기에도, 이해하기에도 용이하기 때문에 보통 while문을 많이 사용한다.
    do~while문의 경우, 반복영역이 무조건 한 번 이상 실행되어야 할 때 사용한다.

do~while문의 순서도


for문

for문의 구조와 이해

반복의 횟수가 정해져 있다면 while문은 다음과 같이 구성하게 된다.

int main(void)
{
	int num=0; 		//필수요소1. 반복을 위한 변수 선언
    while(num<3)	//필수요소2. 반복의 조건 검사
    {
    	printf("Hi! \n");
        num++;		//필수요소3. 반복의 조건을 거짓으로 만들기 위한 연산
    }
}

정해진 횟수의 반복문을 구성하려면, 주석을 통해 표현한 필수요소 중 어느 것 하나라도 생략할 수 없다. 이 필수요소들을 한 데 묶어 반복문의 반복횟수를 판단하기가 한결 수월해지는데, 이것이 바로 for문이다.

  • 필수요소 1: 초기식 - 반복을 위한 변수의 선언 및 초기화에 사용
  • 필수요소2: 조건식 - 반복의 조건을 감시하는 목적으로 선언
  • 필수요소3: 증감식 - 반복의 조건을 '거짓'으로 만드는 증가 및 감소연산

필수 요소들을 한데 묶어 for문으로 표현한다면,
for(초기식; 조건식; 증감식;) 이다.

따라서 앞서 보인 while문은 다음과 같이 변경이 가능하다.

int main(void)
{
	for(int num=0; num<3; num++)
    	printf("Hi! \n");
}

비교해보면 반복문이 훨씬 간결해졌다.
초기식은 반복을 시작하기에 앞서 딱 한번 실행된다.
조건식은 매 반복의 시작에 앞서 실행되며, 결과를 기반으로 반복 유무를 결정한다.
증감식은 매 반복 실행 후 마지막에 연산이 이뤄진다.

for문이 while문보다 간결하면, while문은 쓸 필요가 없지 않은가?

  • 그렇지 않다. for문은 while문보다 유연하지 못하기 때문이다. 반복의 횟수가 정확히 정해진 경우라면 분명 for문이 최선이다. 하지만 프로그램 사용자가 임의의 값을 입력하기만 기다리는 상황처럼 반복의 횟수가 정해지지 않은 경우라면, while문이 자연스러운 코드를 작성하는데 좋다.

for문은 기본적으로 초기식, 조건식, 증감식을 채울 수 있지만, 필요 없는 부분이 있다면 채우지 않아도 된다. 하지만 for문의 중간에 위치한 '조건식'이 비워지면 무조건 '참'으로 인식이 되어 무한루프를 형성하게 된다.

for문의 중첩

while문의 중첩에서 썼던 구구단 전체를 출력하는 예제를 for문으로 나타낼 수 있다.

int main(void)
{
	int cur, is;
    
    for(cur=2; cur<10; cur++)
    {
    	for(is=1; is<10; is++)
        	printf("%d×%d=%d \n", cur, is, cur*is);
        printf("\n");
    }
    return 0;
}
profile
고수로 나아가는 중

0개의 댓글