Chapter 12. C언어 : 반복문, for, while, do while문. continue, break까지

2026. 4. 19. 20:11·지식 아카이브/C언어


  안녕하세요! 이번 글에서는 반복문에 대해 배워보겠습니다. 반복문은 말 그대로 특정 동작을 반복해서 실행하는 코드입니다. 현대 컴퓨터의 핵심 역할 중 하나는 자동화라고 할 수 있는데, 반복문은 이러한 자동화를 구현하는 가장 기본적인 도구입니다.

 

∨ while

  반복문은 말 그대로 특정 동작을 반복해서 실행시키는 코드입니다. 반복문 코드는 크게 for문, while문, do while문이 있습니다. (goto문이라는 거의 금지된 방법도 있습니다. 다음 장에서 알아보겠습니다.) 보통은 반복문으로서, for문을 우선 배웁니다. 하지만 저는 while문부터 보도록 하겠습니다. 

 

  while문의 형식을 우선 보도록 하겠습니다. while문은 조건을 검사하여 조건을 만족하면 중괄호 {} 안에 있는 내부 코드를 반복합니다. 

while (조건식) { 
	반복할 코드;
}

 

 

음... 말로 듣는 것보다 코드로 직접 보는 것이 나을 것 같습니다. 다음 코드를 한번 실행시켜 보시길 바랍니다.

/*사용자가 0을 입력할 때 까지 반복해서 입력받는 프로그램*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    int x = 1;

    while (x != 0) {
        printf("x값 입력:");
        scanf("%d", &x);
    }

    return 0;
}

  해당 코드는 우선 변수 x를 선언하고 값 1로 초기화합니다. 그 후 while문을 실행하게 됩니다. while문의 조건식은 (x != 0), 즉 x가 0이 아닐 때입니다. 변수 x의 값은 1이므로 조건을 만족하기 때문에 while문 내부의 코드를 실행합니다. 그리고 while문 내부의 코드는 x의 값을 입력받습니다. 

 

  지금까지는 아래의 if문과 동일합니다. 조건을 검사하고 만족하면 내부의 코드를 실행하는 것까지는 if문이 동작하는 것과 다를게 없어보이거든요.

if (x != 0) {
    printf("x값 입력:");
    scanf("%d", &x);
}

 

  하지만 while문은 내부 코드를 실행한 후, 다시 조건을 검사하여 만약 조건을 만족한다면 내부 코드를 한 번 더 실행합니다. 즉 아래와 같은 결과를 볼 수 있는 것입니다.

x값 입력:6
x값 입력:2
x값 입력:3
x값 입력:9
x값 입력:0

 

  조건식이 (x != 0)이므로 while문은 x의 값이 0만 아니라면 조건을 만족합니다. 즉, 반대로 말하면 x의 값이 0이 아니면 계속해서 while문 내부의 코드를 수행하게 됩니다. 결과적으로 while문은 조건만 만족한다면 내부의 코드를 반복적으로 수행시킵니다.

 

  이정도로 while문을 이해해도 되지만 아래의 그림을 머리에 외워두면 더욱 도움이 될 것입니다. (사실상 이 부분 때문에 while문을 먼저 설명드리는 것입니다). 바로 while문은 아래 그림과 같이 if문의 반복이라고 볼 수 있기 때문입니다. 

 

while문을 표현하자면 if문의 나열처럼 표현할 수 있다.

 

저번 글에서의 "블럭식 사고" 부분을 읽고 오시면 도움이 됩니다.

 

  while문은 조건을 반복해서 검사하며, 조건이 참인 동안 같은 코드 블록을 계속 실행하는 구조입니다. 이를 이해하기 쉽게 표현하면, while문은 조건을 계속 확인하는 if문이 반복되는 형태라고 볼 수 있습니다. 그렇다면 while문은 몇 개의 if문이 나열된 형태일까요? 조건이 계속 참이라면, while문은 이론적으로 무한히 반복되는 if문 구조라고 생각할 수 있습니다.

 

  일단 이정도까지만 while문을 알아보고 for문을 알아보고 오겠습니다.

Chapter 10. C언어 : 조건문. 프로그램의 실행 흐름의 분기. if문의 모든것. — 검정부기

 

Chapter 10. C언어 : 조건문. 프로그램의 실행 흐름의 분기. if문의 모든것.

안녕하세요! 이번 글에서는 조건문인 if에 대해 배워보도록 하겠습니다. 조건문은 프로그램 실행 분기를 제어하는 중요한 문법입니다. 이제부터 본격적으로 코딩이 시작된다고 말할 수 있습니

alittleboogie.tistory.com

 

 

∨ for

  for문 또한 반복문입니다. for문의 형식은 다음과 같습니다.

for (초기식; 조건식; 증감식) {
	반복할 코드;
}

  우선 for문에 대해 알아야 하는 부분은 for문은 횟수 기반 반복문입니다. 즉, "~~ 일 때까지 반복"이 아닌, "10번 반복", "3번 반복" 처럼 정해진 횟수만큼 반복을 할 때 사용하는 것이 for 반복문입니다. 

 

  for문은 형식을 설정할 때 주로 변수를 이용하여 반복을 제어합니다. 특히 반복 횟수를 관리하기 위해 변수를 사용하며, 이 변수를 통해 반복의 시작, 조건, 증가 과정을 모두 제어할 수 있습니다.

for (i = 0; i<3 ; i++) {
	반복할 코드;
}

  위의 예에서 초기식을 통해 변수 i의 값을 0으로 설정합니다. 조건식을 통해 i가 3보다 작을 때까지 코드를 계속 실행하도록 합니다. 그 후 증감식에는 변수의 증가식(혹은 감소식)을 작성하게 되며, 반복이 한 번 실행될 때마다 i의 값이 변화하게 됩니다. 따라서 이 코드는 i가 0, 1, 2일 때 총 3번 반복되며, 각 반복마다 코드 블록이 실행됩니다.

 

  즉, 변수의 값을 설정한 후, 일정 값까지 커지거나 같아질 때까지 변수의 값을 증가시키면서 코드를 반복 실행하는 것이 for문의 매커니즘이다. 여기선 변수 i 값을 0으로 설정한 후, 3보다 크거나 같아질 때까지 코드를 실행시키면서 i의 값을 1씩 증가시켜주면 총 3번 반복하게 되는 것입니다. 이제 for문의 작동법을 더 세밀히 보면서 이해해봅시다.

 

  for문이 실행되면서 제일 먼저 "초기식"이 실행됩니다. 그 이후 조건식을 검사하여 만족하면 중괄호 {} 안에 있는 내부 코드를 실행합니다. 그 이후 증감식을 실행한 이후, 다시 조건식을 검사하여 만족하면 내부 코드를 반복합니다. 좀 복잡해보이는데, 예시를 보면서 이해해보겠습니다. 

/*x의 값 출력을 반복하는 for 반복문*/
#include <stdio.h>

