반응형
[ 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
를 사용하면 중복코드를 없앨 수 있고 코드의 의도를 명확히 전달할 수 있을것이다. - 실무에서는 파일을 열어놓거나 메모리를 할당한 상태에서 에러가 발생하면 파일을 닫거나 메모리를 해제한 뒤 프로그램을 종료하는 패턴을 주로 사용한다.
반응형
'프로그래밍 언어 > [ 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 |