break, continue, goto로 반복문 제어하기
이번에는 제어문 중 나머지 항목들을 살펴보겠습니다.
break
문은 반복문이나 switch
문에서 실행 흐름을 즉시 빠져나갈 때 사용합니다.
continue
문은 현재 반복을 중단하고, 다음 반복을 진행하기 위해 반복문의 조건 검사 또는 증감식 등으로 바로 넘어갑니다.
goto
문은 코드 내에 지정된 레이블로 무조건 이동할 때 사용되며, 일반적으로는 사용을 지양하지만 특정 상황에서 유용하게 쓰일 수 있습니다.
> // 점프 문: break 문, continue 문, goto 문, ..., return
의사 코드:
BreakPseudo.txt
> // 점프 문: break 문: break로 반복문 끝내기
>
> var goal = 3;
>
> var result = "";
>
> for (var i = 0; i < 100; i++)
. {
. if (i == goal)
. {
. break;
. }
. result += "Hello\n";
. }
>
> result
"Hello\nHello\nHello\n"
>
ContinuePseudo.txt
> // 점프 문: continue 문: continue 문으로 반복문 코드 건너뛰기
> // 1부터 100까지 정수 중 7의 배수를 제외한 수들의 합계
>
> var sum = 0;
>
> for (var i = 1; i <= 100; i++)
. {
. if (i % 7 == 0)
. {
. continue;
. }
. sum += i;
. }
>
> sum
4315
>
break, continue, goto로 반복문 제어하기
✅ continue
문
- 가장 가까운 반복문(
for
,while
,do-while
)의 조건식으로 제어를 건너뜀 - 반복 중
continue
를 만나면 나머지 코드는 실행하지 않고, 다음 반복을 위해 조건식을 다시 평가함 - 반복을 계속하되, 현재 반복의 뒷부분을 생략하고 넘어갈 때 사용
🛑 break
문
- 반복문(
for
,while
,do-while
)을 즉시 종료하고 반복문 바깥의 코드로 이동 - 조건과 관계없이 반복을 빠져나가야 할 때 사용
- 일반적으로
switch
문에서도 분기 종료를 위해 사용됨
📌 goto
문
- 코드의 특정 위치(레이블)로 무조건 이동하는 명령문
- 레이블(label)은
레이블이름:
형태로 정의하며,goto 레이블이름;
으로 이동함 - 프로그램 흐름을 원하는 위치로 강제 이동할 수 있으나, 구조적 프로그래밍 관점에서는 사용을 지양함
break 문
반복문(for
, do
, while
)을 빠져나올 때에는 break
문을 사용할 수 있습니다.
아무것도 하지 않는 프로그램
다음 코드는 말 그대로 아무것도 하지 않는 프로그램입니다. for
문 안에 break
를 두어서 바로 for
문을 빠져 나옵니다.
코드: break_for.c
int main(void)
{
for (int i = 0; i < 5; i++)
{
if (i >= 0)
{
break; // 현재 코드를 만나면 현재 for 문을 종료함
}
} // end of for
return 0;
}
break
키워드를 사용하여 for
, while
, do
반복문을 바로 빠져 나올 수 있습니다.
무한 루프(Infinite Loop) 빠져 나오기
프로그래밍 언어에서 무한 루프는 루프를 무한정 도는 경우를 말합니다. 특정 조건을 만족할 때에 루프를 빠져나올 땐 break
문을 사용할 수 있습니다.
코드: break_infinite_loop.c
#include <stdio.h>
int main(void)
{
int number = 0;
while (1) // 무한 루프: 1(참)일 동안 계속 실행
{
printf("%d\n", ++number);
if (number >= 5)
{
break; // break 문으로 number가 5 이상이면 무한 루프 빠져 나오기
}
}
return 0;
}
1
2
3
4
5
while (1) {}
코드는 무한 루프입니다. while
문이 계속해서 반복하도록 설정한 후에 number
값을 1씩 증가시켜 출력 후 5보다 크게되면 break
문에 의해서 while
문을 빠져나오도록 설정하였습니다.
break로 반복문 끝내기
다음 코드는 0부터 99까지 반복하는 코드에서 5일 때 for
문을 종료합니다.
코드: break_demo.c
#include <stdio.h>
int main(void)
{
// break 문: for, while, do 문을 빠져나가는 역할
for (int i = 0; i < 100; i++)
{
if (i == 5)
{
break; // i == 5일 때 break 문으로 for 문 종료
}
printf("%d번 반복\t", (i + 1));
}
printf("\n");
return 0;
}
1번 반복 2번 반복 3번 반복 4번 반복 5번 반복
for
문과 while
문에서 break
문을 만나면 바로 반복문을 더 이상 실행하지 않고 빠져나오게 됩니다.
break 문을 사용하여 while 문 빠져나오기
이번에는 while
문 안에서 break
문을 사용하여 반복문을 중단하는 예제를 살펴보겠습니다.
이 프로그램은 1부터 10까지 정수를 차례로 더해가다가, 합계가 22 이상이 되는 순간 반복을 멈춥니다.
코드: while_sum_break.c
// 1부터 10까지 정수의 합을 구해나갈 때, 합이 22 이상이 되면 멈추는 프로그램
#include <stdio.h>
int main(void)
{
int goal = 22;
int sum = 0;
int i = 1;
while (i <= 10)
{
sum += i;
if (sum >= goal)
{
break; // 반복문 탈출
}
i++;
}
printf("1부터 %d까지의 합은 %d이고, ", i, sum);
printf("목표치 %d 이상을 달성했습니다.\n", goal);
return 0;
}
1부터 7까지의 합은 28이고, 목표치 22 이상을 달성했습니다.
이처럼 break
문은 반복문 안에서 조건이 충족되었을 때 반복을 즉시 종료하고 빠져나올 때 사용할 수 있습니다.
위 예제에서는 합계가 목표치 이상이 되는 순간 break
문을 통해 while
문을 벗어나게 됩니다.
continue 문으로 코드 건너뛰기
이번에는 continue
문을 사용하여 반복문 안에서 특정 코드를 건너뛰는 방법을 알아보겠습니다.
이 프로그램은 1부터 5까지 숫자 중 홀수만 출력하는 예제입니다.
코드를 작성한 뒤, 부록의 디버거 사용하기를 참고하여 F10
과 F11
키를 눌러 한 줄씩 실행해보면 continue
문이 어떻게 동작하는지 쉽게 이해할 수 있습니다.
코드: for_if_continue.c
// [?] continue 문을 사용하여 반복문(for, while, do)에서 다음 반복으로 이동하기
#include <stdio.h>
int main(void)
{
for (int i = 1; i <= 5; i++)
{
if (i % 2 == 0)
{
// [!] 짝수인 경우, 아래 코드를 건너뛰고 다음 반복으로 이동
continue;
}
printf("%d\n", i); // 1, 3, 5 출력
}
return 0;
}
1
3
5
이 프로그램에서는 for
문을 사용하여 1부터 5까지 반복합니다.
반복문 안에서 if
문으로 현재 숫자가 짝수인지 검사하고, 짝수일 경우 continue
문을 실행해 printf()
를 건너뜁니다.
continue
문을 만나면 해당 반복의 나머지 코드는 실행되지 않고, 바로 다음 반복으로 넘어갑니다.
for
문에서는 이때 증감식(i++
)으로 곧바로 이동합니다.
continue
문은 for
문뿐만 아니라 while
, do-while
문에서도 동일한 방식으로 작동합니다.
continue 문으로 3의 배수를 제외한 수의 합 구하기
이번에는 continue
문을 사용하여 1부터 100까지의 수 중 3의 배수를 제외한 합을 구해보겠습니다.
코드: continue_demo.c
// continue 문: 반복문에서 아래 실행문을 건너뛰고 다음 반복으로 이동
#include <stdio.h>
int main(void)
{
//[!] 1부터 100까지 정수 중 3의 배수를 제외한 수의 합 구하기
int sum = 0;
for (int i = 1; i <= 100; i++)
{
if (i % 3 == 0)
{
continue; // 3의 배수이면 아래 코드를 건너뛰고 다음 반복으로 이동
}
sum += i;
}
printf("SUM: %d\n", sum); // 3367
return 0;
}
SUM: 3367
위 코드에서 if (i % 3 == 0)
조건문은 현재 수가 3의 배수인지 확인합니다.
3의 배수인 경우 continue
문이 실행되어 sum += i;
문은 건너뛰고, 반복문의 다음 단계로 넘어갑니다.
이렇게 함으로써 3의 배수를 제외한 나머지 수들만 sum
변수에 더해지며, 결과적으로 합계는 3367이 됩니다.
C 언어로 1부터 입력받은 숫자까지 3의 배수만 출력하기
while 문과 break 문 함께 사용하기
이번에는 while
문과 break
문을 함께 사용하여, 1부터 10까지 정수를 더해 가다가 합이 22 이상이 되면 반복을 멈추는 프로그램을 만들어 보겠습니다.
코드: while_break.c, WhileBreak.c
// 1부터 10까지 정수의 합을 구해나갈 때, 합이 22 이상이 되면 멈추는 프로그램
#include <stdio.h>
int main(void)
{
int goal = 22;
int sum = 0;
int i = 1;
while (i <= 10)
{
sum += i;
if (sum >= goal)
{
break; // 목표치를 넘으면 반복 종료
}
i++;
}
printf("1부터 %d까지의 합은 %d이고, ", i, sum);
printf("목표치 %d 이상을 달성했습니다.\n", goal);
return 0;
}
1부터 7까지의 합은 28이고, 목표치 22 이상을 달성했습니다.
이 프로그램에서는 while
문을 사용하여 정수를 차례대로 더해가다가,
합계가 목표치(22) 이상이 되는 순간 break
문을 만나 반복을 종료합니다.
따라서 최종 출력 결과는 1부터 7까지 더한 값(28)이며, 이로써 목표를 달성했음을 확인할 수 있습니다.
goto로 프로그램 흐름 제어하기
goto
문은 프로그램의 실행 흐름을 지정한 레이블(label)로 강제로 이동시키는 기능을 합니다.
레이블은 일종의 책갈피 역할을 하며, C 언어에서는 레이블 이름 뒤에 콜론(:
)을 붙여 선언합니다.
레이블 자체는 단독으로는 실행되지 않으며, goto
문을 통해 해당 레이블로 이동할 때 비로소 실행이 시작됩니다.
레이블:
goto 레이블;
goto 문 사용 예제
이번 예제에서는 goto
문을 이용해 사용자의 입력값에 따라 프로그램 흐름을 분기시켜 보겠습니다.
코드: goto_demo.c, GoToDemo.c
// goto문: 지정한 레이블(책갈피)로 이동하는 명령
#define _CRT_SECURE_NO_WARNINGS // scanf() 보안 경고 방지
#include <stdio.h>
int main(void)
{
int chapter = 0;
int r = 0;
printf("시작\n");
Start:
printf("0, 1, 2 중 하나 입력: _\b");
r = scanf("%d", &chapter);
if (chapter == 1)
{
goto Chapter1;
}
else if (chapter == 2)
{
goto Chapter2;
}
else
{
goto End;
}
Chapter1:
printf("1장입니다.\n");
Chapter2:
printf("2장입니다.\n");
goto Start;
End:
printf("종료\n");
return 0;
}
시작
0, 1, 2 중 하나 입력: 1
1장입니다.
2장입니다.
0, 1, 2 중 하나 입력: 2
2장입니다.
0, 1, 2 중 하나 입력: 0
종료
해설
사용자가 입력한 값에 따라 프로그램의 흐름이
goto
문으로 분기됩니다.1
입력 시 →Chapter1:
레이블로 이동하여 "1장입니다." 출력2
입력 시 →Chapter2:
레이블로 이동하여 "2장입니다." 출력- 그 외 입력 시 →
End:
레이블로 이동하여 프로그램 종료
goto Start;
문을 통해 반복 입력을 유도하고 있습니다.주의:
Chapter1:
레이블 아래에Chapter2:
레이블이 있기 때문에, 1을 입력한 경우 두 레이블의 코드가 모두 실행됩니다.
goto 문을 사용하여 반복문 없이 반복하기
이번 예제에서는 for
, while
, do-while
과 같은 전통적인 반복문 없이, goto
문을 이용해 반복을 구현해 보겠습니다.
코드: goto_loop.c
#include <stdio.h>
int main(void)
{
int i = 0; // 초기화
loop_body:
printf("C Language\n"); // 실행문
i++; // 증감
if (i < 3) // 반복 조건
{
goto loop_body; // 레이블로 이동하여 반복
}
return 0;
}
C Language
C Language
C Language
- 변수
i
는 반복 횟수를 세기 위한 카운터입니다. loop_body:
는 레이블로,goto
문을 통해 이 위치로 이동할 수 있습니다.i++
로 값을 1씩 증가시키면서,i < 3
조건이 참이면goto loop_body;
문을 실행하여 다시 레이블 위치로 이동합니다.- 이 과정을 통해
"C Language"
가 총 3번 출력됩니다.
⚠️
goto
문을 사용해 반복을 구현할 수는 있지만, 가독성과 유지보수 측면에서 일반적인 반복문(for
,while
) 사용이 훨씬 권장됩니다. 이 예제는 학습 목적으로goto
문을 이해하기 위한 것입니다.
장 요약
C 언어에서 제공하는 문(statements)에서 점프 문을 사용해보았습니다. 점프 문은 for
, do
, while
문과 함께 사용하여 실행 시점을 다른 곳으로 이동(점프)시키는 역할을 합니다. 참고로 goto
문은 최근에는 거의 사용되지 않는 구문입니다. 제어문에 대한 내용은 여기까지 다루고 여러 데이터를 다루는 배열을 학습해나가도록 하겠습니다.
goto 문을 사용하여 덧셈 또는 뺄셈 또는 종료하는 프로그램 작성하기
코드: goto_calc.c
//[?] 두 수 a, b를 입력받아,
// a > b면 a - b를 출력
// a < b면 a + b를 출력
// a == b면 프로그램 종료
// 단, goto 문 사용
#define _CRT_SECURE_NO_WARNINGS // scanf 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
int main(void)
{
int result = 0;
int a, b;
scanf("%d %d", &a, &b);
if (a > b)
{
goto subtraction;
}
else if (a < b)
{
goto addition;
}
else // a == b
{
goto exit;
}
addition:
result = a + b; // 덧셈
goto print;
subtraction:
result = a - b; // 뺄셈
goto print;
print:
printf("%d\n", result); // 출력
exit:
printf("exit\n"); // 종료
return 0;
}
30 20
10
exit
10 20
30
exit
10 10
exit
동영상 강의
goto 문을 사용하여 중첩 루프 빠져나오기
코드: goto_exit.c
//[?] 중첩 루프 빠져나오기
#include <stdio.h>
int main(void)
{
int level = 0;
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (level == 10)
{
goto stop2;
}
level++;
}
}
printf("level: %d\n", level); // 25
stop1: printf("100\n");
stop2: printf("200\n");
stop3: printf("300\n");
return 0;
}
200
300
동영상 강의
goto로 중첩 루프 한 번에 빠져나오기
코드: goto_nested_loops.c
// goto로 중첩 루프 한 번에 빠져나오기
#include <stdio.h>
int main(void)
{
int goal = 0;
// 20번 반복: 4 * 5
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 5; j++)
{
if (goal == 10) // 원하는 목표 또는 예외를 만났을 때
{
goto exit; // 중첩 루프를 빠져나와 exit 레이블로 바로 이동
}
goal++;
}
}
exit:
// 마무리 또는 예외 처리 영역
printf("%d\n", goal); // 10
return 0;
}
10