int main(void) {

    for (int x = 0; x < 10; x++) {
        printf("x의 값 : %d\n", x);
    }
    
    return 0;
}

  이 코드의 결과는 다음과 같습니다. for문이 실행되면서 제일 먼저 초기식이 실행됩니다. 여기서 초기식은 "int x = 0"입니다. 변수 x가 선언되고 값 0으로 초기화됩니다. 그 이후 조건식인 "x < 10"을 검사합니다. x가 0이기에 조건을 만족하여 내부 코드를 실행하게 됩니다. 내부 코드의 실행을 마치면 증감식인 "x++"를 실행하여 x의 값을 1 증가시킵니다. 그리고 다시 조건식을 검사합니다.

x의 값 : 0
x의 값 : 1
x의 값 : 2
x의 값 : 3
x의 값 : 4
x의 값 : 5
x의 값 : 6
x의 값 : 7
x의 값 : 8
x의 값 : 9

 

for문의 작동 방식을 그림으로 나타내보면 다음과 같습니다.

for (초기식; 조건식; 증감식) {
	반복할 코드;
}

  그림의 예에서 초기식은 "int i = 0"입니다. 조건식은 "i<3"입니다. 증감식은 "i++"입니다. 아래와 같이 for문이 실행되면서 초기식이 제일 먼저 실행되고, while문처럼 조건식을 확인하면서 조건을 만족하면 반복합니다. 내부 코드를 실행할 때마다 증감식도 따라 실행됩니다.

  그럼 for문의 특징을 파악해봅시다.

 

  • 초기식은 for문이 시작하면서 제일 먼저 실행된다. 
  • 초기식은 어떤 경우든 딱 한 번만 실행된다. 아예 실행되지 않거나 2번 이상 실행되는 경우는 아예 존재하지 않는다.
  • 내부 코드를 반복하기 전에는 항상 조건식을 확인하여 조건을 충족하면 내부 코드를 실행한다.
  • 내부 코드가 끝나고 나서 증감식도 이어 실행된다.
  • 조건문만 충족된다면 for문도 이론상 무한히 반복한다.

 

  이제 for문의 동작 방식을 이해했다면 for문의 목적을 알아야 합니다. 즉, while문과 for문이 어떤 경우에 사용되는 지, 두 반복문 간의 목적을 알려드리겠습니다.

 

∨ for문의 사용 목적

  for문은 주로 횟수 기반 반복문에서 쓰입니다. 달리 말하면 for문은 주로 횟수가 정해진 반복에서 사용됩니다. 즉, “몇 번 반복할지”가 명확하게 정해져 있을 때 적합한 반복문입니다. 예를 들어, "5km를 뛸 때 까지 트랙을 반복해서 달린다."와 "트랙을 달리는 것을 10번 반복한다." 중 “트랙을 달리는 것을 10번 반복한다.”는 반복 횟수가 명확하게 정해져 있으므로 for문에 더 적합한 경우입니다.

 

  다음은 for문을 이용한 예시입니다. for문을 통해 "Hello World\n"을 5번 출력하게 됩니다. 

/* 5번 printf 문 사용 프로그램 */
#include <stdio.h>

int main(void) {

	for (int i = 0; i < 5; i++) { // 5번 반복하게 됩니다.
		printf("Hello World\n");
	}

	return 0;
}

  결과는 아래와 같습니다. 이 경우에선 반복할 횟수가 "5번"으로 고정되어 있으므로 for문을 사용하는 것이 더 적합합니다.

Hello World
Hello World
Hello World
Hello World
Hello World

 

  for문을 직접 사용해보겠습니다. for문은 대부분 형식이 정해져 있습니다. 이 형식을 외워두면 매우 좋습니다. 다음 아래 코드는 내부 코드를 n번 반복하는 2가지 형식의 코드입니다.

 

for (int i = 0; i < n ; i++) {
	반복할 코드;
}

  첫 번째 형식은 초기식에서 변수의 값을 0으로 설정한 이후, 조건식에는 "n보다 작을 때까지"로 설정하면 for문은 코드를 n번 반복하게 됩니다. 물론 뒤의 증감식은 "i++"로 써주거나 "i+=1"처럼 i의 값을 1씩 증가하게끔만 해주면 됩니다. 

/* 5번 printf 문 사용 프로그램 */
#include <stdio.h>

int main(void) {

	for (int i = 0; i < 5; i++) { // 5번 반복하게 됩니다.
		printf("Hello World\n");
	}

	return 0;
}

  이 경우에서도 n이 5이기 때문에 "Hello World\n"를 총 5번 출력하게 됩니다. 이 첫 번째 형식은 크기가 n인 배열에서, 모든 배열의 원소를 확인할 수 있는 형식이기 때문에 중요합니다. 물론 아직 배열이 무엇인지 모르셔도 됩니다. 배열에 관한 내용은 추후 설명드리겠습니다.

 

  두 번째 n번 반복하는 for문 형식은 다음과 같습니다.

for (i = 1; i <= n ; i++) {
	반복할 코드;
}

  이 형식의 경우, 변수를 0이 아닌 1부터 시작하되, 조건식을 n보다 "작거나 같을" 때입니다. 첫 번째 형식의 for문에서 조건식은 n보다 "작을 때"이므로 두 형식의 조건식이 같지 않습니다. 이 경우에도 증감식은 변수 i가 1씩 증가하는 증감식을 써주면 됩니다.

 

  사실 이 반복문은 제가 애용하는 for문 형식이기도 합니다. 그 이유는 단순합니다. 반복되는 코드가 몇 번째 반복하는 코드인지 i값을 확인해볼 수 있습니다. 아래 예시는 아까 전에 실습했던 printf문을 5번 실행하는 프로그램 예제입니다. 그 예제에서 for문의 형식을 첫 번째 형식에서 두 번째 형식으로 바꾸었습니다. 그리고 내부 코드인 printf문을 실행할 때마다 변수 i 값도 같이 출력시키도록 수정하였습니다.

/* 5번 printf 문 사용 프로그램 */
#include <stdio.h>

int main(void) {

	for (int i = 1; i <= 5; i++) { // 5번 반복하게 됩니다.
		printf("%d번째 실행 : Hello World\n", i);
	}

	return 0;
}

 

  이렇게 되면 반복되는 내부 코드가 몇 번째로 반복되는 것인지 변수 i 값을 통해 알 수 있습니다. 이 또한 알아둔다면 매우 도움되는 코드이므로 손에 익혀 두는 것을 권장합니다.

1번째 실행 : Hello World
2번째 실행 : Hello World
3번째 실행 : Hello World
4번째 실행 : Hello World
5번째 실행 : Hello World

 

  그럼 한 번 프로그램을 만들어 봅시다. "생일 축하합니다 "를 15번 반복 출력합니다. 다만 아래와 같은 형식으로 출력해봅시다.

