반복문(for나 while)은 규칙대로 처음부터 끝까지 돕니다. 그런데 코드를 짜다 보면 찾던 값을 발견하는 순간 그만두고 싶거나, 특정 조건의 값만 골라서 빼고 싶을 때가 있습니다. 이럴 때 쓰는 것이 break(브레이크)와 continue(컨티뉴)입니다. 반복 안에 또 반복을 넣는 중첩 반복까지 익히면 표나 도형 같은 규칙적인 결과도 만들 수 있습니다. 예제를 먼저 보고 실행 결과를 확인하며 따라가겠습니다.
![[C 11] break와 continue, 중첩 반복](https://img.thenullpage.com/posts/6546/6546_2_3af130.webp)
11.1 break로 반복 멈추기
break는 반복문을 그 자리에서 즉시 완전히 빠져나오는 명령입니다. 남은 회차가 아무리 많아도 반복이 끝납니다. 1부터 세다가 처음 만난 3의 배수에서 멈추겠습니다.
#include <stdio.h>
int main(void) {
for (int i = 1; i <= 10; i++) {
if (i % 3 == 0) {
printf("%d에서 멈춤\n", i);
break;
}
}
return 0;
}
실행 결과입니다.
3에서 멈춤
i가 3이 되는 순간 조건이 참이 되어 break가 실행되고, 4부터 10까지는 아예 돌지 않습니다. break가 없었다면 3, 6, 9에서 세 번 찍혔을 것입니다.
break가 가장 빛나는 상황은 검색입니다. 배열을 앞에서부터 훑다가 원하는 값을 만나면 뒤는 볼 이유가 없으니 멈춥니다.
#include <stdio.h>
int main(void) {
int arr[6] = {4, 8, 15, 16, 23, 42};
int target = 16;
for (int i = 0; i < 6; i++) {
if (arr[i] == target) {
printf("%d번 칸에서 찾음\n", i);
break;
}
}
return 0;
}
실행 결과입니다.
3번 칸에서 찾음
배열의 칸 번호는 0부터 시작하므로 16은 3번 칸(arr[3])에 있습니다. 값을 찾자마자 break로 빠져나오니 뒤의 23과 42는 검사하지 않습니다. break가 없다면 찾은 뒤에도 끝까지 훑는 헛일을 합니다.
11.2 continue로 이번 회차만 건너뛰기
continue는 break와 헷갈리기 쉽지만 전혀 다릅니다. 반복을 끝내지 않고, 지금 회차의 남은 부분만 건너뛴 뒤 곧바로 다음 회차로 넘어갑니다. 1부터 10까지 중 3의 배수만 빼고 출력합니다.
#include <stdio.h>
int main(void) {
for (int i = 1; i <= 10; i++) {
if (i % 3 == 0) continue; // 이번 회차만 건너뜀
printf("%d ", i);
}
printf("\n");
return 0;
}
실행 결과입니다.
1 2 4 5 7 8 10
i가 3, 6, 9일 때는 continue를 만나 아래의 printf를 건너뛰므로 화면에 찍히지 않습니다. 하지만 반복 자체는 계속되어 10까지 갑니다. break였다면 3에서 아예 끝났겠지만, continue는 그 회차만 거르고 이어 간다는 점이 다릅니다. 특정 조건만 걸러 내고 나머지는 그대로 처리하고 싶을 때 이 형태를 자주 씁니다.
11.3 반복 안의 반복, 중첩 반복
반복문 안에 또 다른 반복문을 넣은 것을 중첩 반복이라고 합니다. 바깥 반복이 한 번 돌 때마다 안쪽 반복이 처음부터 끝까지 전부 돕니다. 가로세로가 있는 표를 만들 때 꼭 필요합니다. 2단부터 9단까지 구구단 전체입니다.
#include <stdio.h>
int main(void) {
for (int dan = 2; dan <= 9; dan++) {
for (int i = 1; i <= 9; i++) {
printf("%dx%d=%2d ", dan, i, dan * i);
}
printf("\n");
}
return 0;
}
실행 결과입니다. 가운데 단들은 줄임표로 줄였습니다.
2x1= 2 2x2= 4 2x3= 6 2x4= 8 2x5=10 2x6=12 2x7=14 2x8=16 2x9=18
...
9x1= 9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81
바깥 변수 dan이 2일 때 안쪽 i가 1부터 9까지 돌며 2단 한 줄을 완성하고, 끝나면 printf("\n")으로 줄을 바꿉니다. 그다음 dan이 3으로 올라가 같은 일을 반복합니다. 서식의 %2d는 숫자를 두 칸 폭으로 맞춰 자리를 가지런히 합니다.
안쪽 반복 횟수를 바깥 변수에 맞추면 도형도 그릴 수 있습니다. 줄이 내려갈수록 별이 하나씩 늘어나는 삼각형입니다.
#include <stdio.h>
int main(void) {
for (int line = 1; line <= 4; line++) {
for (int star = 1; star <= line; star++) {
printf("*");
}
printf("\n");
}
return 0;
}
실행 결과입니다.
*
**
***
****
바깥 변수 line이 1, 2, 3, 4로 커질 때 안쪽 반복은 line만큼만 별을 찍습니다. 바깥 변수의 값이 안쪽 반복 횟수를 조절한다는 것이 중첩 반복으로 패턴을 만드는 열쇠입니다.
11.4 안쪽 break는 안쪽 반복만 빠져나옵니다
중첩 반복에서 초보자가 가장 많이 걸려 넘어지는 지점이 여기입니다. 함정. 안쪽 반복 안에서 break를 써도 안쪽 반복 하나만 끝날 뿐, 바깥 반복은 멈추지 않고 계속 돕니다. break는 자기를 감싼 가장 가까운 반복문 하나만 빠져나오기 때문입니다.
그래서 이중 반복을 한 번에 멈추려면 멈췄다는 사실을 기억하는 깃발 변수를 함께 씁니다. 곱이 처음으로 12를 넘는 i와 j 짝을 찾으면 둘 다 멈추는 예제입니다.
#include <stdio.h>
int main(void) {
int found = 0;
for (int i = 1; i <= 5 && !found; i++) {
for (int j = 1; j <= 5; j++) {
if (i * j > 12) {
printf("i=%d, j=%d\n", i, j);
found = 1;
break; // 안쪽 반복만 빠져나옴
}
}
}
return 0;
}
실행 결과입니다.
i=3, j=5
안쪽 break는 j 반복만 끝냅니다. 그래서 found라는 깃발을 1로 세워 두고, 바깥 for의 조건에 !found를 넣었습니다. found가 1이 되면 바깥 조건이 거짓이 되어 바깥 반복도 끝납니다. 이 깃발 방식이 두 겹 반복을 한 번에 탈출하는 가장 기본적인 방법입니다.
11.5 정리
break는 찾으면 그만인 검색처럼 반복을 완전히 끝낼 때 쓰고, continue는 이번 회차만 건너뛰고 반복은 이어 가니 특정 조건만 걸러 낼 때 씁니다. 반복 안에 반복을 넣은 중첩 반복은 표와 도형처럼 가로세로가 있는 결과를 만들어 냅니다. 다만 안쪽 break는 안쪽 반복 하나만 빠져나온다는 점을 기억하고, 두 겹을 한 번에 멈추려면 깃발 변수를 함께 쓰십시오. 직접 쳐 보고 출력을 확인하면 세 도구의 차이가 손에 잡힙니다.