본문 바로가기
C & C++/C & C++

C/C++의 goto 문, 써도 될까?

by izen8 2026. 4. 7.
반응형

프로그래밍을 조금 하다 보면 한 번쯤 보게 되는 키워드가 있습니다. 바로 goto.
이름 그대로 “저기로 가라”는 뜻인데, 코드 실행 흐름을 지정한 위치로 바로 점프시키는 명령입니다.

그런데 이상하게도 많은 개발자들이 이걸 쓰지 말라고 합니다.
왜일까요? 무조건 나쁜 걸까요? 아니면 잘 쓰면 괜찮은 걸까요?


🔹 goto는 무엇인가

기본 형태는 아주 단순합니다.

goto 라벨이름;

// ...

라벨이름:
    실행코드;

예를 들어 보면:

int n = 0;

start:
    printf("%d\n", n);
    n++;

    if (n < 5)
        goto start;

👉 결과: 0부터 4까지 출력

즉, 반복문처럼 동작합니다.
하지만 for, while 없이 직접 점프해서 흐름을 제어하는 방식입니다.


🔹 왜 사람들이 싫어할까?

가장 큰 이유는 코드 흐름이 깨지기 때문입니다.

일반적인 코드는 위에서 아래로 자연스럽게 읽힙니다.

if (...) {
    ...
}

하지만 goto를 쓰면?

if (...) goto A;

// 중간에 수십 줄 코드

A:

👉 코드가 여기저기 점프하면서
👉 “이게 어디서 왔지?” 하고 계속 찾아야 합니다.

이걸 흔히 이렇게 부릅니다:

🔥 스파게티 코드 (Spaghetti Code)
면처럼 흐름이 엉켜서 따라가기 힘든 코드


🔹 실제로 위험한 예

if (error)
    goto cleanup;

// 여러 작업들...

cleanup:
    free(ptr1);
    free(ptr2);

처음엔 깔끔해 보이지만…

  • 나중에 코드가 길어지면
  • 어떤 자원이 언제 해제되는지 헷갈리고
  • 실수로 누락되면 메모리 누수 발생

👉 유지보수가 어려워집니다.


🔹 그럼 절대 쓰면 안 될까?

그건 또 아닙니다.

특정 상황에서는 오히려 깔끔하게 만들기도 합니다.

✔ 1. 에러 처리 (특히 C 코드)

if (!res1) goto error;
if (!res2) goto error;
if (!res3) goto error;

return true;

error:
    cleanup();
    return false;

👉 중복 코드 줄이기 좋음
👉 깊은 if 중첩 피할 수 있음


✔ 2. 다중 반복문 탈출

for (int i = 0; i < 10; i++)
{
    for (int j = 0; j < 10; j++)
    {
        if (i == j)
            goto end;
    }
}

end:
printf("탈출");

👉 break는 한 단계만 탈출
👉 goto는 한 번에 탈출 가능


🔹 요즘은 어떻게 할까?

현대 C++에서는 goto 대신 더 좋은 방법들이 있습니다.

  • 함수로 분리
  • return 활용
  • RAII (자동 자원 해제)
  • try-catch

예를 들어:

if (!Init()) return false;
if (!Load()) return false;
if (!Run()) return false;

👉 훨씬 읽기 쉬움


🔹 정리

goto는 나쁜 문법이 아니라
👉 잘못 쓰기 쉬운 도구입니다.

✔ 장점

  • 빠르고 단순한 점프
  • 특정 상황에서 코드 간결

❌ 단점

  • 흐름 파악 어려움
  • 유지보수 지옥 가능

🔸 한 줄 결론

👉 “모르면 쓰지 말고, 필요할 때만 조심해서 써라.”


🔹 개인적인 팁

  • 코드가 헷갈릴 것 같으면 → 쓰지 않는 게 낫습니다
  • 대신 구조를 바꾸는 게 더 좋은 해결입니다
반응형

댓글