생일축하합니다!! 생일축하합니다!! 생일축하합니다!!
생일축하합니다!! 생일축하합니다!! 생일축하합니다!!
생일축하합니다!! 생일축하합니다!! 생일축하합니다!!
생일축하합니다!! 생일축하합니다!! 생일축하합니다!!
생일축하합니다!! 생일축하합니다!! 생일축하합니다!!

  조건은 for문은 단 1번만 사용해야 합니다. 또한 필요하다면 아래 내용을 참고하세요.

 

  • printf("\n"); 를 실행하면 줄바꿈만 됩니다.
  • "생일축하합니다!!"가 아닌 "생일축하합니다!! "와 같이 문자열에 공백을 남겨둬야 위와 같이 출력될 수 있습니다.
  • for문 내부에 if문을 사용해봅시다.

 

뭐 꼭 위의 참고 내용을 따르지 않아도 정답은 많습니다. 여러분의 개성대로 코드를 작성해보세요.

 

그러면 제 코드를 보여드리겠습니다

/* 생일 축하 메시지 출력 프로그램 */
#include <stdio.h>

int main(void) {

	for (int i = 1; i <= 15; i++) { // 15번 반복.
		printf("생일축하합니다!! ");
		if (i % 3 == 0) {
			printf("\n");
		}
	}

	return 0;
}

 

  우선 for(int i = 1; i <= 15; i++)를 통해 15번을 반복하되, 내부 코드가 몇 번째로 반복되는 지 알 수 있도록 두 번째 형식을 선택하였습니다. "생일축하합니다!! "를 출력하되 3의 배수 번째 (3, 6, 9, 12번째의) 실행에는 if문을 통해 3의 배수 번째 실행임을 검사하고 줄바꿈을 출력합니다.

 

∨ while문의 사용 목적

  for문은 "횟수 기반" 반복문이라고 하였는데요. 즉, 정해진 횟수만큼 반복할 때 쓰는 것이 for문입니다. 반대로 while문은 "조건 기반" 반복문입니다. 즉, 정해진 횟수는 없습니다. "조건만 만족된다면 계속" 반복하는 것이 while문의 특징입니다. 처음에 사용했던 while문의 예제를 다시 가져와 보았습니다.

/*사용자가 0을 입력할 때 까지 반복해서 입력받는 프로그램*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    int x = 1;

    while (x != 0) {
        printf("x값 입력:");
        scanf("%d", &x);
    }

    return 0;
}

  여기서 while문은 x의 값을 확인하여 0만 아니라면 내부 코드를 실행합니다. 내부 코드를 통해 사용자는 변수 x에 값을 입력할 수 있습니다. 즉, 이 코드에서 while문은 "사용자가 0을 입력할 때 까지" 반복합니다. 반복 횟수는 정해지지 않았죠. 

 

  프로그램을 하나 짜봅시다. 첫 번째 항이 1이고, 공비가 2인 등비수열이 있습니다. 등비수열의 항을 초항부터 하나씩 더합니다. 초항부터 n항까지의 합을 Sn이라고 해봅시다. Sn > 1000 이 되는 가장 작은 n을 찾는 프로그램을 작성해보세요.

 

  일단 생각해봅시다. 항을 "반복"해서 더하는 것이므로 반복문은 필요할 것 같습니다. 근데 '몇 번 더해야 하느냐' 생각하면 이는 어렵습니다. 1000보다 커질 때 까지 몇 번을 더해야 하는 지 모르겠거든요. 아무래도 for문은 별로일 것 같습니다. 하지만 while문은 어떨까요? 합을 반복해서 더하되 Sn이 1000보다 크지 않으면 다시 더하는 과정을 반복하면 될 것 같습니다!

 

  결과적으로 코드는 아래와 같습니다.

/* 1000보다 커질 때의 등비수열의 합 Sn과 n을 찾는 프로그램 */
#include <stdio.h>

int main(void) {
	int a = 1, r = 2; //초항 = 1, 공비 = 2
	int sum = 0;
	int count = 0; // 더한 횟수를 저장하는 변수 count

	while (sum < 1000) { // 합 sum이 아직 1000보다 작으면 반복
		sum += a; // 항을 더한다.
		count += 1; // 더한 횟수를 1회 증가시킨다.

		a *= r; // 항을 2배 키운다. (등비수열이니깐)
	}
	printf("%d까지의 합 sum = %d", count, sum);

	return 0;
}

  결과를 봅시다.

10까지의 합 sum = 1023

  실제로 Sn = 2n−1이므로 S10 = 210 − 1 = 1023입니다.

 

∨ do while

  while문에서 아쉬운 점이 있습니다. while문의 구성은 "조건검사 -> 코드실행"의 반복입니다. 근데 이 while문의 동작 방식과 반대로 "코드실행 -> 조건검사"의 반복이 필요할 때가 있습니다. 아래 예를 보겠습니다. 이 예시는 위에서 보았던 사용자가 0을 입력할 때까지 계속 입력을 반복하는 while문 코드입니다.

