<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ko">
		<id>https://tcatmon.com/w/index.php?action=history&amp;feed=atom&amp;title=GOTO</id>
		<title>GOTO - 편집 역사</title>
		<link rel="self" type="application/atom+xml" href="https://tcatmon.com/w/index.php?action=history&amp;feed=atom&amp;title=GOTO"/>
		<link rel="alternate" type="text/html" href="https://tcatmon.com/w/index.php?title=GOTO&amp;action=history"/>
		<updated>2026-07-26T21:07:50Z</updated>
		<subtitle>이 문서의 편집 역사</subtitle>
		<generator>MediaWiki 1.28.0</generator>

	<entry>
		<id>https://tcatmon.com/w/index.php?title=GOTO&amp;diff=11588&amp;oldid=prev</id>
		<title>2017년 1월 18일 (수) 02:30에 Maintenance script님의 편집</title>
		<link rel="alternate" type="text/html" href="https://tcatmon.com/w/index.php?title=GOTO&amp;diff=11588&amp;oldid=prev"/>
				<updated>2017-01-18T02:30:04Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;새 문서&lt;/b&gt;&lt;/p&gt;&lt;div&gt;||혹시 검색 광고 업체 [[고투닷컴]]을 찾고 계셨나요?||&lt;br /&gt;
[목차]&lt;br /&gt;
&lt;br /&gt;
== 개요 ==&lt;br /&gt;
&lt;br /&gt;
[[프로그래밍]]에서 어느 특정 줄 번호나 레이블로 건너뛰거나 돌아갈 때 쓰는 명령이다. [[웜홀]]같은 개념이라고 보면 된다. &lt;br /&gt;
&lt;br /&gt;
프로그램의 흐름을 바꾸는 기본적인 명령으로, 여러 고급 언어에서 공통적으로 사용되는 명령이다. 다만, 모든 고급 언어에 이 기능이 있는 것은 아니다. [[Java]]처럼 예약어로만 존재하고 기능이 없는 경우도 존재한다. 그 이유가 궁금하면 이 글을 끝까지 읽어보자.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== 예제 ==&lt;br /&gt;
[[BASIC]]에서의 사용 예를 들면 다음과 같다.&lt;br /&gt;
&lt;br /&gt;
||10 PRINT &amp;quot;[[내가 고자라니|내가 고투라니!]]&amp;quot;||&lt;br /&gt;
||20 '''GOTO 40'''||&lt;br /&gt;
||30 PRINT &amp;quot;[[의사양반|이보시오 의사양반]]!&amp;quot;||&lt;br /&gt;
||40 PRINT &amp;quot;[[이게 무슨 소리야]]!&amp;quot;||&lt;br /&gt;
||50 END||&lt;br /&gt;
이를 실행하면 중간에 30번 행이 있지만 20번 행에서 40번 행으로 건너뛴다. 그래서 다음과 같이 나온다.&lt;br /&gt;
&lt;br /&gt;
||[[내가 고자라니|내가 고투라니!]][BR][[이게 무슨 소리야]]!||&lt;br /&gt;
&lt;br /&gt;
== '''GOTO문의 해로움''' ==&lt;br /&gt;
&amp;gt; [[저 새는 해로운 새다|GOTO Statement Considered Harmful]] [* 이 GOTO문의 사용이 해가 된다고 지적한 서한의 제목이 'Go to Statement Considered Harmful'(GOTO문의 해로움)이였는데, 이 '... Considered Harmful'라는 어구가 컬트적 인기를 끌어서 컴퓨터 과학 계열에서 어떤 것에 대한 비판을 할때 자주 쓰이는 어구가 되었다(..) . 예를 들어서 '[[위키니트|Wiki Neet]] Considered Harmful' 이런식으로. 참고로 위 서한에 대한 비평으로 ' 'GOTO Statement Considered Harmful' Considered Harmful'('GOTO문의 해로움'의 해로움)이 있었고, 다시 이것에 대한 반응으로 도널드 무어 등은 ' 'GOTO Statement Considered Harmful' Considered Harmful' Considered Harmful? (' 'GOTO문의 해로움'의 해로움'의 해로움?)을 보냈다. ~~[[고만해 미친놈들아]]~~] - [[다익스트라|Edsger W. Dijkstra]]&lt;br /&gt;
고급 언어에서 GOTO문은 많은 커뮤니티에서 터부시되는 구문이다. 그 이유는 이게 너무 많이 쓰이다 보면 [[가정이 무너지고 사회가 무너지고|구조가 무너지고 코드가 황폐화되면서]] 이게 어째 실행은 잘 되긴 되는데 코드를 짠 프로그래머 자신도 &amp;quot;이게 [[뭥미]]?&amp;quot;하는 소리가 절로 나오며 읽고 유지보수하기가 힘들어지는 지경에 이르게 된다. 이러한 상태로 된 코드를 '[[스파게티 코드]]'라고 한다. 이런 스파게티 스타일을 반대하고 구조적 프로그래밍을 주창한 [[네덜란드]]의 컴퓨터 과학자 [[에츠허르 다익스트라]](Edsger Wybe Dijkstra)는 GOTO문의 사용이 프로그램의 정확성 분석과 증명 등의 측면에 해가 된다고 한 바 있다. 실제 프로그래밍할 때도 GOTO문을 남용하면 디버깅 불가+기능 추가 난해+다른 사람의 욕 처먹기+왜 이런 코드를 짰지 하고 생각하는 자괴감이 드는 사단 콤보가 일어날 수 있다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== GOTO문의 이로움 ==&lt;br /&gt;
{{{#!html&lt;br /&gt;
&amp;lt;!-- HTML generated using hilite.me --&amp;gt;&amp;lt;div style=&amp;quot;background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;&amp;quot;&amp;gt;&amp;lt;pre style=&amp;quot;margin: 0; line-height: 125%&amp;quot;&amp;gt;&amp;lt;span style=&amp;quot;color: #333399; font-weight: bold&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #0066BB; font-weight: bold&amp;quot;&amp;gt;sock_create_lite&amp;lt;/span&amp;gt;(&amp;lt;span style=&amp;quot;color: #333399; font-weight: bold&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; family, &amp;lt;span style=&amp;quot;color: #333399; font-weight: bold&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; type, &amp;lt;span style=&amp;quot;color: #333399; font-weight: bold&amp;quot;&amp;gt;int&amp;lt;/span&amp;gt; protocol, &amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;struct&amp;lt;/span&amp;gt; socket &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;**&amp;lt;/span&amp;gt;res)&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
        err &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; security_socket_create(family, type, protocol, &amp;lt;span style=&amp;quot;color: #0000DD; font-weight: bold&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;);&lt;br /&gt;
	&amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt; (err)&lt;br /&gt;
		&amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;goto&amp;lt;/span&amp;gt; out;&lt;br /&gt;
&lt;br /&gt;
	sock &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; sock_alloc();&lt;br /&gt;
	&amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt; (&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;!&amp;lt;/span&amp;gt;sock) {&lt;br /&gt;
		err &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;-&amp;lt;/span&amp;gt;ENOMEM;&lt;br /&gt;
		&amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;goto&amp;lt;/span&amp;gt; out;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	sock&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;-&amp;gt;&amp;lt;/span&amp;gt;type &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; type;&lt;br /&gt;
	err &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; security_socket_post_create(sock, family, type, protocol, &amp;lt;span style=&amp;quot;color: #0000DD; font-weight: bold&amp;quot;&amp;gt;1&amp;lt;/span&amp;gt;);&lt;br /&gt;
	&amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;if&amp;lt;/span&amp;gt; (err)&lt;br /&gt;
		&amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;goto&amp;lt;/span&amp;gt; out_release;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: #997700; font-weight: bold&amp;quot;&amp;gt;out:&amp;lt;/span&amp;gt;&lt;br /&gt;
	&amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;*&amp;lt;/span&amp;gt;res &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; sock;&lt;br /&gt;
	&amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;return&amp;lt;/span&amp;gt; err;&lt;br /&gt;
&amp;lt;span style=&amp;quot;color: #997700; font-weight: bold&amp;quot;&amp;gt;out_release:&amp;lt;/span&amp;gt;&lt;br /&gt;
	sock_release(sock);&lt;br /&gt;
	sock &amp;lt;span style=&amp;quot;color: #333333&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: #007020&amp;quot;&amp;gt;NULL&amp;lt;/span&amp;gt;;&lt;br /&gt;
	&amp;lt;span style=&amp;quot;color: #008800; font-weight: bold&amp;quot;&amp;gt;goto&amp;lt;/span&amp;gt; out;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
}}}&lt;br /&gt;
[* 소켓 인터페이스 구현('''[[리눅스|linux]]'''/net/socket.c:1027-1054) 중 발췌. ([[GPL]] 라이센스 및 커밋 3c435c)  ] &lt;br /&gt;
~~ GOTO를 터부시한 사람들은 goto의 사용에 놀라고 출처에 또 한번 놀란다 ~~&lt;br /&gt;
GOTO문의 남용은 소스코드의 이해를 어렵게 만들지만, [[적절]]한 사용은 오히려 소스코드의 가독성과 명료성을 높이는 경우가 있다. 가령 다중 반복문에서의 탈출[* 자바 등 일부 고급 언어의 경우 GOTO문 외에 다중 반복문을 탈출하는 기능을 제공하긴 한다. C언어는 [[그런 거 없다]].], 에러에 대한 예외 처리[* 에러가 발생했을 때는 에러 코드 및 에러 메시지를 출력한 후에 프로그램을 그 자리에서 종료시켜야 하는 경우가 많다. 계속 실행시켰다가는 에러가 연속적으로 발생하거나 예기치 못한 결과가 나올 수도 있기 때문이다. 이때 goto 문은 프로그램의 가장 끝줄로 점프시키는 용도로도 사용할 수 있다. 위의 소스코드도 에러 예외처리로 GOTO를 사용한 예이다.] 등 일부 작업에 한해서는 GOTO문을 사용하는 경우가 더 명료한 경우도 있다. 다만 위의 경우라도 로직 레벨에서의 탈출이나 함수화 시킨 후에 return등을 이용하는 등 GOTO문을 쓰지 않기를 권고하는 경우도 많다.&lt;br /&gt;
대표적인 예시로 '''리눅스 커널 소스코드를 까봐도 심심찮게 GOTO문을 발견할 수 있다.'''[* [[리누스 토르발스]]는 대표적인 GOTO문 옹호자 중의 한 명이다.] 터부시 되기에는 나름대로 쓰임새가 있는 것도 사실. 그러나 초보자에게는 많은 경우에 일종의 [[금기]]로써 가르친다. GOTO문이 유용한 경우는 어디까지나 특수한 케이스이고 잘못 사용했을 경우의 어디서부터 손대야할지 모르는 스파게티를 만들어버리는데다가 초보자의 경우 특히 가능성이 높기 때문(..)  C언어보다 고수준 언어를 사용한다면 예외처리는 exception(try-catch)으로, C++같이 리소스 해제가 수동이지만 RAII를 지원하는 경우는 [[https://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization|RAII]]를 사용하자. 용법은 같으면서 가독성은 증가한다. 다만 그런거 없는 C언어에서는 예외처리와 동적 리소스 해체에 goto를 주로 사용한다.&lt;br /&gt;
&lt;br /&gt;
사실 이 GOTO문은 프로그래밍 언어의 시초격이라 할 수 있는 [[어셈블리어]]의 산물이다. 어셈블리어에서는 프로그램의 흐름을 제어할 수 있는 구문이 Jump[* 아키텍처에 따라 Branch로 쓰기도 함] 계열의 명령어밖에 없는데, 이는 무조건적으로 혹은 특정 조건을 만족하면 명령어에서 지시하는 프로그램 카운터로 이동하는 구문이다. 고급 언어로 쓰인 코드도 컴파일해서 어셈블리 소스를 열어보면 전부 GOTO문의 반복형으로 되어있다.[* 어셈블리 프로그래밍에 입문하는 경우는 일부러 반복문을 GOTO식으로 고쳐서 쓰는 연습을 하기도 한다]&lt;br /&gt;
&lt;br /&gt;
== 그 외 ==&lt;br /&gt;
 * [[BASIC]]에는 GOTO문 외에도 GOTO문과 비슷한 [[GOSUB]]문이 있다.&lt;br /&gt;
 * [[PHP]]에는 없다가 5.3 버전에서 생겼다. &lt;br /&gt;
 * [[Lua]]에는 5.2부터, LuaJIT에서는 2.0부터 있는데, 특이한 점은 타 언어의 Continue가 존재하지 않는다.&lt;br /&gt;
 * if와 goto만 있어도 for, while, switch등을 전부 대체할 수 있다.&lt;br /&gt;
&lt;br /&gt;
[[분류:전산학]]&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>	</entry>

	</feed>