goto문 사용 금지의 실체(1)

by minakim / 2021. 07. 14. [05:12]

 

 

 

 

 
여러 개발자분들과 함께 일하다 보면 가끔 아래의 지침을 마음속에 품고 코딩을 하거나 코드를 리뷰하시는 분들이 있습니다.

"goto문은 절대 쓰면 안된다. 스파게티 코드가 되기 때문이다."

하지만 위의 표현은 정확한 표현이 아닙니다. 저라면 이렇게 표현할 것 같습니다.

"goto를 남용하면 안된다. 스파게티 코드가 되기 때문이다."

 

너무 모호한 표현인가요? 우선 저명한 분들이 남긴 goto에 대한 의견을 살펴보면서 코드를 예로 들어 상세히 설명하겠습니다.

 

 

goto문의 역사

 

최초의 프로그래밍 언어는 기계어에 가까운 언어, 즉 어셈블리어(assembly language)였습니다. 어셈블리어에서는 처음부터 while, if-else, for가 없었습니다. 지금도 없죠. if 조차도 if then goto만 가능하며, if then 뒤에 아무것이나 붙일 수는 없습니다.

제 기억이 틀릴 수도 있지만, 아마도 if 구문이 먼저 나오고 그 후에 if-else, while, for가 나오지 않았을까 추측합니다.

 

 

전산학의 대부였던 다익스트라(Dijkstra)는 이렇게 말했습니다.

 
 
 
 
 
"goto는 해롭다."

 

 

 

이 말에는 이런 속뜻이 있습니다.

 

 

"while, if-else, for는 제외하고 goto만 쓰지 말자."

 

다익스트라가 goto를 절대 쓰지 말라는 의미로 말하지는 않았을 거라고 생각합니다. 이 말은 무려 반세기도 전인 1968년에 한 말이니까요.

 

 

 

 

 

 

 

 

 

 

 

 

1990년대의 유명한 전사학의 대부인 크누스(Knuth)는 이렇게 말했습니다.

 

 

 

 
 
 

"언어 스펙이 발전한 지금은 goto가 나쁘다고만 할 수는 없다"

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2000년대에 리눅스를 만든 장본인인 리누스(Linus)

 

 

"goto가 더 나을 때가 있기도 하다"고 말했습니다.

 

 

 

 

2010년대에 자동차 산업 소프트웨어 안정성 협회 (MISRA)는 "goto 금지는 이제 필수가 아닌 권고로 완화한다"고 명시하기도 했죠.

 

 

2021년인 지금도 우리는 주변에서 종종 "goto는 절대 금지"라는 맹목적인 의견을 내는 사람들이 있습니다.

 

 

이 글을 쓰는 저는 어땠을까요?

 

 

저도 한 때, goto는 절대 금지라는 말을 신봉했습니다.

 

 

 

 

 

 

 

 

 

왜 goto를 쓰지 말라고 했을까?

 

저도 왜 goto를 쓰지 말자는 주의가 팽배했었는지 모릅니다만, 짐작건대 구전되어 내려오면서 서서히 왜곡되었을 것으로 추측합니다. 그도 그럴것이 위의 두 문장인,

 

"goto문은 절대 쓰면 안된다. 스파게티 코드가 되기 때문이다."

 

 

"goto를 남용하면 안된다. 스파게티 코드가 되기 때문이다."

 

중에 그 어느 것도 goto를 어디서 부터 어디까지 쓰지 말아야 하는지를 명확하게 표현해주지 못하기 때문이죠.

 

 

프로그램을 구동하는 것은 기계이지만, 프로그램의 소스코드를 읽고 다루는 일은 사람이 합니다. 즉, 프로그램이라는 한 줌의 텍스트 파일은 우선적으로 사람에게 친화적이어야 합니다.

 

프로그램의 소스 코드가 몇 천줄을 넘어가기 시작하면, 코드를 작성하는데 소요되는 시간보다 기존에 만들어진 코드에 더 코드를 추가하거나 수정하는 데 훨씬 많은 시간이 들어가게 됩니다. 이쯤 되면 코딩하는데 20%의 시간을 쓰고 기존 코드를 읽는데 80%의 시간을 쓰게 됩니다.

 

학교에서 레포트를 제출하거나 단기 연구용 프로그램을 만들 때에는 읽기 쉬운 코드를 굳이 유지할 필요가 없지만, 다수가 참여하는 대규모 팀 프로젝트에서는 타인이 이해하기 쉬운 코드를 만드는 것이 중요해집니다.

 

 

 

 

"내가 누군가의 코드를 잘 이해한다는 것은, 코드를 잘 읽는 내 실력이 뛰어난 것이 아니라 그 코드를 잘 읽을 수 있도록 만든 그 작성자가 탁월한 것이다."

 

goto의 사용 여부는, 바로 이 관점에서 결정되어야 한다는 것이 저의 주장입니다.

 

글로만 설명하면 재미도 없고, 읽기도 힘드니 이 다음 편에서는 바로 코드 레벨의 예시와 함께 소개하도록 하겠습니다.

 

 

 

 

4. 개발 이야기