/*사용자가 0을 입력할 때 까지 반복해서 입력받는 프로그램*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    int x = 1;

    while (x != 0) {
        printf("x값 입력:");
        scanf("%d", &x);
    }

    return 0;
}

  이 프로그램은 정상적으로 작동합니다. 하지만 아쉬운 점이 있습니다. "사용자에게 입력을 받음 -> 0을 입력했는 지 검사" 이 형식으로 반복하고 싶지만 while문 동작 특성 상 "0을 입력했는 지 검사 -> 사용자에게 입력을 받음" 형식으로 실행하죠. 물론 여기선 x에 0이 아닌 값(int x = 1;)을 넣어놓았기 때문에 코드는 문제 없이 작동합니다.

 

  do while문은 while문과 달리 코드를 먼저 실행한 후 조건을 검사하는 반복문입니다. 따라서 최소 한 번은 반드시 코드가 실행됩니다. 이러한 특징 때문에, 위의 코드처럼 사용자에게 먼저 입력을 받고 그 값이 0인지 검사하는 흐름을 자연스럽게 구현할 수 있습니다. do while문의 형식은 다음과 같습니다.

do {
	반복할 코드;
} while(조건식);

  여기서 중요한 것은 while문과 달리 조건식 뒤에 세미콜론(;)를 써주어야 한다는 것 입니다. 이를 바탕으로 위 코드를 do while문으로 작성해봅시다.

/*사용자가 0을 입력할 때 까지 반복해서 입력받는 프로그램*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
    int x;

    do {
        printf("x값 입력:");
        scanf("%d", &x);
    } while (x != 0);

    return 0;
}

  이렇게 되면, 우선 조건식을 확인하지 않고, 사용자에게 입력을 받은 이후에 조건을 검사하여 반복 여부를 결정합니다. while문은 다음과 같다고 하였는데요.

while문을 표현하자면 if문의 나열처럼 표현할 수 있다.

  do while문도 그림으로 표현해봅시다. 이때 do while문은 do + while문처럼 생각하면 좋습니다.

do while문을 표현하자면 do + (if문의 나열)이라고 할 수 있다.

  먼저 코드를 실행(do)한 후 while문처럼 if문을 나열한 형태라고 할 수 있습니다. 이정도면 do while문은 충분히 이해하였습니다.

 

  for, while, do while이 무엇인지는 공부하였습니다. 이제 더 깊게 공부해봅시다.

 

∨ for문의 다양한 형식

  for문의 형식에 대해 이해해봅시다. for문의 형식은 위에서 배웠지만 다음과 같습니다. 솔직히 형식이 그리 간단하지는 않습니다. if문이나 while문에 비하면요. 이제 for문의 형식에 대해 정확히 알아봅시다. 

for (초기식; 조건식; 증감식) {
	반복할 코드;
}

  우선 세미콜론(;)에 대한 이야기를 해보겠습니다. for문 내부에는 세미콜론 두 개가 있습니다. 여기서 세미콜론의 역할은 구분자입니다. 이 세미콜론을 기준으로 왼쪽 자리는 초기식, 중간 자리는 조건식, 오른쪽 자리는 증감식을 넣어주게 됩니다. 

 

  꼭 초기식, 조건식, 증감식을 작성해야 하는 것은 아닙니다. 하지만 소괄호 ()내부의 세미콜론 2개는 꼭 써주고, 만약 초기식을 작성하지 않을 것이라면 초기식 자리를 비워두면 됩니다. 아래 코드에서도 초기식 자리만 남기고 아무것도 써주지 않으면 초기식은 작성되지 않습니다.

// 초기식 자리를 비워두기.
for ( ; i<3 ; i++) {
	반복할 코드
}

  조건식, 증감식도 마찬가지로 작성하지 않을 것이라면 자리만 비워두면 됩니다.

// 초기식과 증감식을 비워둔 for문
for ( ; i<3 ; ) {
	반복할 코드;
}

  참고로 for문에 조건식을 써주지 않으면 경우에 따라서 멈추지 않는 무한 루프가 됩니다. for문의 반복을 멈추게 하는 방법이 조건식이기 때문입니다. 물론 "break" 라는 키워드를 이용하여 반복문을 끝낼 수 있는 방법도 있습니다. 이 내용은 글의 마지막 부분에 설명드릴 예정입니다.

// 무한루프 for문, 조건식과 증감식을 비움.
for (int i = 0;;) {
	반복할 코드
}

 

  for문은 변수의 값을 이용하여 반복할 횟수를 정한다고 하였습니다. 예를 들면, 아래 코드에서는 변수 i의 값을 1로 설정한 후 5가 될 때까지 코드를 반복하면서, i값을 1씩 증가시키면 코드를 5번 반복하게 됩니다. 

// Hello!!를 5번 반복하는 for문
for (int i = 1 ; i <= 5 ; i++) {
	printf("Hello!!\n");
}

    즉, for문은 주로 변수의 값을 통해 반복 횟수를 제어합니다. 따라서 초기식에는 관습적으로 i와 같은 변수의 초기값을 설정하게 됩니다. 하지만 꼭 이처럼 변수의 초기값을 써주지 않아도 됩니다. 그저 초기식은 for문이 시작하면서 실행되는 코드임을 기억하세요. 따라서 아래와 같은 코드도 실행해볼 수 있습니다.

#include <stdio.h>

int main(void) {
	int x = 0;
	for (printf("hello"); x < 5; x++) { //초기식이 printf("hello")
		
	}
	return 0;
}

  초기식에 printf("hello")가 있으므로 for문이 실행될 때 제일 우선 "hello"가 출력됩니다. 쉼표 연산자를 이용해 초기식에 여러 코드를 아래와 같이 연이어 작성해보겠습니다.

#include <stdio.h>

int main(void) {
	int x;

	for (printf("hello"),x = 1; x < 5; x++) {
		
	}
	return 0;
}

 

  참고로 for 초기식에서 선언과 콤마 연산자는 같이 못 사용합니다. 즉, 아래와 같은 경우는 컴파일 에러가 나오기 때문에 안됩니다.

for (printf("hello"), int x = 1; x < 5; x++) {
		
}

 

  하지만 아래와 같이 초기식에서 여러 변수를 동시에 선언 및 초기화를 할 수 있습니다. 이 경우에서도 초기식에서 변수 x, sum을 선언하고 각각 0으로 초기화합니다.

#include <stdio.h>

int main(void) {
	for (int x = 0, sum = 0; x < 5; x++) { //초기식이 int x = 0, sum = 0
		
	}
	return 0;
}

 

  당연히 아래와 같이, 선언된 변수들에 값을 동시에 넣어주는 것도 가능합니다.

#include <stdio.h>

int main(void) {
	int x;
	int sum;
	for (x = 0, sum = 0; x < 5; x++) { //초기식이 x = 0, sum = 0
		
	}
	return 0;
}

 

 

  for문의 조건식을 보도록 하겠습니다. 사실 for문에서의 조건식은 if문이나 while문에서 쓰던 조건식과 별반 차이가 없습니다. 따라서 if문이나 while문에서 가능했던 것처럼, 복잡한 조건식을 사용할 수 있습니다.

 

  아래의 경우처럼 조건식에 &&(그리고)를 사용하여 변수 i의 값이 5보다 작고 또 동시에 변수 sum이 100보다 커야 반복하도록 조건식을 설정할 수 있습니다.

for (int i = 0; i < 5 && sum > 100 ; i++)

 

  조건식에 대한 내용은 사실 이 정도면 반복문을 사용하는데 무리가 없으므로 바로 증감식에 대해 다뤄보도록 하겠습니다.

 

  for문이 변수의 값을 통해 반복 횟수를 설정할 때 증감식은 중요한 역할을 합니다. 만약 변수 i 값을 1부터 10까지 하나씩 증가하면서 코드를 진행하게 하는 for문이 있다면, 변수 i의 값을 증가시키는 역할이 필요합니다. for문에서는 이 역할을 증감식이 맡아 합니다. 증감식은 위에서 보셨다시피 소괄호 () 내부, 오른쪽 자리에 작성합니다.

for (초기식; 조건식; 증감식) {
	반복할 코드;
}

 

  만약 변수 i를 가지고 반복 횟수를 제어한다면 증감식 자리에는 i의 값을 증가시키는 코드를 작성해주면 됩니다. 주로 "i++"를 사용합니다. 변수 i를 1씩 증가시키도록 하기 위함이죠.

for(int i = 0; i < 5 ; i++)

 

  사실 변수의 값이 1씩 증가시키기만 하는 것이 목적이라면 "i++"가 아닌 "i+=1"를 써주면 됩니다. 꼭 1씩 증가시키는 것이 아니라 아래와 같이 변수 i의 값을 2씩 증가시켜도 됩니다.

for(int i = 0; i < 5 ; i+=2)

  

  이를 이용하여 코드를 실행한다면 몇 번 반복하는 지 잠깐 실험해볼까요?

#include <stdio.h>

int main(void) {
	for (int i = 0; i < 5; i += 2) { //printf("hello\n")를 반복 출력
		printf("hello\n");
	}
	return 0;
}

  이 경우 변수 i의 값이 0일 때 부터 시작해서, 2일 때, 4일 때, 총 3번의 printf문이 실행됩니다. 그리고 변수 i의 값이 4에서 2가 증가하여 6이 되면 조건식 " i < 5 "를 만족하지 못하여 반복을 멈추게 됩니다.

 

  증가는 꼭 1씩, 2씩 증가시켜야 하는 것은 아닙니다. 2배씩 증가시키는 것도 가능합니다. 아래 증감식을 " i *= 2 "로 써주면 i가 2배씩 증가하게 됩니다.

#include <stdio.h>

int main(void) {
	for (int i = 1; i < 10; i *= 2) {
		printf("hello\n");
	}
	return 0;
}

 

 

  매우 중요한 것은 지금까지는 변수의 값을 작은 값에서 큰 값까지 증가시켜 반복 횟수를 제어했다는 것입니다. 이 방식이 주로 사용되긴 하지만, 변수의 값을 큰 값부터 시작하여 작은 값까지 줄여가면서 반복을 수행하도록 할 수 있습니다. 아래 예시를 보겠습니다.

for (int i = 10; i >= 1 ; i--) {
	printf("%d의 값\n", i);
}

 

  이는 변수 i의 값을 10부터 시작하여 1일 때까지 1씩 감소시키게끔 하는 for문입니다. 10 ~ 1까지 총 10번의 코드가 반복됩니다. 이때 조건식도 증가식이냐 감소식이냐에 따라 알맞게 설정해야 합니다. 증가식인 경우는 조건식을 "<", "<="를 사용하고, 감소식인 경우는 조건식을 ">", ">="를 사용합니다.

 

  증감식에 대한 가장 중요한 마지막 특징은 코드 반복 시 반복이 끝날 때 마다 증감식이 실행된다는 것입니다. 사실 증감식 자리에는 꼭 증가나 감소 연산을 작성할 필요는 없습니다. 그저 반복이 끝날 때마다 실행하고 싶은 코드를 작성하는 자리라고 생각하면 됩니다. 다만 프로그래머들끼리 for문의 증감식 자리에는 증감식을 써주기로 약속한 것 뿐이지요.

 

  이때 초기식과 마찬가지로 증감식에도 쉼표 연산자(,)를 이용하여 여러 코드를 실행시키게 할 수 있습니다.

예를 들어 다음과 같은 코드도 가능합니다.

 
#include <stdio.h>

int main(void) {
	for (int i = 0; i < 3; printf("반복 끝\n"), i++) { // 증감식이 printf문과 i++
		printf("반복 중\n");
	}
	return 0;
}

 

  사실 증감식 자리는 내부 코드가 실행된 후에 수행되는 코드이므로, 단순한 경우에는 내부 코드의 끝에 동일한 코드를 작성해도 비슷한 결과를 얻을 수 있습니다.

#include <stdio.h>

int main(void) {
	for (int i = 0; i < 3; ) { // 증감식 코드를 옮김.
		printf("반복 중\n");

		printf("반복 끝\n"); // 내부 코드 끝으로 옮김
		i++;
	}
	return 0;
}

 

   하지만 for문의 증감식은 반복 구조의 일부로 동작하기 때문에, 반복의 흐름을 한눈에 파악할 수 있게 해준다는 점에서 차이가 있습니다. 또한 continue문이라는 것이 사용될 경우에는 내부 코드의 끝에 작성한 코드가 실행되지 않을 수 있지만, 증감식은 정상적으로 실행된다는 차이도 존재합니다. continue문은 글의 마지막 부분에 설명드릴 예정입니다.

 

이처럼 for문은 다양한 형식을 가질 수 있고 어떤 특징을 가지고, 어떤 점을 주의해야 하는 지 알 수 있었습니다.   

 

∨ while문과 for문의 변환

  주로 시험에서는 while문과 for문이 변환되는 문제가 주로 나옵니다. 따라서 이 내용을 학습하는 것은 성적 관련해서도 중요하지만 while문과 for문을 이해하는 데도 중요한 내용이므로 알고 익혀두시면 C언어로 코드를 보다 수월히 작성하실 수 있게 됩니다.

 

  while문은 if문의 나열이라고 볼 수 있다고 하였습니다. for문도 크게 다를 것은 없습니다. 조건식을 검사하여 만족한다면 반복하는 것 자체가 while문과 크게 다를 것이 없으니깐요. 

while문을 표현하자면 if문의 나열처럼 표현할 수 있다.

  그래서 for문도 while문과 비슷하게 표현할 수 있습니다. 다만 짚고 넘어갈 부분은 for문에는 초기식과 증감식이 있습니다. 하지만 초기식은 for문이 시작될 때 한 번 실행되는 코드이고, 증감식은 반복 코드가 실행되고 나서 실행되는 코드임을 안다면 for문의 구조를 파악하고 while문으로 형식을 바꾸는 것은 어렵지 않을 것입니다. 따라서 for문을 그림으로 나타내면 다음과 같습니다.

for문을 표현하자면 초기식 + (if문과 증감식의 나열)처럼 표현할 수 있다.

  우선 초기식이 실행되고 while문처럼 조건식을 기반으로 if문이 나열되었다고 볼 수 있습니다. 이때 반복되는 if 조건문 내부 코드에는 증감식이 내부 코드의 끝부분에 추가되었다고 보면 좋습니다.

for (초기식;조건식;증감식) {
	반복할 코드;
}

 

  이제 for문을 while문으로 변환을 해보도록 하겠습니다. 일단 생각해봅시다. for문이 while문과 비슷하지 않나요? 우선 while문과의 차이는 초기식뿐입니다. for문을 변환할 때 초기식은 while문이 시작되기 전에 코드를 다음과 같이 삽입하면 될 것 같습니다. 

초기식;
while(조건식) {

}

 

  그 이후에 for문에 있는 반복할 코드와 증감식을 while문 내부에 추가해보도록 하겠습니다. 이때 증감식은 내부 코드의 끝부분에 추가하면 됩니다.

초기식;
while (조건식) {
	반복할 코드;

	증감식;
}

 

  이렇게 되면 99% for문 형식을 while문으로 변경하였습니다. 어느 정도 1% 차이는 있으나 예외적인 경우가 아니라면 거의 같다고 보셔도 무방합니다. (예외적인 경우란 변수의 범위나, continue에 대한 이야기지만 이 부분은 나중에.. 글 수정해서 따로)

 

∨ 다중 반복문

   다중 반복문이란 반복문이 겹쳐 있는 형태를 의미합니다. 즉, 반복문 안에 또 다른 반복문이 들어 있는 구조입니다. 쉽게 말해 “반복을 반복하는 것”입니다.

 

  예를 들어, 계란 하나를 휘핑하기 위해 200번 젓는다고 가정해봅시다. 그런데 계란이 30개라면 어떻게 해야 할까요? 200번 젓는 것을 30번 반복합니다. 즉, 200번 반복해서 젓는 것을 30번 반복합니다. 이중 반복문이죠? 코드로 표현하자면 다음과 같습니다.

for (int egg_count = 30; egg_count > 0; egg_count--) { // 계란 개수만큼 반복
    for (int stir = 0; stir < 200; stir++) { // 젓는 것을 200번 반복.
        printf("휘핑!\n");
    }
}

 

  이중 반복문에 대한 예제를 진행하기 전에 이중 반복문에 대한 감을 잡기 위해 이중 반복문을 그림으로 그려 보겠습니다. 우선 for문을 예시로 표현해보겠습니다. 우선 for문의 초기식을 잠시 지워보았습니다.

  for문 또한 if문의 나열로 이루어져 있는데 이 if문 내부에도 똑같이 반복문이 형성되어 있는 모습을 보실 수 있습니다. 이처럼 외부 반복문이 큰 블럭의 반복이 되는 것이고 내부 반복문이 큰 블럭 안에 있는 작은 블럭의 반복이 되는 것입니다.

 

 

  이제 이중 반복문이 사용되는 예시를 보도록 합시다. 바로 별 계단 쌓기 입니다.

*
**
***
****
*****

 

이 예제는 대부분의 컴퓨터 학원과 대학교에서 가르치는 내용입니다. 이중 반복문을 배운다면 무조건 하게 되는 예제이죠. 처음 이 예제를 마주하신다면 혼자서 도전 해보시는 것도 나쁘지 않습니다. 다음을 참고하시면 도움이 될 수 있습니다.

 

  • for문 내부에 for문을 사용하는 것을 권장한다.
  • 별을 가로로 나열하는 것도 반복문을 사용한다.
  • 위 과정을 층마다 반복한다. (1층 별 가로로 나열, 2층 별 가로로 나열, ...)
  • 위에서부터 1층은 별을 1개 출력하고, 위에서부터 2층은 별을 2개 출력한다.
  • 층마다 반복이 끝나면 printf("\n")를 실행하여 다음 층으로 넘어갈 수 있다.

  아래 코드와 같이 작성할 수 있습니다.

/* 5층짜리 별 계단을 출력하는 프로그램 */
#include <stdio.h>

