언제부턴가 C, C++ 내에서 GOTO 문은 '금기' 시 되었다.
필자 역시 첫 S/W 수업을 들을때 GOTO 문을 '쓰지말라' 는 취지의 교육을 받았었다.
하지만 이는 명백히 잘못된 '교육' 이다.
GOTO 문은 굉장히 강력하며, 적재 적소에 사용하면 코드의 최적화를 이뤄내는데 유용한 구문이다.
Q_. 일개 블로거가 뭔데 교수가 말하는거에 반박임?
GOTO 문은 '리눅스 커널' 에서도 굉장히 '빈번' 하게 사용된다.
위 구문은 리눅스 내 `cpu.c` 파일 내에 에러처리를 위해 goto 문이 사용된 정황이다.
`cpu.c` 파일 내에는 이러한 에러처리를 위한 goto 문이 19번 사용 되었다.
일부 관련 지식이 없는 분들께 보다 자세히 설명하자면,
Linux 커널은
전 세계의 모든 안드로이드/아이폰 기기에서 사용되며
전 세계의 대다수의 대형 서버에서 사용된다.
이처럼 엄청난 범위 + 극도로 안정성이 요구되는 영역에서도 사용되는것이 'GOTO' 문이다.
그렇다면 도대체 왜 교수님들은 'GOTO' 문을 사용하지 말라 하였을까?
말로는 '스파게티 코드' 를 만들어서 그렇다고 하는데, 참 멍청한 생각이 아닐 수 없다.
마치 '불' 이 위험하다고 쓸 수 없게하고,
'칼' 이 위험하다고 쓸 수 없게 하는 일과 다르지 않다 생각한다.
물론, GOTO 를 '남발' 하면 '엿' 같다.
이건 사실이다, 코드의 가독성이 '심각하게' 저하되어 디버깅이 불가능한 수준의 코드가 만들어 지기도 한다.
특히 아랫단에서 윗 단으로 '역행' 하는 다수의 GOTO가 겹쳐지면 짜증이 난다.
더하여 C++ 이상의 고급 언어에서는 에러를 처리하는 방법이 많기도 하다.
RAII, Try_Catch 가 대표적이다.
하지만, 다중루프에서의 탈출 구문같은 부분은 GOTO 가 '가장' 효과적이라고 장담할 수 있다.
단언컨데 다중루프문 안쪽에서의 탈출 가독성은 'GOTO' 문이 압도적이다.
Wikipedia 에서 정의하는 GOTO문의 사용 이유는 아래와 같다
- To make the code more readable and easier to follow
- To make smaller programs, and get rid of code duplication
- Implement a finite-state machine, using a state transition table and goto to switch between states (in absence of tail call elimination), particularly in automatically generated C code. For example, goto in the canonical LR parser.
- Implementing multi-level break and continue if not directly supported in the language; this is a common idiom in C. Although Java reserves the goto keyword, it doesn't actually implement it. Instead, Java implements labelled break and labelled continue statements. According to the Java documentation, the use of gotos for multi-level breaks was the most common (90%) use of gotos in C. Java was not the first language to take this approach—forbidding goto, but providing multi-level breaks— the BLISS programming language (more precisely the BLISS-11 version thereof) preceded it in this respect.:960–965
- Surrogates for single-level break or continue (retry) statements when the potential introduction of additional loops could incorrectly affect the control flow. This practice has been observed in Netbsd code.
- Error handling (in absence of exceptions), particularly cleanup code such as resource deallocation. C++ offers an alternative to goto statement for this use case, which is : Resource Acquisition Is Initialization (RAII) through using destructors or using try and catch exceptions used in Exception handling. setjmp and longjmp are another alternative, and have the advantage of being able to unwind part of the call stack.
- popping the stack in, e.g., Algol, PL/I.
다른 부분 다 볼 필요 없이 딱 이 한가지만 보면 된다.
To make the code more readable and easier to follow
코드의 가독성 증대.
GOTO문을 '굳이' 쓸필요는 없다.
하지만 '굳이' 안쓸필요도 없다.
GOTO 문을 통해 보다 코드를 식별하기 '깔끔해' 진다면 주저없이 사용하라.
GOTO 를 사용하는게 왜 더 '깔끔한지' 이해되지 않는다면
파랑새님의 블로그를 참조하는것이 좋겠다. 정말 명쾌한 설명이 아닐수가 없다.
'Miscellaneous' 카테고리의 다른 글
KTm 알뜰 모바일 APN 설정(핫스팟) (9) | 2021.02.21 |
---|---|
측지 좌표계, 세계 측지 좌표계란? (0) | 2021.02.01 |
벡터 좌표계 [직각 좌표계, 원주 좌표계, 구면 좌표계] 에 관하여 (0) | 2021.01.31 |
항공기 축 3가지 용어 (Heading, Pitch, Roll, Bank, Yaw) (0) | 2020.12.22 |
프로그래밍에서 Pi(파이) 는 어떻게 써야 하나? (0) | 2020.10.25 |