32.1 goto와 레이블 사용하기

goto는 레이블을 지정해서 사용합니다. 레이블은 : (콜론)을 붙이며 레이블 이름을 짓는 규칙은 변수와 같습니다.

  • goto 레이블;
  • 레이블:

다음 내용을 소스 코드 편집 창에 입력하세요.

goto.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int num1;

    scanf("%d", &num1);

    if (num1 == 1)         // num1이 1이면
        goto ONE;          // 레이블 ONE으로 즉시 이동
    else if (num1 == 2)    // num1이 2이면
        goto TWO;          // 레이블 TWO로 즉시 이동
    else                   // 1도 아니고 2도 아니면
        goto EXIT;         // 레이블 EXIT로 즉시 이동

ONE:    // 레이블 ONE
    printf("1입니다.\n");
    goto EXIT; // 레이블 EXIT로 즉시 이동

TWO:    // 레이블 TWO
    printf("2입니다.\n");
    goto EXIT; // 레이블 EXIT로 즉시 이동

EXIT:    // 레이블 EXIT
    return 0;
}

소스를 컴파일하여 실행한 뒤 1을 입력하고 엔터 키를 누르세요.

실행 결과

1 (입력)
1입니다.

goto에 레이블을 지정하면 중간에 있는 코드는 무시하고 해당 레이블로 즉시 이동합니다. 1을 입력했다면 레이블 ONE으로 이동하고, 2를 입력했다면 레이블 TWO로 이동하겠죠?

if (num1 == 1)         // num1이 1이면
    goto ONE;          // 레이블 ONE으로 즉시 이동
else if (num1 == 2)    // num1이 2이면
    goto TWO;          // 레이블 TWO로 즉시 이동
else                   // 1도 아니고 2도 아니면
    goto EXIT;         // 레이블 EXIT로 즉시 이동

다음과 같이 레이블을 지정한 뒤 실행할 코드를 작성합니다. 여기서는 "1입니다."를 출력한 뒤 "2입니다."가 출력되지 않도록 다시 레이블 EXIT로 건너뜁니다.

ONE:    // 레이블 ONE
    printf("1입니다.\n");
    goto EXIT;    // 레이블 EXIT로 즉시 이동

TWO:    // 레이블 TWO
    printf("2입니다.\n");
    goto EXIT;    // 레이블 EXIT로 즉시 이동

EXIT:    // 레이블 EXIT
    return 0;

이런 코드를 스파게티 코드라고합니다. 예제는 코드가 간단해서 이해하는데 큰 어려움이 없지만 코드의 양이 많으면 읽기가 정말 힘들어집니다.

예제 코드를 if, else로만 표현하면 다음과 같이 됩니다.

if_elseif.c

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int num1;

    scanf("%d", &num1);

    if (num1 == 1)         // num1이 1이면
        printf("1입니다.\n");
    else if (num1 == 2)    // num1이 2이면
        printf("2입니다.\n");

    return 0;
}

코드가 줄어들었죠? 이런 경우에는 goto를 사용하지 않는 게 맞습니다.