goto문
goto의 의미는 프로그램의 흐름을 원하는 위치로 이동 하는겁니다.
goto문은 코드를실행하다가 goto문을만나면 지정한 레이블로 넘어갑니다.
goto rabbit: 을하면 rabbit:이 위치한 레이블로 이동하여 아래의코드를 실행합니다.
그럼 그전의 코드는 실행되지 않습니다.
goto문에 대해서 논란도 많았습니다. 가장큰원인은 프로그램의 자연스러운 흐름을 방해하기 때문입니다.
C언어와 같은 절차지향 프로그래밍 언어에서는 흐름을 복잡하게하거나 방해하는것은 아주 큰 단점 이기 때문입니다.
결국 goto문의 사용은 가급적 자제하거나,아예 사용하지말자는 결론을 내렸습니다.
물론 적절하게 써주면 좋습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | #include <stdio.h> int main(void) { int num1; scanf("%d",&num1); if(num1 == 1){ goto ONE; } else{ goto TWO; } ONE: printf("num1은 1입니다."); goto END; TWO: printf("num1은 1이 아닙니다."); END: return 0; } |
이런식으로 사용할 수 있습니다.
근데 위코드는 goto문을 안써도 될것같은 느낌이 든다면 지극히 정상입니다. (물론 써도 되긴 합니다만..)
굳이 goto문을안쓰고 그자리에서 바로 출력을하면 됩니다.
줄도 길어지고 흐름도 방해하고 복잡해집니다.
언제 써야 되나?
Goto를 안썼을때
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | BOOL function( void ) { HANDLE hFile1, hFile2, hFile3; PVOID pMem1, pMem2, pMem3; hFile1 = hFile2 = hFile3 = INVALID_HANDLE; pMem1 = pMem2 = pMem3 = NULL; hFile1 = CreateFile(...); if( hFile1 == INVALID_HANDLE ) { return FALSE; } hFile2 = CreateFile(...); if( hFile2 == INVALID_HANDLE ) { Close(hFile1) return FALSE; } hFile3 = CreateFile(...); if( hFile3 == INVALID_HANDLE ) { Close(hFile1) Close(hFile2) return FALSE; } pMem1 = malloc( ); if ( pMem1 == NULL) { Close(hFile1) Close(hFile2) Close(hFile3) return FALSE; } pMem2 = malloc( ); if ( pMem2 == NULL) { free( pMem1 ) Close(hFile1) Close(hFile2) Close(hFile3) return FALSE; } pMem3 = malloc( ); if ( pMem3 == NULL) { free( pMem1 ) free( pMem2 ) Close(hFile1) Close(hFile2) Close(hFile3) return FALSE; } ..... ..... Close(hFile1) Close(hFile2) Close(hFile3) free( pMem1 ) free( pMem2 ) free( pMem3 ) return TRUE; } |
Goto를 사용했을때
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | BOOL function( void ) { HANDLE hFile1, hFile2, hFile3; PVOID pMem1, pMem2, pMem3; BOOL bRet = FALSE; hFile1 = hFile2 = hFile3 = INVALID_HANDLE; pMem1 = pMem2 = pMem3 = NULL; hFile1 = CreateFile(...); if( hFile1 == INVALID_HANDLE ) goto END; hFile2 = CreateFile(...); if( hFile2 == INVALID_HANDLE ) goto END; hFile3 = CreateFile(...); if( hFile3 == INVALID_HANDLE ) goto END; pMem1 = malloc( ); if ( pMem1 == NULL) goto END; pMem2 = malloc( ); if ( pMem2 == NULL) goto END; pMem3 = malloc( ); if ( pMem3 == NULL) goto END; ..... ..... bRet = TRUE; END: if ( hFile1 ) Close(hFile1) if ( hFile2 ) Close(hFile2) if ( hFile3 ) Close(hFile3) if ( pMem1 ) free( pMem1 ) if ( pMem2 ) free( pMem2 ) if ( pMem2 ) free( pMem3 ) return bRet; } |
goto를 쓴쪽이 더 깔끔해 보입니다.
안쓴쪽은 조건문에 중복되는 코드가 많습니다.
상황에 따라 더 깔끔한 쪽을 택하면 될것 같습니다.
(위 예제는 클리앙에서 퍼왔습니다. https://www.clien.net/service/board/lecture/4092508)
댓글