반응형

많은 프로그래밍 언어에서 사용하고 있는 goto 는 지정된 label 의 statement 로 바로 점프할 수 있는 강력한 키워드이다.

이른바, goto 의 사용은 코드의 가독성이 떨어지며 유지보수가 어려운 스파게티 코드(spaghetti code) 를 생산한다고 하여, 많은 논란이 되어왔다. ( 최근에 사용되는 몇몇 고수준 언어에서는 goto를 지원하지 않는다. 예를 들면 Java 의 경우 goto 문이 예약어로 지정되어 있으나 명령어로 존재하지는 않는다. )

1960-70 년대에, 많은 컴퓨터과학자들은 loop 와 if-else 와 같은 구조적인 flow-control 을 활용하여 goto 를 대체할 수 있다고 결론지었다. 하지만 예외처리를 하기위한 경우나 중첩 루프문 안에서 goto 의 사용은 유용하다는 주장도 있다.

1968년, 다익스트라 (Edsger Dijkstra) 는  "Go To Statement Consider Harmful" 이라는 글을 통해 goto 를 사용함에 따라 프로그래밍 언어의 분석이 복잡해지고 무결성 검증이 어려워진다며 goto 의 사용을 비판했다.  이 글의 핵심 요지는 인간의 인지 능력은 코드를 읽을 때 순차적으로 시간의 흐름에 따라 라인을 읽어가는 것이 자연스러운데, goto 사용을 통해서 라인을 이리저리 건너뛰는 코드는 이해하기 매우 난해하며 유지, 관리도 어려워 진다는 점을 얘기하고 있다. ( 이 논문은 벌써 40 년이나 된 논문인데... 이 논문으로 시작된 goto 문 안쓰기 운동은 여전히 유효한 것 같다.  )

사용자 삽입 이미지
Edsger Dijkstra. 척 보기에도 guru 같이 생겼다.

반면에, Donald Knuth 는 "structured Programming with go to Statement" 라는 글을 통해 구조적인 프로그래밍 언어에 있어서 goto 를 사용해서 원하는 구조를 구축할 수 있다고 분석했다.
( 이상
Wikipedia 에서 발췌 )

무분별한 goto 의 사용은 제한해야 겠지만, 필요한 부분에서 적절하게 사용하는 경우 코딩이 보다 효율적이 될 수 있을 것 같다. 리눅스 커널에서도 goto 는 사용되고 있다고 하니... 특히, 다중 루프 내에서 한번에 탈출하고자 할 경우에 매우 유용하다. ( 함수 안이라면 return 을 써도 되겠지만 피치 못하게 main 내에서 사용되는 경우들도 많으니... 예를 들면 알고리즘 문제풀이를 할때 goto 를 종종 썼던 것 같다. )

누군가 다른 사람이 짜 놓은 코드를 읽어보다가... 예외처리를 하기 위해서 goto 를 쓰는 대신에 아래와 같이 써놓은 것을 봤다.



저렇게 해서 필요시 break 를 써서 한번에 루프를 탈출하여 예외처리를 하는 코드였다. 원래 continue 나 break 가 일부 goto 와 유사한 기능을 하도록 고안되었다 하니 목적에 맞기는 한데, 저렇게 쓸 경우에 예외상황이 다중 루프의 내에 있을 경우에는 여전히 한번의 break 만으로는 탈출이 불가능하다. 암튼 저런 코드를 보다보니 생각나서 자료를 좀 뒤져여 본다..

관련 글
Dijkstra 가 goto 에 시비건 진짜 이유는 1   ( 마소에 연재된 내용인데, 상당히 재미있는 기사다... )
Dijkstra 가 goto 에 시비건 진짜 이유는 2




+ Recent posts