C 언어 | 흐름 제어 | goto문

지정한 문장에 무조건 점프하는 goto 문장을 소개한다.

무조건 점프

지금까지의 분기와 반복은 어떤 조건을 지정하여 제어를 실시했지만, 무조건 지정한 위치에 프로그램을 이동시킬 수 있다. 무조건 점프를 할 때에는 goto 문을 사용한다.

goto 문

goto 레벨;

라벨(label)에는 점프하는 문장이 있는 라벨을 지정한다. 라벨은 “switch 문"에서 조금 소개 했었는데, 쉽게 말하면 문장에 붙이는 식별자와 같은 것이다. 문장에 라벨을 붙이면 goto 문으로 그 자리로 이동할 수 있다. 레벨은 다음과 같이 지정한다.

라벨 선언

라벨 : 문장

이렇게 하면 문장에 라벨을 지정할 수 있다. 라벨에 사용되는 이름은 변수 등의 명명 규칙과 동일하다. 문장에 라벨을 붙이면, goto 문을 사용하여 자유롭게 프로그램의 흐름을 변경할 수 있다. 다만 goto 문은 동일한 함수 내에 있지 않으면 이동할 수 없다. 다른 함수의 문장에 바로 이동할 수 없기 때문에 주의하자.

코드1

#include <stdio.h>

int main() {
  int iCount = 0;

LOOP:
  printf("카운터 = %d\n" , iCount);
 iCount++;
 if (iCount < 10) goto LOOP;

 return 0;
}

이 프로그램은 반복 처리를 goto 문으로 재현한 것이다. iCount 변수가 10 이하이면 goto 문을 사용하여 LOOP 레이블로 돌아가고, 그렇지 않으면 프로그램을 종료한다.

그러나 for 문이나 while 문을 사용할 수 있는 곳에서는 어김없이 for 문이나 while 문을 사용하여 반복 처리를 실시해야 하며, goto 문을 사용해서는 안된다. 대부분의 경우 goto 문을 사용하지 않아도, if 나 for 문 같은 제어문에서 충분히 원하는 처리을 수행할 수 있다. goto 문을 남용하는 경우 프로그램의 흐름을 파악할 수 없으며 유지 보수가 어렵 기 때문에 goto 문은 원칙적으로 사용해서는 안된다.

goto 문을 사용하는 곳이라고 생각되는 곳은, goto 문을 사용하여 프로그램을 스마트하게 기술할 수 있는 특별한 알고리즘을 작성하는 경우이거나, 여러 단계로 중첩된 제어문에서 벗어날 같은 경우이다. 예를 들어 for 문을 중첩된 프로그램이 중간에 처리를 끝내고 싶은 경우, break 문을 사용하여 한단계의 제어만 벗어날뿐 모든 제어를 벗어날 수 없다. 그래서 goto 문을 사용하여 벗어날 수 있다.

for(;;) {
  for(;;) {
   ...
   if(error) goto ERROR;
 }
}
ERROR:  ...

이와 같이 중첩된 반복 처리의 내부에서 오류가 발생하는 등의 이유로 최상위 제어로 전환하고자 하는 경우, goto 문을 사용하여 강제로 나갈라고 하는 수단으로 효과적이다.