goto 문은 C와 C++에서 제공하는 점프문(jump statement)입니다. 함수 내부에서 실행 흐름을 특정 레이블(label)이 붙은 다른 문장으로 즉시 이동시키는 역할을 합니다.
goto 문이란?
goto 문은 함수 안에서 한 문장에서 다른 문장으로 프로그램의 제어를 무조건적으로 옮기는 무조건 분기(unconditional jump) 문입니다. 하지만 이 문의 사용은 대부분의 프로그래밍 전문가들에 의해 강력히 권장되지 않습니다. 그 이유는 다음과 같습니다.
- 프로그램의 구조를 복잡하게 만들어 코드 가독성을 크게 떨어뜨립니다.
- 제어 흐름(control flow)을 추적하기 어려워져 디버깅이 힘들어집니다.
- 나중에 프로그램을 수정하거나 유지보수하기 매우 어렵습니다.
따라서 가능하면 반복문(for, while, do-while)이나 조건문(if, switch) 등 구조화된 제어문을 사용하는 것이 좋습니다.
goto 문의 기본 문법
C 언어에서 goto 문은 다음과 같은 형태로 작성합니다.
goto label; . . . label: statement;
여기서 label은 식별자로, 이동하고자 하는 위치의 문장 앞에 콜론(:)과 함께 붙입니다. goto 문이 실행되면 프로그램의 제어가 해당 레이블이 있는 곳으로 즉시 이동합니다.
goto 문 예제
다음은 C 언어에서 goto 문을 사용한 예제입니다.
#include <stdio.h>
int main () {
int a = 10;
LOOP:do {
if( a == 12) {
a = a + 1;
goto LOOP;
}
printf("Value of a: %d\n", a);
a++;
}while( a < 15 );
return 0;
}실행 결과
Value of a: 10 Value of a: 11 Value of a: 13 Value of a: 14
코드 설명
위 예제에서 변수 a는 10부터 시작하여 do-while 반복문 안에서 1씩 증가합니다. a가 12가 되는 순간 if 조건문이 참이 되어 a를 1 증가시킨 후 goto LOOP;가 실행됩니다. 그러면 제어가 LOOP: 레이블로 돌아가 do-while 반복문이 다시 시작됩니다. 그 결과 값 12는 출력되지 않고 건너뛰게 되며, 출력 결과에서 12가 빠진 것을 확인할 수 있습니다.
goto 문 사용 시 주의사항
goto 문은 드물지만 유용하게 쓰이는 경우도 있습니다. 예를 들어 중첩된 반복문을 한 번에 탈출해야 할 때나 오류 처리(error handling) 과정에서 자원을 정리할 때 사용되기도 합니다. 하지만 남용하면 소위 스파게티 코드(spaghetti code)라 불리는, 제어 흐름이 뒤엉켜 알아보기 힘든 코드가 만들어지기 쉽습니다. 따라서 goto 문은 정말 불가피한 상황이 아니라면 사용하지 않는 것이 바람직합니다.