프로그래밍 언어/[ C ]

[ C ] 14. goto에 관하여

kim.svadoz 2020. 8. 14. 10:01
728x90
반응형

[ goto에 관해 ]


goto는 별다른 제약 조건 없이 원하는 부분으로 이동할 수 있기 때문에 초보 때는 goto를 남발하는 경우가 많다. 그러다 보니 처음에는 goto는 가급적 사용하지 말라고 한다. 하지만 goto를 적절히 활용하면 중복되는 코드를 없애고 코드를 좀 더 간결히 만들 수 있을 것이다. 특히 에러처리에 매우 유용하기 때문에 리눅스커널에서도 자주 쓰이며 for, switch 등 중첩 반복문에 많이 쓰이는 것을 알아두자.

# 스파게티 코드
스파게티 코드는 `goto`를 과도하게 사용해서 프로그램의 흐름이 마치 스파게티 면발처럼 꼬여있다는데서 붙여진 이름이다. 그래서 스파게티 코드는 가독성이 떨어지고 유지보수가 매우 힘들다.

goto와 레이블

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(){
    int num1;

    scanf("%d",&num1);

    if(num1==1)
        goto ONE:
    else if(num1==2)
        goto TWO;
    else
        goto EXiT;

ONE:        // 레이블 ONE
    printf("1입니다\n");
    goto EXIT;    // 레이블 EXIT로 즉시 이동
TWO:        // 레이블 TWO
    printf("2입니다\n");
    goto EXIT;    // 레이블 EXIT로 즉시 이동    
EXIT:        // 레이블 EXIT
    return 0;
}

컴파일 후 1을 입력하고 엔터키

# 실행 결과
1 (입력)
1입니다.
  • goto에 레이블을 지정하면 중간에 있는 코드는 무시하고 해당 레이블로 즉시 이동한다.

goto와 중첩루프

#include <stdio.h>
#include <stdbool.h>

int main(){
    int num1 = 0;
    bool exitOuterLoop = false;    // 바깥쪽 루프를 빠져나올지 결정하는 변수
    for(int i=0; i<10; i++){
        for(int j=0; j<10; j++){
            if(num1 == 20){
                exitOuterLoop = true;        // 바깥쪽 루프도 빠져나가겟다
                break;                    // 안쪽 루프를 끝냄
            }
            num1++
        }
        if (exitOuterLoop == true) break;        // eOL이 TRUE라면 바깥쪽 루프를 끝냄
    }
    printf("%d\n", num1);        // 20
    return 0;
}
# 실행 결과
20
  • break의 가장 큰 특징은 현재 루프만 끝낸다는 점이다. 따라서 중첩 루프의 안쪽 푸르에서 break를 사용하면 안쪽 루프만 끈탤 뿐 바깥쪽 루프는 계속 반복된다. 이처럼 중첩루프를 빠져나오려면 추가적인 코드가 더 필요한데 goto를 사용하면 간단하게 빠져나올 수 있다.
#include <stdio.h>

int main(){
    int num1 = 0;

    for(int i=0; i<10; i++){
        for(int j=0; j<10; j++){
            if(num1==20) goto EXIT;

            num++;
        }
    }

EXIT :            // 레이블 EXIT
    printf("%d\n", num1);        //20
    return 0;
}
# 실행 결과
  • 변수 num1이 20이 되면 goto를 사용하여 레이블 EXIT로 즉시 이동한다. 따라서 안쪽과 바깥쪽 루프를 break로 끝낼 필요가 없다.
  • 이처럼 goto는 다중 루프를 빠져나올 때 유용하다. for문 뿐만 아니라, while, do while로 된 중첩 루프를 빠져 나올 수 도 있다.
  • 뿐만 아니라 에러처리코드를 한 곳에 모아놓고 goto를 사용하면 중복코드를 없앨 수 있고 코드의 의도를 명확히 전달할 수 있을것이다.
  • 실무에서는 파일을 열어놓거나 메모리를 할당한 상태에서 에러가 발생하면 파일을 닫거나 메모리를 해제한 뒤 프로그램을 종료하는 패턴을 주로 사용한다.
728x90
반응형

'프로그래밍 언어 > [ C ]' 카테고리의 다른 글

[ C ] 16. volatile 이용하기  (0) 2020.08.27
[ C ] 15. 공용체  (0) 2020.08.15
[ C ] 13. 함수 포인터 배열 활용하기  (0) 2020.08.14
[ C ] 12. 함수와 가변인자  (0) 2020.08.14
[ C ] 11. 함수와 배열  (0) 2020.08.14