goto는 아무 데나 점프하는 도구보다 cleanup 경로를 하나로 모으는 도구로 볼 때 가장 실전적입니다.
- 자원을 두세 개 이상 열었을 때 에러 경로가 지저분해진다
goto cleanup이 왜 C에서는 허용되는지 설명해야 한다free와fclose가 여러 경로에 중복되고 있다
숏컷 코드
c
if (fp == NULL) goto cleanup;문법
여러 자원을 단계적으로 획득하고, 중간 실패 시 이미 잡은 자원을 역순으로 정리해야 할 때 goto cleanup 패턴이 가장 단순해집니다.
c
int process(void) {
int *buf1 = NULL;
int *buf2 = NULL;
FILE *fp = NULL;
int ret = -1;
buf1 = malloc(100 * sizeof(int));
if (buf1 == NULL) goto cleanup;
buf2 = malloc(200 * sizeof(int));
if (buf2 == NULL) goto cleanup;
fp = fopen("data.bin", "rb");
if (fp == NULL) goto cleanup;
ret = 0;
cleanup:
if (fp) fclose(fp);
free(buf2);
free(buf1);
return ret;
}이 패턴의 목적은 흐름을 복잡하게 만드는 것이 아니라, 자원 정리 책임을 한곳에 모으는 것입니다.
체크포인트
- 앞으로만 점프합니다.
- 함수 끝의 cleanup 레이블로만 이동합니다.
- 자원은 획득 역순으로 해제합니다.
- 포인터와 핸들은 NULL로 초기화해 둡니다.
- 자원이 하나뿐이면 굳이
goto까지 쓰지 않아도 됩니다.
주의할 점
goto는 정리 레이블로 좁혀 쓰면 유용하지만, 임의 위치 점프나 뒤로 점프까지 허용하기 시작하면 코드 가독성이 급격히 떨어집니다. C에서 goto를 쓰더라도 "자원 정리 전용"으로 제한하는 편이 맞습니다.
참고 링크
1 sources