int main(void) {
	for (int i = 1; i <= 5; i++) { //층 계수 1, 2, 3, 4, 5, 총 5번 반복.
		for (int n = 1; n <= i; n++) { // * 출력을 반복하는 for문. 3층이면 *을 3번 반복 출력.
			printf("*");
		}
		printf("\n"); // 층마다 *를 다 출력하고 나면, 다음층으로 넘어가기 위한 줄바꿈 출력.
	}
	return 0;
}

 

  별을 가로로 *** 쌓는 것은 printf("*")의 반복입니다. 근데 이것을 또 층마다 반복해야 하니 이중 반복문을 사용하는 것이죠. 이때 층수만큼 별을 쌓기 위해서 (위에서부터 1층이라고 가정) 내부 반복문의 조건식을 "n <= i"로 하였습니다. 즉 층수만큼 "*"를 반복 출력하기 위함이죠.

 

  그럼 다음은 while문과 for문을 중첩하는 프로그램을 작성해보겠습니다. 이번에는 구구단을 출력하는 프로그램인데, 사용자가 한계 값을 입력하면 구구단을 진행하다가 그 결과가 한계 값을 넘는 순간 더 이상 새로운 단으로 진행하지 않는 방식입니다. 결과값이 한계 값을 초과하더라도, 이미 시작한 단에 대해서는 9까지 모두 출력하고, 그 다음 단으로 넘어가지 않는 구조로 구현해보겠습니다. 다음을 참고하면 좋을 것입니다.

  • while문 대신 do while문을 사용하는 것을 권장합니다.
  • printf("%d * %d = %d\t", i, j, i * j);를 for문으로 9번 반복하면 됩니다.
