본문 바로가기
C, C++/문법 정리

[C언어]만약 반복문 없이 반복하려면? - goto문과 스파게티 코드

by hseoy 2020. 4. 26.
반응형

[만약 반복문 없이 반복하려면? - goto문과 스파게티 코드]

만약 "Hello World"를 10줄에 걸쳐 10번 출력하는 코드를 반복문 없이, 그리고 printf함수를 한번만 사용해서 짜라고 하면 어떨까? 불가능한 미션인 걸까?

일단 결론부터 말하자면 C언어에서는 조건문과 반복문 외에 또다른 분기문을 제공한다. 그것이 바로 goto문이다.

#include <stdio.h>

int main()
{
    int i = 0;
    loop:
        printf("Hello World");
        i++;
    if(i < 10)
        goto loop;
    return 0;
}

goto문은 label과 함께 사용하며 label은 "lable 이름:"과 같이 사용하여 표현한다.  여기서 goto문은 "goto label 이름"과 같이 사용하며 goto문을 사용하게 되면 함께 적은 label이 위치한 곳으로 프로그램의 흐름이 변하게 된다. 

위와 같이 조건문과 함께 사용하게 되면 while문이나 for문과 같은 반복문의 역할을 수행할 수도 있으나 goto문에는 심각한 문제가 있다. 바로 프로그램의 실행 흐름을 어지럽힌다는 것이다. 왜냐하면 while문과 for문의 경우 어느 정도 구조가 잡혀있어 어느 자리에 어떤 것이 들어가는 지 이미 정해져 있다. 어디서부터 어디까지 반복하고 빠져나오는 지를 쉽게 파악할 수 있기 때문에 코드가 이리저리 꼬이는 것을 방지할 수 있는 데 goto문은 그럴 수가 없다. 

label은 어디에나 사용할 수 있고 goto문은 언제 어디서든 사용할 수 있다. 그렇다보니 어디서부터 어디까지 정확하게 반복되고 프로그램의 흐름이 변하는 지 한 눈에 알아보기가 힘들고 복잡해진다. 프로그램의 흐름이 꼬이면서 프로그램을 작성한 프로그래머, 개발자 조차 프로그램의 실행 흐름을 예측하기 어려워진다는 말이다. 이렇게 이리저리 엉킨 코드를 스파게티 코드라 하는 데, goto문은 코드를 스파게티 코드로 만들 가능성이 매우 높기에 현재는 사용을 지양해야 하는 문법 중 하나가 되었다.

pixabay

스파게티 코드는 말만 들으면 맛있어 보이지만 이리 엉키고 저리 엉켜 프로그램을 이해하는 것이 매우 어려워진 더러운 코드를 의미한다. goto문은 대부분의 경우, 기존의 문법으로 대체가능하기 때문에 되도록이면 대체할 수 있는 다른 문법을 사용하는 것을 권장하고 있다. 

반응형

댓글