본문 바로가기
C, C++/문법 정리

[C언어] break문과 continue문

by hseoy 2020. 4. 27.
반응형

[break문과 continue문]

이 주제에 대해서는 어느 정도 이미 언급을 했었다. break문의 역할과 활용에 대해서 어느 정도 설명을 이 글에서 무한 루프에 대해 설명하면서 언급을 했었다. 다만 간단하게 지나가듯이 설명을 했기 때문에 여기서는 break문은 정확하게 무엇이고 어떻게 사용을 할 수 있으며 break문과 같이 반복문에서 자주 사용되는 continue문에 대해서도 설명을 해보려고 한다.

먼저 늘 그렇듯이 왜 break문과 continue문이 필요한 지에 대해서 설명하려고 한다. 이해를 돕기 위해서 약간 판타지스러운 비유를 들어 설명해보겠다. 만약에 인생에서 어떠한 목표가 생겼는데, A라는 시점까지 그 목표를 달성하지 못한다면 목표를 결심한 시점으로 회귀, 돌아간다고 해보자. 그런데 시도하다가 시작점과 마감기한인 A시점 중간에 이번 회귀에서는 이 목표를 달성할 수 없다는 확신이 들게 되어서 A시점 전에 다시 회귀를 하고 싶어 졌다. 그러면 어떻게 해야 할까? 중간에 회귀를 시켜주는 어떤 능력 Y가 필요해질 것이다.

그러다가 이번에는 수백번, 수천 번, 수억 번 시도했는 데 계속 실패해서 이 목표 자체에 질려버렸다고 하자. 그래서 강제로 이 회귀, 이 루프를 종료하고 싶다. 그러면 어떻게 해야할까? 이번에는 이 강제로 회귀, 루프를 종료하는 능력을 X라 하겠다. 이 능력 X가 여러분에게는 필요해질 것이다.

약간 억지스러운 부분과 순서가 바뀐 부분이 있긴 하지만 여기서 말하는 능력 X와 능력 Y가 바로 break문과 continue문이라고 보면 된다. 반복문을 수행하는 과정 속에서 갑자기 루프를 종료하고 싶거나 이번 루프를 그냥 skip하고 싶을 경우를 대비해서 C언어에서 제공하는 기능이 break문과 continue문이다. 

#include <stdio.h>

int main()
{
    int i = 0;
    while(1)
    {
        if(i == 10) break;
        printf("Hello World\n");
        i++;
    }
    return 0;
}

이제 각각의 구문에 대해서 자세하게 알아보자. 먼저 break문을 살펴보겠다. 위 코드는 반복문에 대해 다룬 지난 글에서 작성했던 코드다. break문에 대해서 이해하기 위해서는 먼저 위 프로그램의 실행 흐름을 이해하는 것이 중요하다.

간단하게 위 프로그램의 실행흐름을 순서도로 나타내 봤다. break문이 무슨 일을 하는지는 일단 잊어버리고 순서도를 보면 break가 무슨 일을 하는 지에 대해서 감이 오게 된다.

보면 일반적인 반복문과 비슷하다. 다만 어떠한 조건에 따라서 종료하는 구문이 보이지 않는다. 단지 어떠한 조건에 따라서 break문을 실행할 뿐이다. 

그런데 break문을 실행한 후의 결과가 흥미롭다. 바로 반복문으로부터 벗어나 프로그램을 종료했다는 것이다. 그렇다면 이것을 통해 어떠한 결론을 얻을 수 있을까? 결론적으로 보자면 break문은 반복문에서 반복을 종료시키는 권한이 있고 기능을 한다는 것이다. 

break문에 대해서 정리를 하자면 for, while, do-while문과 같은 루프 구조나 switch 구조에서 실행 중 break문을 만나게 되면 '현재 자신을 포함하고 있는 가장 가까운 루프'를 벗어나게 된다. '현재 자신을 포함하고 있는 가장 가까운 루프'를 벗어난다고 표현했는 데 이것은 굉장히 중요하다. 왜냐하면 실수를 하기 쉽기 때문이다. 

대충 생각해서 자신을 포함하고 있는 중괄호 범위를 벗어난다라고 기억해버리면 나중에 if문안에서 if문 밖으로 나간다고 실수할 수도 있다. 하지만 왼쪽 순서도를 보면 아무리 봐도 if문을 나간것이 아니라 while문을 벗어나간 것이다. 이 실수는 C언어를 오래 놓았을 때 흔히 겪는 실수이자 오류이니 주의해야 한다.

이번에는 continue문에 대해서 살펴보려 한다. 아래 코드는 1부터 9까지의 홀수의 합을 구하는 프로그램의 코드이다.

#include <stdio.h>

int main()
{
    int i, sum = 0;
    for(i = 0; i < 10; i++)
    {
        if(i % 2 == 0)
            continue;
        sum += i;
    }
    printf("sum = %d", sum);
}

이 코드는 i가 짝수일 때는 루프를 건너뛰어 실행하지 않고 홀수일 때만 i의 값을 sum에 더해 결과적으로 홀수의 합만 구하게 된다. 여기서 핵심은 "if(i % 2 == 0) continue;" 부분이다. 이 부분을 실행하게 되면 실행결과만 봤을 때 그 루프를 건너뛰게 된다. 하지만 좀 더 자세히 살펴보자면 건너뛴다기 보다는 조건확인 부분으로 점프한다고 보면 될 거 같다. 

for문은 초기식, 조건식, 변화식, 그리고 중괄호 안의 본문이 존재한다. for문을 처음 실행할 때만 초기식이 실행되게 되고, 그 다음으로는 조건식과 변화식 순으로 실행되게 된다. 여기서 continue를 실행하게 되면 어떻게 될까? continue문을 만나게 되는 그 루프의 흐름을 보면 그 루프를 처음 실행했을 때 조건식을 확인하고 그 다음에 변화식이 실행된다. 변화식이 실행한 다음 continue문을 만나면 다시 조건식으로 "점프"하게 된다. 그래서 i의 값이 홀수일 때는 다시 조건식을 확인하고 변화식을 실행하여 i의 값이 다시 짝수가 되기 때문에 sum에 더하는 행위가 일어나지 않게 된다.

while문 안에서 continue 문을 사용할 때는 주의할 점이 한가지 있다. while문에서는 변화식을 for문과는 다르게 따로 작성하기 때문에 무한 루프가 발생하지 않도록 주의해야 한다. 프로그램이 무한 루프에 빠지게 되면 의도적으로 유도한 것이 아닌한 프로그램이 원하는 목표를 달성할 수 없음에도 리소스를 계속해서 잡아먹기 때문에 프로그램 자체의 의미가 없어진다. 따라서 반복문을 사용할 때는 의미없는 무한 루프에 빠지지 않도록 주의해야 하고, 특히나 break문과 continue문을 조합해서 사용할 때는 더욱 더 무한루프에 대한 경계를 늦춰서는 안된다. 

반응형

댓글