한계를 입력하세요 : 30
1 * 1 = 1       1 * 2 = 2       1 * 3 = 3       1 * 4 = 4       1 * 5 = 5       1 * 6 = 6       1 * 7 = 7       1 * 8 = 8       1 * 9 = 9
2 * 1 = 2       2 * 2 = 4       2 * 3 = 6       2 * 4 = 8       2 * 5 = 10      2 * 6 = 12      2 * 7 = 14      2 * 8 = 16      2 * 9 = 18
3 * 1 = 3       3 * 2 = 6       3 * 3 = 9       3 * 4 = 12      3 * 5 = 15      3 * 6 = 18      3 * 7 = 21      3 * 8 = 24      3 * 9 = 27
4 * 1 = 4       4 * 2 = 8       4 * 3 = 12      4 * 4 = 16      4 * 5 = 20      4 * 6 = 24      4 * 7 = 28      4 * 8 = 32      4 * 9 = 36
한계를 입력하세요 : 123
1 * 1 = 1       1 * 2 = 2       1 * 3 = 3       1 * 4 = 4       1 * 5 = 5       1 * 6 = 6       1 * 7 = 7       1 * 8 = 8       1 * 9 = 9
2 * 1 = 2       2 * 2 = 4       2 * 3 = 6       2 * 4 = 8       2 * 5 = 10      2 * 6 = 12      2 * 7 = 14      2 * 8 = 16      2 * 9 = 18
3 * 1 = 3       3 * 2 = 6       3 * 3 = 9       3 * 4 = 12      3 * 5 = 15      3 * 6 = 18      3 * 7 = 21      3 * 8 = 24      3 * 9 = 27
4 * 1 = 4       4 * 2 = 8       4 * 3 = 12      4 * 4 = 16      4 * 5 = 20      4 * 6 = 24      4 * 7 = 28      4 * 8 = 32      4 * 9 = 36
5 * 1 = 5       5 * 2 = 10      5 * 3 = 15      5 * 4 = 20      5 * 5 = 25      5 * 6 = 30      5 * 7 = 35      5 * 8 = 40      5 * 9 = 45
6 * 1 = 6       6 * 2 = 12      6 * 3 = 18      6 * 4 = 24      6 * 5 = 30      6 * 6 = 36      6 * 7 = 42      6 * 8 = 48      6 * 9 = 54
7 * 1 = 7       7 * 2 = 14      7 * 3 = 21      7 * 4 = 28      7 * 5 = 35      7 * 6 = 42      7 * 7 = 49      7 * 8 = 56      7 * 9 = 63
8 * 1 = 8       8 * 2 = 16      8 * 3 = 24      8 * 4 = 32      8 * 5 = 40      8 * 6 = 48      8 * 7 = 56      8 * 8 = 64      8 * 9 = 72
9 * 1 = 9       9 * 2 = 18      9 * 3 = 27      9 * 4 = 36      9 * 5 = 45      9 * 6 = 54      9 * 7 = 63      9 * 8 = 72      9 * 9 = 81
10 * 1 = 10     10 * 2 = 20     10 * 3 = 30     10 * 4 = 40     10 * 5 = 50     10 * 6 = 60     10 * 7 = 70     10 * 8 = 80     10 * 9 = 90
11 * 1 = 11     11 * 2 = 22     11 * 3 = 33     11 * 4 = 44     11 * 5 = 55     11 * 6 = 66     11 * 7 = 77     11 * 8 = 88     11 * 9 = 99
12 * 1 = 12     12 * 2 = 24     12 * 3 = 36     12 * 4 = 48     12 * 5 = 60     12 * 6 = 72     12 * 7 = 84     12 * 8 = 96     12 * 9 = 108
13 * 1 = 13     13 * 2 = 26     13 * 3 = 39     13 * 4 = 52     13 * 5 = 65     13 * 6 = 78     13 * 7 = 91     13 * 8 = 104    13 * 9 = 117
14 * 1 = 14     14 * 2 = 28     14 * 3 = 42     14 * 4 = 56     14 * 5 = 70     14 * 6 = 84     14 * 7 = 98     14 * 8 = 112    14 * 9 = 126
/* 한계값까지의 구구단 출력 */
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void) {
	int limit = 0; 

	printf("한계를 입력하세요 : ");
	scanf("%d", &limit);

	int i = 1; // 구구단에서 몇 번째 단인지 (3단인지 8단인지) 저장하는 변수 i
	do {
		for (int j = 1; j <= 9; j++) { // 구구단 출력하는 반복문
			printf("%d * %d = %d\t", i, j, i * j);
		}
		printf("\n"); // 다음 줄로 넘어간다.
		i++; // 만약 3단이라면 4단으로 증가시킨다.
	} while ((i - 1) * 9 <= limit); 
// 만약 3단을 출력하였다면 현재 변수 i는 4이므로 (4 - 1) * 9를 검사하여 한계값보다 작다면 구구단 출력을 반복한다.
	
    return 0;
}

 

  이중 반복문 외에도 삼중 반복문처럼 더 많은 반복문을 겹쳐 코드를 구현할 수 있습니다. 다만 이중 반복문을 이해한다면 다중 반복문은 쉽게 익힐 수 있습니다.

 

 

