17. break, continue, goto로 반복문 제어하기
이번에는 제어문의 나머지 항목을 살펴보겠습니다. break
문은 반복문과 switch
문을 빠져나가는 역할을 합니다. continue
문은 반복문의 나머지 코드를 실행하지 않고 반복문의 다음 처리 영역으로 넘어갑니다. goto
문은 특정 레이블로 지정된 영역으로 이동합니다.
> // 점프 문: break 문, continue 문, goto 문, ..., return
17.1 break 문
반복문(for
, do
, while
)을 빠져나올 때에는 break
문을 사용할 수 있습니다.
17.2 아무것도 하지 않는 프로그램
다음 코드는 말 그대로 아무것도 하지 않는 프로그램입니다. 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
반복문을 바로 빠져 나올 수 있습니다.
17.3 무한 루프(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
문을 빠져나오도록 설정하였습니다.
17.4 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
문을 만나면 바로 반복문을 더 이상 실행하지 않고 빠져나오게 됩니다.
17.5 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이상을 달성했습니다.
합계를 계속 구해나가는 과정에서 22 이상이 되면 더 이상의 합계를 구하지 않고 반복문을 빠져나올 때 break
키워드를 사용할 수 있습니다.
17.6 continue 문으로 코드 건너뛰기
이번에는 continue
문을 사용하여 일부 코드를 실행하지 않고 건너뛰어 보겠습니다. 코드를 실행하면 1부터 5까지 숫자 중 홀수만 출력합니다. 코드 작성 후 부록의 디버거 사용하기를 참고하여 F10
과 F11
키를 사용하여 한 줄 씩 실행해보면 좋습니다.
코드: 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);
}
return 0;
}
1
3
5
for
문을 사용하여 1부터 5까지 반복합니다. 그리고 if
문을 사용하여 짝수인지를 판단하여 짝수이면 continue
문을 실행합니다. 반복문에서 continue
문을 만나면 continue
문 아래의 코드는 실행하지 않고 반복문의 다음 반복으로 이동합니다. for
문에서는 증감식(i++
)으로 이동합니다. 이러한 continue
문의 동작은 for
, while
, do
문에서도 동일합니다.
17.7 continue 문으로 3의 배수 제외한 수의 합 구하기
이번에는 continue
문을 사용하여 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의 배수이면 [i++] 코드 영역으로 이동하기
}
sum += i;
}
printf("SUM: %d\n", sum); // 3367
return 0;
}
SUM: 3367
if (i % 3 == 0) { continue; }
코드에 의해서 3의 배수일 때 continue
문을 만나서 이후의 실행문을 실행하지 않고 다음 반복으로 넘어갑니다. 그래서 3의 배수를 제외한 수의 합만 sum
변수에 저장됩니다.
17.8 C 언어로 1부터 입력 받은 숫자까지 3의 배수만 출력하기
C 언어로 숫자 1부터 사용자로부터 콘솔로부터 입력 받은 숫자까지 3의 배수만 출력하는 프로그램을 작성하세요.
코드: only_multiples.c
#define _CRT_SECURE_NO_WARNINGS // scanf() 보안 경고 에러 방지
#include <stdio.h>
int main(void)
{
int goal = 0; // 목표치 값 받을 변수
int r = 0;
printf("10부터 100 사이의 정수 입력: ");
r = scanf("%d", &goal);
for (int i = 1; i <= goal; i++)
{
if (i % 3 != 0) // 3의 배수가 아니라면 건너뛰기
{
continue;
}
printf("%d\n", i); // 3의 배수일 때에만 printf() 실행
}
return 0;
}
프로그램을 실행한 후 10을 입력한 후 엔터 키를 입력합니다.
10부터 100 사이의 정수 입력: 10
3
6
9
방법은 많이 있지만, 이번에는 3의 배수가 아니면 continue
문을 만나서 다음 반복으로 이동하도록 코드를 작성했습니다. 그리고, 3의 배수일 때에만 printf
함수를 만나 값을 출력해서 1부터 10까지의 숫자 중에서 3의 배수인 3, 6, 9만 출력됩니다.
17.9 while 문과 break 문 함께 사용하기
1부터 10까지 정수의 합을 구해나갈 때 합이 22 이상이 되면 멈추는 프로그램을 while
문을 사용해서 만들어 봅니다.
코드: while_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이상을 달성했습니다.
17.10 goto로 프로그램의 흐름을 원하는 대로 바꾸기
goto
문은 특정 레이블로 이동하는 기능을 합니다. 레이블은 다른 말로 책갈피로 부릅니다. C 언어에서 레이블은 콜론(:) 기호를 레이블 이름 뒤에 붙여 만듭니다. 이렇게 만들어진 레이블 코드는 평상시에는 주석처럼 아무런 의미없는 코드로 사용되지만 goto
문 뒤에 레이블을 지정하면 해당 레이블로 이동하는 기능이 실행됩니다.
레이블:
goto 레이블;
17.11. goto 문 사용하기
이번에는 goto
문을 사용해보겠습니다.
코드: goto_demo.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
종료
사용자로부터 0, 1, 2 중 하나를 입력받은 후 1이면 Chapter1
이름으로 설정된 레이블로 이동하고, 2면 Chapter2
레이블로 이동하고 나머지 값이 입력되면 End
레이블로 이동하여 프로그램을 종료합니다.
17.12. 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; // loop_body 레이블로 이동
}
return 0;
}
C Language
C Language
C Language
17.13. 장 요약
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