32.2 중첩 루프 빠져 나오기

이번에는 중첩 루프와 goto에 대해서 알아보겠습니다. 다음은 변수 num1이 20이 되면 중첩 루프를 빠져나옵니다.

if_multiple_loop.c

#include <stdio.h>
#include <stdbool.h>

int main()
{
    int num1 = 0;

    bool exitOuterLoop = false;    // 바깥쪽 루프를 빠져나올지 결정하는 변수
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            if (num1 == 20)              // num1이 20이라면
            {
                exitOuterLoop = true;    // 바깥쪽 루프도 빠져나가겠음
                break;                   // 안쪽 루프를 끝냄
            }

            num1++;
        }

        if (exitOuterLoop == true)    // 바깥쪽 루프도 빠져나오겠다고 결정했으면
            break;                    // 바깥쪽 루프를 끝냄
    }

    printf("%d\n", num1);    // 20

    return 0;
}

실행 결과

20

break의 가장 큰 특징은 현재 루프만 끝낸다는 점입니다. 따라서 중첩 루프의 안쪽 루프에서 break를 사용하면 안쪽 루프만 끝낼 뿐 바깥쪽 루프는 계속 반복됩니다. 그러다 보니 여기서는 변수 exitOuterLoop를 사용해서 바깥쪽 루프도 끝내겠다고 결정을 해주고 있습니다.

이처럼 중첩 루프를 빠져 나오려면 추가적인 코드가 더 필요한데 goto를 사용하면 간단하게 빠져나올 수 있습니다.

goto_multiple_loop.c

#include <stdio.h>

int main()
{
    int num1 = 0;

    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            if (num1 == 20)    // num1이 20이라면
                goto EXIT;     // 레이블 EXIT로 즉시 이동

            num1++;
        }
    }

EXIT:    // 레이블 EXIT
    printf("%d\n", num1);    // 20

    return 0;
}

실행 결과

20

변수 num1이 20이 되면 goto를 사용하여 레이블 EXIT로 즉시 이동합니다. 따라서 안쪽과 바깥쪽 루프를 break로 끝낼 필요가 없습니다.

이처럼 goto는 다중 루프를 빠져나올 때 유용합니다. 여기서는 for 반복문을 예로 들었지만 while, do while로 된 중첩 루프도 빠져 나올 수 있습니다.