∨ continue와 break 

  continue와 break는 모두 반복문인 for, while, do while의 흐름을 제어하는 키워드입니다. 우선 continue는 현재 반복을 즉시 종료하고, 다음 반복으로 넘어가게 하는 키워드입니다. 즉, continue를 만나면 이후에 남아있는 코드는 실행되지 않고, 바로 다음 반복으로 진행됩니다. 예를 들어 다음과 같은 코드가 있습니다.

for (int i = 1; i <= 5; i++) {
	if (i == 3) { // i가 3이라면 이번 반복은 건너 뛴다.
		continue;
	}
	printf("%d\n", i);
}

  이 코드를 실행하면 3은 출력되지 않습니다. i == 3일 때 continue가 실행되어 printf를 건너뛰고 다음 반복으로 넘어가기 때문입니다. 따라서 결과는 3을 건너뛰어 다음과 같이 출력합니다.

1
2
4
5

 

 

  반면 break는 반복문 자체를 즉시 종료하는 키워드입니다. break를 만나면 반복문을 완전히 빠져나오게 됩니다. 이 코드를 실행하면 3을 만나자마자 반복문이 종료되므로, 1과 2만 출력됩니다.

for (int i = 1; i <= 5; i++) {
	if (i == 3) { // i가 3이라면 반복문 자체를 빠져 나온다.
		break;
	}
	printf("%d\n", i);
}

 

  따라서 결과는 다음과 같습니다.

1
2

 

  그림으로 표현하자면 continue와 break의 느낌은 다음과 같습니다. 우선 for문과 while문 모두 if문의 나열이라고 볼 수 있다고 하였으므로 그림에서 임의의 반복문을 if문의 나열로 표현해보겠습니다. 이때 continue는 다음 if문으로 이동하는 것이라면 break는 if문의 나열 자체를 아예 벗어나는 것이라고 볼 수 있습니다. 

 

  그럼 다음 예제로 넘어가봅시다. 다음 예제는 while문과 for문을 중첩해서 사용해볼 것입니다. 이번에는 사용자가 원금을 입력하면 이자가 붙은 10년 후의 금액을 출력하는 프로그램을 작성해보겠습니다. 이때 사용자가 0을 입력하면 반복을 끝내게 합니다. 한 번 작성을 해보되 다음을 참고하세요.

 

  • while(1) { } 이는 이론상 무한루프입니다.
  • 무한루프 내에서 특정 조건을 만족시켰을 때 while문을 빠져나오게 하는 것을 권장드립니다.
  • if (조건식)과 break를 이용하면 무한루프를 벗어나는 동작을 구현할 수 있습니다.
/* 사용자의 원금 계산 프로그램 */
#include <stdio.h>

int main(void) {
	int A = 0; //원금 A
	float r = 0, total = 0; // 이자율 r, 최종 금액 total
	int year = 10; // 10년

	printf("이율을 입력하세요 (퍼센트로): ");
	scanf("%f", &r);

	while(1) {
		printf("원금을 입력하세요 (종료 시 0): ");
		scanf("%d", &A);

		if (A == 0) { // 사용자가 0을 입력하였으면 while문을 빠져나온다.
			break;
		}

		total = (float)A;
		
		for (int i = 1; i <= year; i++) { //10년 반복(10번 반복)
			total *= (1 + r / 100.0); // 1년마다 이율을 곱한다.
		}
		
		printf("최증 금액은 %f입니다.\n", total);
	} 
	return 0;
}

  일단 원금을 정수 데이터로 입력받습니다. 보통 금액을 입금할 때 실수형 데이터를 입력하지 않는 것 때문도 있지만 저번에 말씀드린 것 처럼 사용자가 입력한 데이터가 0인지 확인해야 하는데, 실수형 데이터로 검사하기 까다롭기 때문입니다. 따라서 정수형 데이터로 원금을 선언하고 입력 받습니다.

 

  이때 while문을 무한루프로 작동시킵니다. 무한루프로 작동시키는 법은 while(조건식)에서 조건식에 1을 넣는 것입니다. 0이외의 값은 참을 의미하기 때문인데, 주로 1이 참을 나타내는 데 사용되기 때문입니다.

while(1) {
	...
    
}

 

  while문 내부에서 원금을 입력받은 후 다음과 같이 if문을 통해 입력값이 0인지 확인하고 맞다면 break를 통해 while문을 빠져나옵니다.

if (A == 0) { // 사용자가 0을 입력하였으면 while문을 빠져나온다.
	break;
}

 

  만약 입력값이 0이 아니라면 원금을 입력받은 변수 A의 값을 float형으로 변환하여 total 변수에 대입합니다. total 변수는 float형 변수이기 때문입니다. 그 후 for문은 10년동안 이자가 붙는 동작을 수행하는 코드입니다. 즉, 1년마다 이자를 곱하는 것을 10번 반복해야 하므로 이를 반복문으로 구현한 것이죠. 이자를 곱한 값은 total에 저장합니다.

total = (float)A;

for (int i = 1; i <= year; i++) { //10년 반복(10번 반복)
	total *= (1 + r / 100.0); // 1년마다 이율을 곱한다.
}

 

  참고로 이자율을 퍼센트로 입력받았으므로 100.0으로 나누어주어야 합니다.

 

  break와 continue는 문제가 있습니다. 무엇이냐면 이중 반복문일 때 원하는 대로 행동하지 않는다는 것인데요.

 

