이번 포스팅에서는 goto에 대해서 작성해 보려고 합니다.
c언어를 공부하면서 goto문을 알고 넘어가지 않고 바로 다른 문법으로 넘어가는 것 같아서
따로 정리하면 좋을 것 같아서 goto문을 정리하게 되었습니다.
구글에 goto문에 검색하면 "되도록 사용하지 말라" "사용하지 마세요" 이런 형식으로 작성되어 있습니다.
하지만 제 생각은 사용하지 마세요. 와 다른 점이 goto를 적절히 활용하면 중복되는 코드를 없앨 수 있고, 코드를 좀 더 간결하게 만들 수 있다고 생각합니다.
또한 에러 처리에 매우 유용하기 때문에 리눅스 커널에서도 자주 사용되고 있다고 합니다.
goto문은 특정 상황에서 다른 제어문과 비교해 몇 가지 장점이 있습니다.
그러나 이러한 장점을 사용할 때는 주의가 필요하며 goto의 남용은 코드의 가독성을 떨어뜨릴 수 있으므로 신중하게 사용해야 합니다.
예를 들어 스파게티 코드
👉 스파게티 코드는 goto를 과도하게 사용해서 프로그램의 흐름이 마치 스파게티 면발처럼 꼬여 있다는데서 붙여진 이름입니다.
그래서 스파게티 코드는 가독성이 떨어지고 유지보수가 매우 힘듭니다.
goto문은 복잡한 오류 처리 시나리오에서 유용할 수 있습니다.
특히, 깊은 중첩 루프나 다중 조건문을 사용하는 경우, 오류가 발생했을 때 코드의 특정 위치로 즉시 이동하여 오류 처리를 수행할 수 있습니다.
메모리나 파일과 같은 자원을 할당한 후, 함수 실행 중 어떤 이유로 인해 중간에 함수를 빠져나가야 하는 경우 goto를 사용하여 지원을 해제할 수 있습니다.
이렇게 하면 코드 중복을 피하면서 자원 누수를 방지할 수 있습니다.
때로는 특별한 제어 흐름이 필요한 경우가 있습니다.
예를 들어, 윈도우 응용 프로그램 개발에서 윈도우 메시지 루프를 처리하는 데 goto문을 사용할 수 있습니다.
특정 상황에서 goto를 사용하여 코드의 성능을 최적화할 수 있습니다.
이는 매우 드문 경우이며, 최적화를 위해서는 코드를 신중하게 분성해야 합니다.
if
, while
, for
)을 사용하여 대부분의 상황을 처리할 수 있으므로, goto는 특수한 상황에서만 사용해야 합니다.goto문의 구문
goto 레이블;
여기서 "레이블"은 프로그램 내에서 정의된 곳으로 이동하고자 하는 위치를 나타내는 식별자입니다.
goto문의 사용 예제
이 예제는 사용자가 특정 조건을 만족할 때까지 반복하여 값을 입력받는 프로그램을 보여줍니다.
#include <stdio.h>
int main() {
int number;
retry: // 레이블 정의
printf("양수를 입력하세요: ");
scanf("%d", &number);
if (number <= 0) {
printf("잘못된 입력입니다. 다시 시도하세요.\n");
goto retry; // 레이블로 분기
}
printf("입력한 양수: %d\n", number);
return 0;
}
위 코드에서 retry
레이블이 정의되어 있으며, 사용자가 음수를 입력하거나 0을 입력하면 오류 메시지를 출력하고 다시 retry
레이블로 분기하여 값을 다시 입력받는 기능을 수행합니다.
이 문제는 Chatgpt를 통해서 문제를 주어달라고 요청했고 요청했을 때 바로 답을 주는 형식이 아닌 문제가 주어지면 내가 답을 제공한 뒤에 답을 제공하는 형식으로 명령하여 작성하게 되었습니다.
#include<stdio.h>
//문제 : 사용자로부터 숫자를 입력받고, 이 숫자가 1부터 100사이의 범위에 있는지 검사하여
// 범위를 벗어나면 다시 입력을 요청하는 프로그램을 작성하세요
int main(){
int number;
retry: // 1부터 100사이의 범위에 있는지 검사하여 범위를 벗어나면 retry
printf("숫자를 입력해주세요 : ");
scanf("%d",&number);
if(number>=1 && number<=100){
printf("입력한 양수는 범위 안에 있습니다.\n");
printf("입력한 양수: %d\n", number);
}else{
printf("범위를 벗어났습니다. 다시 입력해 주세요.\n");
goto retry;
}
return 0;
}