반응형
프로그래밍을 조금 하다 보면 한 번쯤 보게 되는 키워드가 있습니다. 바로 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는 나쁜 문법이 아니라
👉 잘못 쓰기 쉬운 도구입니다.
✔ 장점
- 빠르고 단순한 점프
- 특정 상황에서 코드 간결
❌ 단점
- 흐름 파악 어려움
- 유지보수 지옥 가능
🔸 한 줄 결론
👉 “모르면 쓰지 말고, 필요할 때만 조심해서 써라.”
🔹 개인적인 팁
- 코드가 헷갈릴 것 같으면 → 쓰지 않는 게 낫습니다
- 대신 구조를 바꾸는 게 더 좋은 해결입니다
반응형
'C & C++ > C & C++' 카테고리의 다른 글
| File Packing [패킹 프로그램] (0) | 2018.01.04 |
|---|---|
| 한글, 영어, 숫자 구분하기 (0) | 2014.12.03 |
| 스레드 사용법 (0) | 2014.12.01 |
| 마이크로 세컨드 단위로 실행시간 측정하기 (0) | 2014.10.29 |
| 윈도우 콘솔( Console ) 실행 (0) | 2014.05.12 |
댓글