∨ 이중 반복문에서의 continue와 break

  이번 부분에서 설명드릴 내용의 핵심은 continue나 break나 같으므로 break를 예를 들어 설명드리겠습니다. 아래 코드는 i와 j의 값을 나열하는 반복문입니다. 외부 반복문에서 변수 i를 사용하고 내부 반복문에서 변수 j를 사용합니다. 이때 내부 반복문에서는 변수 j가 2일 때 break 되도록 코드가 작성되어 있습니다. 그렇다면 결과는 어떻게 될까요?

#include <stdio.h>

int main(void) {
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (j == 2) break;
            printf("i=%d, j=%d\n", i, j);
        }
    }

	return 0;
}

  변수 j가 2가 되면 if문의 break가 실행되어 내부 반복문을 빠져나옵니다. 하지만 곧바로 외부 반복문에 의해 변수 i값을 증가시키고 다시 한번 반복하게 됩니다. 

i=0, j=0
i=0, j=1
i=1, j=0
i=1, j=1
i=2, j=0
i=2, j=1

 

  이 상황은 아래 그림과 같이 나타낼 수 있습니다. 여기서 바깥 반복문이 큰 블럭, 내부 반복문이 작은 블럭입니다. 이때 내부 반복문에서의 continue와 break는 내부 반복문을 건너뛰거나 빠져나올 수 있을 뿐, 바깥 반복문을 벗어나오지는 못합니다.

  

  물론 이중 반복문이라고 하더라도 내부 반복문에서의 break가 아닌 바깥 반복문에 있는 break에 의해서라면 반복문을 벗어나올 순 있습니다. 하지만 내부 반복문에서 벗어나올 방법은 없어보입니다.

 

 

  이런 문제를 해결하는 방법은 대략 2가지가 있습니다. 하나는 플래그 변수를 세워두는 것이고, 두 번째는 goto문을 사용하는 것입니다. 첫 번째로 플래그 변수를 이용하는 방법은 간단합니다. 내부 반복문에서 break와 더불어 플래그 변수의 값을 특정 값으로 설정하는 것입니다. 이 코드에서 플래그 변수는 stop입니다.

int stop = 0;

for (int i = 0; i < 3 && !stop; i++) {
    for (int j = 0; j < 3; j++) {
        if (j == 1) {
            stop = 1;
            break;
        }
    }
}

   이때 중요한 것은 바깥 반복문의 조건문에 플래그 변수를 포함하는 것입니다. 즉, 내부 반복문에서 break를 사용하게 되면 바깥 반복문이 다시 한 번 실행되려고 하는데, 이 때 플래그 변수를 이용하여 바깥 반복문의 조건식에 영향을 주어 바깥 반복문의 반복을 제한하는 것입니다.

 

  두 번째 방법은 goto문입니다. 이는 다음 글에서 다룰 예정인 문법인데, 과거에는 비교적 자주 사용되었지만 현재는 코드의 흐름을 복잡하게 만들고 가독성을 떨어뜨릴 수 있기 때문에 사용을 지양하는 것이 일반적입니다. 따라서 특별한 경우가 아니라면 goto문보다는 반복문과 조건문을 활용하여 구조적으로 문제를 해결하는 것이 권장됩니다.

goto label;

  ... 중간 코드

label: // 콜론(:)까지 써주어야 함!

 

  여기서 label은 사용자 임의대로 이름을 바꾸어도 됩니다. 이렇게 하면 goto label; 이 실행되고 label이 있는 곳으로 이동하게 됩니다. 이제 이 goto문을 이중 반복문에서 사용해보겠습니다.

for (int i = 0; i < 3; i++) {
    for (int j = 0; j < 3; j++) {
        if (j == 1) goto END;
    }
}
END:

   이렇게 하면 내부 반복문에서 goto문으로 END가 있는 곳으로 이동합니다. 결과적으로 반복문을 빠져나오게 됩니다. 

∨ 연습

 

∨ 정리

 

 

'지식 아카이브 > C언어' 카테고리의 다른 글

Chapter 10. C언어 : 조건문. 프로그램의 실행 흐름의 분기. if문의 모든것.  (0) 2026.04.19
Chapter 8.5. C언어 : 비트 연산자 부연 설명. 하드웨어적 연산 비트 연산!  (0) 2026.04.19
Chapter 8. C언어 : 연산자, 사칙 연산부터 비교 연산까지!  (0) 2026.04.19
Chapter6. C언어 : 변수의 자료형, unsigned vs signed  (0) 2026.04.15
Chapter5. C언어 : 변수의 선언, 대입, 초기화, 참조.  (0) 2026.04.15
'지식 아카이브/C언어' 카테고리의 다른 글
  • Chapter 10. C언어 : 조건문. 프로그램의 실행 흐름의 분기. if문의 모든것.
  • Chapter 8.5. C언어 : 비트 연산자 부연 설명. 하드웨어적 연산 비트 연산!
  • Chapter 8. C언어 : 연산자, 사칙 연산부터 비교 연산까지!
  • Chapter6. C언어 : 변수의 자료형, unsigned vs signed
검정부기
검정부기
안녕하세여. 한성대학교 AI응용학과에 재학중인 대학생입니다!! 공부 내용 개인적으로 정리하고, 도움이 될만한 내용은 공유하기 위해 개인적으로 만든 블로그입니다. 댓글 아무거나 쓰셔도 상관없습니다. 무엇이든 질문하셔도 됩니다, 틀린 질문도 괜찮습니다, 성실히 답변해드리겠습니다!
  • 검정부기
    검정부기
    검정부기
  • 전체
    오늘
    어제
    • 분류 전체보기 (55)
      • 강의 아카이브 (11)
        • Python for AI (1)
        • 선형대수 (2)
        • 컴퓨터 프로그래밍 (4)
        • 웹프로그래밍기초 (2)
        • 확률 및 통계 (2)
        • 사회데이터의 이해 (0)
        • 생활 속의 인공지능 (0)
        • 생활 속의 빅데이터 (0)
      • 지식 아카이브 (12)
        • 파이썬 (1)
        • C언어 (11)
        • 웹프로그래밍 (0)
        • 확률 통계 (0)
        • 선형대수 (0)
        • git & github (0)
        • 리눅스 (0)
        • 컴퓨터 구조 (0)
        • 운영체제 (0)
        • 네트워크 (0)
      • Daily 아카이브 (29)
        • 공부일지 (22)
        • IT 에세이 (0)
        • 프로젝트 (1)
        • 아무거나 쓰는 곳 (4)
        • 연습 일지 (0)
        • 일기 (2)
      • 알쓸 아카이브 (2)
        • 군대 (IT) (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 블로그 사용법
    • 안녕하세용. 반갑습니다.
  • 인기 글

  • 태그

    수업정보
    파이썬
    서류심사
    시험대비
    ai학과
    ai
    강의
    정보보호병
    육군
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
검정부기
Chapter 12. C언어 : 반복문, for, while, do while문. continue, break까지
상단으로

티스토리툴바