'C/C++'에 해당되는 글 1건
- 2007.01.04 C 에서 goto 사용하기. 2
나같은 경우에는 C로 프로그래밍을 할 경우에 거의 항상 goto 문을 사용한다.
근데, 항상 주변에서 goto 는 존재 자체가 악이라면서,
하도 쓰지 말라는 사람이 많아서 살짜쿵 고민을 했더랬다.
goto 문을 사용하면 100배는 더 편해지고, 명료해지는데 왜 쓰지 말라는건지;;;
goto 문은 이럴때 사용한다.
1. 예외 (에러) 처리
-
int someFunction ( ... ) {
-
unsigned char* uniData = NULL;
-
FILE* fpR = NULL;
-
... open file & allocate buffer ...
-
if ( fread(uniData, sizeof(char), rsize, fpR) < 0 ) {
-
printf("Error, cannot read file, %d\n", rsize);
-
goto EXIT;
-
}
-
... ...
-
EXIT:
-
// Release resource & EXIT
-
SAFE_FREE(uniData);
-
if ( fpR != NULL ) fclose(fpR);
-
return 0;
-
}
try .. catch ... finally 같이...
에러 때문에 함수를 나갈 경우에, 나가기 전 자원 해제를 위해서 쓰는 편이다.
( 예제에는 안썼지만 return 값을 -1로 설정하는 부분도 넣어야겠죠? )
2. 중복된 반복문을 한번에 벗어날때.
-
...
-
for ( i = 0; i < 100; i++ ) {
-
for ( j = 0; j < 100; j++ ) {
-
if ( buf[i][j] == '\n' )
-
goto EXIT_LOOP;
-
}
-
}
-
EXIT_LOOP:
-
...
2개야 뭐 어떻게 한다고 쳐도, 10개쯤 중복된 반복문을 goto 없이 한번에 어떻게 벗어나죠? -_-
찾아보니 자바에도 저런 방식을 지원하더라고요,
-
class BreakWithLabelDemo {
-
public static void main(String[] args) {
-
int[][] arrayOfInts = { { 32, 87, 3, 589 },
-
{ 12, 1076, 2000, 8 },
-
{ 622, 127, 77, 955 }
-
};
-
int searchfor = 12;
-
int i;
-
int j = 0;
-
boolean foundIt = false;
-
search:
-
for (i = 0; i < arrayOfInts.length; i++) {
-
for (j = 0; j < arrayOfInts[i].length; j++) {
-
if (arrayOfInts[i][j] == searchfor) {
-
foundIt = true;
-
break search;
-
}
-
}
-
}
-
if (foundIt) {
-
System.out.println("Found " + searchfor +
-
" at " + i + ", " + j);
-
} else {
-
System.out.println(searchfor
-
+ " not in the array");
-
}
-
}
-
}
14번째 줄을 보면, 반복문을 시작할 때 반복문에 라벨을 지정해주고,
반복문 전체를 한번에 벗어나는 방법을 지원해주고 있습니다.
( continue도 라벨을 지정해주고 상위 반복문의 루프로 가는 방법을 지원해줌 )
출처: http://java.sun.com/docs/books/tutorial/java/nutsandbolts/branch.html
물론 while 문으로 전체를 감싼 다음에 에러가 생기면 break를 걸어주는 방식으로 한다는 의견도 있지만,
저것도 에러 체크가 다른 반복문 안에 있으면 무용지물이지...
게다가 indent도 한단계 더 들어가야하잖아!!! goto 쓰는게 100배 나아!!!
...
난 이제는 goto 없이는 c programming이 힘들어지는....OTL