break 문 continue 문 C++ 자습서 31

break 문 continue 문 C++

break 문과 continue 문은 자신의 블록 안에 남아있는 일부 코드를 무시하고 특정 위치로 건너뛰는 제어문입니다. 단편적인 설명은 쉽지만 사실 이 break와 continue 를 이해하려면 goto 문에 대해서 알아두는게 좋습니다. 간단히 goto 문에 대해 설명한 후에 break 문과 continue 를 알아 보겠습니다.

goto 문은 말 그대로 정해진 목적지로 가는 제어문입니다. 목적지는 label 을 사용해서 갑니다. 일반 C++ 교재나 강의에서는 거의 다루지 않지만 C++에도 goto 문이 있습니다.

C언어 이전 하드웨어 레벨에서 프로그램을 작성하기 위해서 어셈블리어를 사용했습니다. 저수준 프로그래밍 언어인 어셈블리어에서는 고수준 언어인 C++ 처럼 for, while, if 같은 제어문이 없었습니다. 분기문이나 반복문을 직접 만들어서 쓰기 위해서는 두개 레지스터의 값을 비교하는 연산 단계를 거쳐야 하지만 코드를 제어하려면 결국 그 위치로 가야합니다. 프로그램 소스코드를 작성할 때는 라인으로 표현되지만 컴퓨터 내부적으로는 다음 실행할 명령어가 저장된 메모리 주소의 포인터입니다. 레지스터는 EIP라고 합니다. CPU에게 EIP를 주면 그 자리로 가서 실행한 후 포인터를 하나 더해서 그 다음 명령어를 순차적으로 실행합니다. goto 키워드는 (어셈블리어에서는 jump나 goto 키워드를 사용) CPU에게 다음 레이블로 가서 실행하라는 코드입니다. 현재는 C++에서 goto 문법의 사용은 거의 금지되어 있는데 스파게티 코드라고 표현하는 가독성이 좋지 않기 때문입니다. if 나 break 등 가독성 좋은 고급 문법으로 제어가 가능한데 굳이 goto 로 이해하기 어렵게 사용하는 것은 좋지 않습니다. 다만 원리를 모르고 하지 말라고 하지 않는 것 보다 원리적으로 이해한 후에 주의하면 더 좋을 것 입니다. 어셈블리어를 배우게 되면 프로그램의 제어에 대해 더 많은 것을 알게 되고 그런 기계어들이 C++ 과 어떻게 연관되어 있는지 알게 되지만 C++ 만 사용하면 아무래도 궁금할 수가 있습니다. break 에서 goto 문을 소개하는 것은 좀더 입체적으로 볼 수 있는 부분이 있기 때문입니다.

goto 문 예제

아래 goto 문은 label1의 코드를 건너뛰고 label2로 가서 실행합니다. 가장 원초적인 제어문으로 만일 goto 문을 label2의 아래에 놓는다면 무한루프를 발생시킵니다. 무한루프의 C++ 문법은 while(1) 이지만 실제로는 같은 장소로 무한히 jump 하는 것 입니다. 레이블은 프로그램 코드가 저장된 메모리의 주소를 참조합니다. 현재의 코드 위치에서 다음 코드를 실행하는게 아니라 그 주소로 jump 하여 실행합니다.

#include<iostream>

int main()
{

    using std::cout;
    using std::cin;
    using std::endl;

    goto label2;

    label1:
        cout << "this is label1" << endl;

    label2:
        cout << "this is label2" << endl;

    return 0;
}

break 문

goto 문에서 본 것과 같이 break 나 continue 도 기본적으로 제어를 넘겨주는 목적지가 있습니다. 그것을 label 로 표현하지 않고 if 문이나 while 문 안에서 사용하는 것 입니다. break 문은 단독으로 사용할 수 없습니다. 루프나 스위치에서 사용가능합니다. jump 하는 위치가 있어야 하는데 예를 들어 main 함수에 break 를 사용한다고 해도 어디로 가라는지 코드의 주소가 없습니다.

아래는 무한루프 while 문에 사용한 break 문입니다. 무한루프를 저대로 놔두면 count 는 int 형을 오버플로우 하며 무한히 반복될 것 입니다. if 문에 break 를 걸어놓으면 조건이 해당할 때 while 문의 다음 명령 코드로 CPU의 제어를 넘겨줍니다. 즉 while 무한루프가 종료합니다. 루프의 안에 처음부터 break 를 사용하면 그냥 종료하기 때문에 보통 if 문에 조건을 집어넣어서 사용합니다. 기준을 보면 while 문의 { } 안에서 break문을 만나면 그 아래에 있는 while 블록의 코드는 무시하고 while 문을 빠져나옵니다. 여기서는 다음의 실행 코드인 return 0; 으로 이동합니다. count 가 3이 되면 while 문을 이탈합니다. goto 문에서는 레이블을 찾아 갔다면 여기서는 레이블이 while 문이 끝나는 곳이라고 생각하면 됩니다.

#include<iostream>

int main()
{

    using std::cout;
    using std::cin;
    using std::endl;

    int count = 0;

    while(1)
    {
        if(count == 3) break;

        cout << "count : " << count << endl;
        count++;
    }

    return 0;
}

중첩된 루프에서는 가장 가까운 곳의 루프를 종료합니다. switch 문에서의 사용법은 switch 구문 C++ 자습서 30 에서 설명해 놨습니다.

continue 문

break 문이 while 등 루프의 종료를 시킨다면 continue 문은 다시 while 문의 조건식으로 돌아가서 새로운 루프 주기를 시작합니다.

아래의 코드는 % 모듈 연산자를 사용해서 짝수가 나올 때 마다 for 문의 새로운 주기를 시작합니다. 그 아래의 cout 함수를 제외하므로 홀수만 출력하게 됩니다.

#include<iostream>

int main()
{

    using std::cout;
    using std::cin;
    using std::endl;

    for (int i = 0; i < 20; i++)
    {
        if (i%2==0)
            continue;

        cout << i << endl;
    }
    
    return 0;
}

요약

이번 포스팅에서는 break 와 continue에 대해서 알아봤습니다. 프로그램의 제어는 조건에 따라 다음 코드의 목적지가 변경되는 것으로 이해할 수 있습니다. 코드의 목적지란 명령 코드의 메모리 주소 즉 EIP 이고 이를 레이블로 사용하여 이동하는 goto 문의 동작과 break 와 continue의 유사성에 대해서도 조명해봤습니다.

이런 특성을 잘 이해하고 break와 continue의 응용도 자연스럽게 습득할 수 있을 것 입니다.

참고문서

break 문 (C++) | Microsoft Docs

Leave a Comment