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를 사용하지 않는 게 맞습니다.