[2-14] 논란의 구문 : goto문

드디어 2부 마지막 장이군요! 저 관우 지금 이순간이 너무 설레입니다~

go to문은 레이블로 가리키는 곳으로 점프를 합니다.

다음과 같이 사용합니다.

goto 레이블;

레이블:
  • 레이블 : 이동할 곳을 나타내는 식별자입니다.

사용법이 간단하네요. 샘플 예제를 한 번 살펴보겠습니다.

#include <stdio.h>

int main(void) {
	
	goto JUMP;
	printf("hello world!\n");
	
JUMP:
	printf("Good Morning?\n");
	
	return 0;
}

[결과]

Good Morning?

코드는 위에서 아래로 실행이됩니다. printf(“hello world!\n”);이 실행되기 전에 goto문에서 그보다 아래 있는 곳으로 점프를 했습니다. 그래서 첫 번째 printf() 함수는 실행되지 못하고 두 번째 printf() 함수만 실행된 겁니다.

goto문을 사용할 때 레이블은 소스 코드 제일 첫 열에 둡니다. 그래야 더 눈에 띄기 있기 때문입니다. 작은 예제에서 JUMP:를 들여쓰기한 코드를 살펴보겠습니다.

#include <stdio.h>

int main(void) {
	
	goto JUMP;
	printf("hello world!\n");
	
      JUMP:
	printf("Good Morning?\n");
	
	return 0;
}

1열에 있을 때보다 JUMP:가 잘 안 보이네요. 그러니 레이블을 첫 행부터 써주는 것이 좋겠습니다.

goto문의 장점은 다음과 같습니다.

  • 재귀 제거
  • 컴파일러가 수행하지 않는 최적화 수행
  • 편리한 분기
  • 다 방향 분기

또 단점이 있습니다.

  • 구조적인 프로그램 흐름을 깬다.
  • 남발하면 가독성이 떨어진다.

이러한 장담점 때문에 goto문에 대한 시선이 엇갈립니다. 단점이 두 가지뿐인데 왜 그러냐구요? 구조화된 코드와 가독성이 그만큼 중요하기 때문입니다.

참고로 저는 임베디드 프로그래밍을 할 때는 제한된 리소스에서 동작하는 프로그램을 구현했으므로 goto문을 활용했지만, 데스크탑 애틀리케이션을 작성할 때는 goto문을 사용한 적이 한 번도 없습니다.

이상 관우였습니다.

제갈량의 동남풍 : goto문 쓸까 말까?

우리나라에서도 goto문을 쓰자 vs 말자는 논쟁이 줄 곧 있었습니다. 다음 그중 한 논쟁입니다.

  • https://kldp.org/node/40440

위 링크를 살펴보시면 이야기가 기술적으로 깊이 있게 흐르지는 않지만 중요한 언급 두 건이 나옵니다. 바로 당대 두 최고수의 goto문에 대한 의견입니다. 두 최고수는 다익스트라와 커누스 입니다.

  1. 해롭다 : 에츠허르 다익스트라 논문 「Go To Statement Considered Harmful (goto 문의 해로움)」
  2. 잘 쓰자 : 도널드 커누스 PPT <Structured Programming with goto Statements (goto 문을 사용한 구조적 프로그래밍)> (Computing Surveys 6 (4), 261-301, December 1974)

특히 커누스 교수님은 PPT 맨 마지막 장에 핵심을 친히 짚어주셨습니다.

커누스 교수님의 PPT 맨 마지막 장

직역하면 다음과 같습니다.

진짜 중요한 것은 구조화된 프로그래밍이다.

* 정확한 작성(?)
** 충분한 확신
* 다른 수준의 이해력(추상화)
* 명확성과 이해력
* goto문에는 눈이 자동으로 파악할 수있는 구문 구조가 없다.
* '더 나은' 언어 특성
* 효율성
* 1984년에 개발된 언어임을 감안하자.

강의용 PPT 내용이라 문맥 파악이 제대로 안 되지만 어떤 의도인지는 아실 겁니다.

지금까지 C 언어 기본 문법을 살펴봤습니다. 프롤로그에 밝힌 바와 같이 C 언어로 무언가 개발하는 분을 대상으로 하지 않기 때문에 다들 어렵다 하는 (하지만 알고 보면 쉬운) 포인터는 다루지 않았습니다. C 언어로 제대로 프로그램을 작성하려면 알아야 하는 더 많은 이야기를 3부에서 다룰 겁니다.

이상 관우였습니다.

지금까지 열공하는 모든 분께 감사 드리며 다시 만나요 ^^/~

P.S. 저 제갈량도 잊지 말아주세요!

殺 & 風