๋ถ๋ฅ:์ปดํจํฐ ๊ณตํ
์ด ๋ฌธ์์ ์๋ณธ์ ์ธ๋ถ ์ํค์์ ๊ฐ์ ธ์์ต๋๋ค.
1. ๊ฐ์[ํธ์ง]
ํ๋ก๊ทธ๋๋ฐ์์ ์ด๋ ํน์ ์ค ๋ฒํธ๋ ๋ ์ด๋ธ๋ก ๊ฑด๋๋ฐ๊ฑฐ๋ ๋์๊ฐ ๋ ์ฐ๋ ๋ช
๋ น์ด๋ค. ์๊ฐ์ด๋ ๊ฐ์ ๊ฐ๋
์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ ๋ฐ๊พธ๋ ๊ธฐ๋ณธ์ ์ธ ๋ช ๋ น์ผ๋ก, ์ผ๋ถ ๊ณ ๊ธ ์ธ์ด์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ช ๋ น์ด๋ค. ์๋๋ CPU์ ๋ช ๋ น์ด ์ค์๋ JUMP๋ผ๋ ๊ฒ์ด ์๋๋ฐ, ์ด๋ฅผ ์ด์ฉํ๋ฉด ์ฝ๋์ ํน์ ๋ถ๋ถ์ผ๋ก ๋ฐ๋ก ์ด๋ํ ์ ์๋ค. ์ด๊ฒ์ ์ด์ฉํ๋ฉด ์กฐ๊ฑด๋ถ๊ธฐ๋ ๋ฐ๋ณต ๋ฑ์ ๊ตฌํํ ์ ์์ด์ ๋ง์ด ์ฌ์ฉ๋๋๋ฐ, ์ด๊ฒ์ ๊ณ ๊ธ ์ธ์ด์ ์ ์ฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๊ตฌํํ ๊ฒ์ด ๋ฐ๋ก GOTO๋ค.
ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ ๋ฐ๊พธ๋ ๊ธฐ๋ณธ์ ์ธ ๋ช ๋ น์ผ๋ก, ์ผ๋ถ ๊ณ ๊ธ ์ธ์ด์์ ๊ณตํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ช ๋ น์ด๋ค. ์๋๋ CPU์ ๋ช ๋ น์ด ์ค์๋ JUMP๋ผ๋ ๊ฒ์ด ์๋๋ฐ, ์ด๋ฅผ ์ด์ฉํ๋ฉด ์ฝ๋์ ํน์ ๋ถ๋ถ์ผ๋ก ๋ฐ๋ก ์ด๋ํ ์ ์๋ค. ์ด๊ฒ์ ์ด์ฉํ๋ฉด ์กฐ๊ฑด๋ถ๊ธฐ๋ ๋ฐ๋ณต ๋ฑ์ ๊ตฌํํ ์ ์์ด์ ๋ง์ด ์ฌ์ฉ๋๋๋ฐ, ์ด๊ฒ์ ๊ณ ๊ธ ์ธ์ด์ ์ ์ฌํ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ๊ตฌํํ ๊ฒ์ด ๋ฐ๋ก GOTO๋ค.
2. ์์ธ[ํธ์ง]
GOTO๊ฐ ์๋ ์ธ์ด๋ ๋ง์ด ์ฐพ์๋ณผ ์ ์๋๋ฐ, ๋ช ๊ฐ์ง ์ด์ ๊ฐ ์์ด์ ๊ทธ๋ ๋ค.
์ผ๋จ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ค ๋ช ๋ น์ ์คํ ์์๋ฅผ ์ค์ํ๊ฒ ์ฌ๊ธฐ์ง ์๋ ์ธ์ด๋ค, ๋ํ์ ์ผ๋ก ์์ ํจ์ํ ์ธ์ด(Haskell ๋ฑ)์ ์ผ๋ถ ๋ ผ๋ฆฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค(๋ํ์ ์ผ๋ก SQL)์ GOTO๊ฐ ์๋ค. ๋ํ ์ผ๋ถ ํน์ ๋ชฉ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ค์์ ๊ณผ๊ฑฐ ์์ ์ผ๋ก ๋๋์๊ฐ๋ ๊ฒ ๋ถ๊ฐ๋ฅํ ์ธ์ด๋ค(VHDL ๋ฑ)์ด ์๋๋ฐ ์ด๋ค ์ธ์ด๋ค์๋ GOTO๊ฐ ์๋ค. ์ด๋ค ์ธ์ด๋ค์๋ ์์ผ๋ก๋ ์์ํ GOTO๊ฐ ์ถ๊ฐ๋ ์ผ์ด ์๋๋ฐ, ์ธ์ด์ ์์ ๋ ผ๋ฆฌ ์์ฒด์ '์๊ฐ'์ด๋ผ๋ ๊ฐ๋ ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ช ๋ น์ ์คํ ์์๊ฐ ์ค์ํ์ง๋ง GOTO๋ฅผ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ๋ ์๋ค. (๋ํ์ ์ผ๋ก Java์ ๊ฒฝ์ฐ ์์ฝ์ด๋ก์๋ ์กด์ฌํ์ง๋ง ๊ธฐ๋ฅ์ด ์๋ค.) ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ๋ณต๋ฌธ์ ์ง์ํด์ฃผ๋๋ฐ, ์ด๋ฅผ ์ด์ฉํ๋ฉด GOTO๊ฐ ์์ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๋ฐ์ ๋ฌธ์ ๊ฐ ๊ฑฐ์ ์๋ค. ๊ฒ๋ค๊ฐ ์๋์์ ์์ ํ ๋ฌธ์ ์ ๋๋ฌธ์ ์ ์ง์ํ์ง ์๋๋ค.
์ฐธ๊ณ ๋ก GOTO๋ ๋์ผ ํจ์ ๋ด์์์ ์ ํ๋ง ๊ฐ๋ฅํ๋ค. ํจ์๋ผ๋ ๊ฐ๋ ์ด ์๋ ์ธ์ด(์ด์ ๋ธ๋ฆฌ์ด, GW-BASIC ๋ฑ)๋ ์์ค ์ฝ๋ ์๋ฌด ๊ณณ์ผ๋ก๋ ์ ํ๊ฐ ๊ฐ๋ฅํ์ง๋ง ํจ์ ๊ฐ๋ ์ด ์๋ ์ธ์ด์์๋ ํจ์ ๋ฐ๊นฅ์ ๋ ์ด๋ธ๋ก GOTO๋ฅผ ํ๋ ค๊ณ ํ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋๋ค. ๋ฌผ๋ก ์ด ํจ์๋ ๋ฐ์ด๋์ด์ ํน์ ์ฝ๋๋ก ์ด๋ํ๋ ๊ฒ์ด ์์ฃผ ๋ถ๊ฐ๋ฅํ ๊ฒ์ ์๋๋ค. ์๋ฅผ ๋ค์ด์ C/C++์ ๊ฒฝ์ฐ setjmp, longjmp๋ผ๋ ํจ์๋ฅผ ์ ๊ณตํ๋๋ฐ, ์ด๊ฒ์ ์ด์ฉํ๋ฉด ํจ์๋ฅผ ๋์ด์ ์ ํ๋ ๊ฐ๋ฅํ๋ค. ๋ค๋ง ์ด ํจ์๊ฐ ํ๋ ๊ธฐ๋ฅ์ 'ํ์ฌ์ ์คํ์ ์ํ์ ์ฝ๋์ ์์น'๋ฅผ ์ ์ฅํ์ฌ ํน์ ๊ฒฝ์ฐ์ ๊ทธ ์์น๋ก ๋ณต๊ทํ๋ ๊ฒ์ด๋ผ์, ์์ง setjmp๋ฅผ ๋ง๋์ง ์์๊ฑฐ๋ setjmp๊ฐ ๋๋ ๊ฒฝ์ฐ์๋ ์ ํํ ์ ์๋ค. ๋ฌด์จ ๋ง์ธ์ง ์ดํด๊ฐ ์ ์ ๊ฐ์๋ ์๋๋ฐ, C++์ try, catch, throw๊ฐ ํ๋ ์ญํ ๊ณผ ๋น์ทํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
์ผ๋จ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ค ๋ช ๋ น์ ์คํ ์์๋ฅผ ์ค์ํ๊ฒ ์ฌ๊ธฐ์ง ์๋ ์ธ์ด๋ค, ๋ํ์ ์ผ๋ก ์์ ํจ์ํ ์ธ์ด(Haskell ๋ฑ)์ ์ผ๋ถ ๋ ผ๋ฆฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ค(๋ํ์ ์ผ๋ก SQL)์ GOTO๊ฐ ์๋ค. ๋ํ ์ผ๋ถ ํน์ ๋ชฉ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ์ค์์ ๊ณผ๊ฑฐ ์์ ์ผ๋ก ๋๋์๊ฐ๋ ๊ฒ ๋ถ๊ฐ๋ฅํ ์ธ์ด๋ค(VHDL ๋ฑ)์ด ์๋๋ฐ ์ด๋ค ์ธ์ด๋ค์๋ GOTO๊ฐ ์๋ค. ์ด๋ค ์ธ์ด๋ค์๋ ์์ผ๋ก๋ ์์ํ GOTO๊ฐ ์ถ๊ฐ๋ ์ผ์ด ์๋๋ฐ, ์ธ์ด์ ์์ ๋ ผ๋ฆฌ ์์ฒด์ '์๊ฐ'์ด๋ผ๋ ๊ฐ๋ ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
๋ช ๋ น์ ์คํ ์์๊ฐ ์ค์ํ์ง๋ง GOTO๋ฅผ ์ง์ํ์ง ์๋ ๊ฒฝ์ฐ๋ ์๋ค. (๋ํ์ ์ผ๋ก Java์ ๊ฒฝ์ฐ ์์ฝ์ด๋ก์๋ ์กด์ฌํ์ง๋ง ๊ธฐ๋ฅ์ด ์๋ค.) ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ๋ณต๋ฌธ์ ์ง์ํด์ฃผ๋๋ฐ, ์ด๋ฅผ ์ด์ฉํ๋ฉด GOTO๊ฐ ์์ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๋ฐ์ ๋ฌธ์ ๊ฐ ๊ฑฐ์ ์๋ค. ๊ฒ๋ค๊ฐ ์๋์์ ์์ ํ ๋ฌธ์ ์ ๋๋ฌธ์ ์ ์ง์ํ์ง ์๋๋ค.
์ฐธ๊ณ ๋ก GOTO๋ ๋์ผ ํจ์ ๋ด์์์ ์ ํ๋ง ๊ฐ๋ฅํ๋ค. ํจ์๋ผ๋ ๊ฐ๋ ์ด ์๋ ์ธ์ด(์ด์ ๋ธ๋ฆฌ์ด, GW-BASIC ๋ฑ)๋ ์์ค ์ฝ๋ ์๋ฌด ๊ณณ์ผ๋ก๋ ์ ํ๊ฐ ๊ฐ๋ฅํ์ง๋ง ํจ์ ๊ฐ๋ ์ด ์๋ ์ธ์ด์์๋ ํจ์ ๋ฐ๊นฅ์ ๋ ์ด๋ธ๋ก GOTO๋ฅผ ํ๋ ค๊ณ ํ๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋๋ค. ๋ฌผ๋ก ์ด ํจ์๋ ๋ฐ์ด๋์ด์ ํน์ ์ฝ๋๋ก ์ด๋ํ๋ ๊ฒ์ด ์์ฃผ ๋ถ๊ฐ๋ฅํ ๊ฒ์ ์๋๋ค. ์๋ฅผ ๋ค์ด์ C/C++์ ๊ฒฝ์ฐ setjmp, longjmp๋ผ๋ ํจ์๋ฅผ ์ ๊ณตํ๋๋ฐ, ์ด๊ฒ์ ์ด์ฉํ๋ฉด ํจ์๋ฅผ ๋์ด์ ์ ํ๋ ๊ฐ๋ฅํ๋ค. ๋ค๋ง ์ด ํจ์๊ฐ ํ๋ ๊ธฐ๋ฅ์ 'ํ์ฌ์ ์คํ์ ์ํ์ ์ฝ๋์ ์์น'๋ฅผ ์ ์ฅํ์ฌ ํน์ ๊ฒฝ์ฐ์ ๊ทธ ์์น๋ก ๋ณต๊ทํ๋ ๊ฒ์ด๋ผ์, ์์ง setjmp๋ฅผ ๋ง๋์ง ์์๊ฑฐ๋ setjmp๊ฐ ๋๋ ๊ฒฝ์ฐ์๋ ์ ํํ ์ ์๋ค. ๋ฌด์จ ๋ง์ธ์ง ์ดํด๊ฐ ์ ์ ๊ฐ์๋ ์๋๋ฐ, C++์ try, catch, throw๊ฐ ํ๋ ์ญํ ๊ณผ ๋น์ทํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
3. ์์ [ํธ์ง]
BASIC์์์ ์ฌ์ฉ ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์์๊ฐ ์ ์ ๋ฐ๊ตฌ์ง
์ด๋ฅผ ์คํํ๋ฉด 10, 20, 30, 40, 20, 30, 40, 20, 30, 40, ..., 40, 50 ์์ผ๋ก ์คํํ๋ฉด์ ํ์ ๋ ธ๋๋ฅผ 100์๊น์ง ๋ถ๋ฅธ๋ค. ์ง์ ๋๋ ค๋ณด๊ณ ์ถ์ผ๋ฉด http://www.quitebasic.com/ ์ ์ ์ฝ๋๋ฅผ ๋ณต๋ถํด์ ์คํํด๋ณด์.
๋ฐฐ์น ํ์ผ์ ํ์ฉํ ๋ ๋ค๋ฅธ ์์ ๋ก๋
10 LET a = 10
20 PRINT "ํ์์ด " + a + "์์ง๋ฆฌ ํฌํฐ๋ฅผ ์
๊ณ , " + (a + 10) + "์์ง๋ฆฌ ์นผ์ ์ฐจ๊ณ ๋
ธ๋๋ฅผ ํ๋ค. ์์์~"
30 LET a = a + 10
40 IF a < 100 THEN GOTO 20
50 END
์ด๋ฅผ ์คํํ๋ฉด 10, 20, 30, 40, 20, 30, 40, 20, 30, 40, ..., 40, 50 ์์ผ๋ก ์คํํ๋ฉด์ ํ์ ๋ ธ๋๋ฅผ 100์๊น์ง ๋ถ๋ฅธ๋ค. ์ง์ ๋๋ ค๋ณด๊ณ ์ถ์ผ๋ฉด http://www.quitebasic.com/ ์ ์ ์ฝ๋๋ฅผ ๋ณต๋ถํด์ ์คํํด๋ณด์.
๋ฐฐ์น ํ์ผ์ ํ์ฉํ ๋ ๋ค๋ฅธ ์์ ๋ก๋
@echo off
:12
cls
echo ์์ ์
๋๋ค
set /p ์ํธ=์ํธ ์
๋ ฅ:
if %์ํธ%==22 goto 23
goto 12
:23
cls
echo ์ฑ๊ณต!
pause
exit
4. ๋จ์ [ํธ์ง]
๊ณ ๊ธ ์ธ์ด์์ GOTO๋ฌธ์ ๋ง์ ์ปค๋ฎค๋ํฐ์์ ํฐ๋ถ์๋๋ ๊ตฌ๋ฌธ์ด๋ค. ๊ทธ ์ด์ ๋ ์ด๊ฒ ๋๋ฌด ๋ง์ด ์ฐ์ด๋ค ๋ณด๋ฉด ๊ตฌ์กฐ๊ฐ ๋ฌด๋์ง๊ณ ์ฝ๋๊ฐ ํฉํํ๋๋ฉด์ ์ด์งธ ์คํ์ ์ ๋๊ธด ๋๋๋ฐ ์ฝ๋๋ฅผ ์ง ํ๋ก๊ทธ๋๋จธ ์์ ๋ ํท๊ฐ๋ ค ํ๋ ์๋ฆฌ๊ฐ ์ ๋ก ๋์ค๋ฉฐ ์ฝ๊ณ ์ ์ง๋ณด์ํ๊ธฐ๊ฐ ํ๋ค์ด์ง๋ ์ง๊ฒฝ์ ์ด๋ฅด๊ฒ ๋๋ค. ์ด๋ฌํ ์ํ๋ก ๋ ์ฝ๋๋ฅผ '์คํ๊ฒํฐ ์ฝ๋'๋ผ๊ณ ํ๋ค. ์ด๋ฐ ์คํ๊ฒํฐ ์คํ์ผ์ ๋ฐ๋ํ๊ณ ๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ์ ์ฃผ์ฐฝํ ๋ค๋๋๋์ ์ปดํจํฐ ๊ณผํ์ ์์ธ ํ๋ฅด ๋ค์ต์คํธ๋ผ(Edsger Wybe Dijkstra)๋ GOTO๋ฌธ์ ์ฌ์ฉ์ด ํ๋ก๊ทธ๋จ์ ์ ํ์ฑ ๋ถ์๊ณผ ์ฆ๋ช
๋ฑ์ ์ธก๋ฉด์ ํด๊ฐ ๋๋ค๊ณ ํ ๋ฐ ์๋ค. ์ค์ ํ๋ก๊ทธ๋๋ฐํ ๋๋ GOTO๋ฌธ์ ๋จ์ฉํ๋ฉด ๋๋ฒ๊น
๋ถ๊ฐ+๊ธฐ๋ฅ ์ถ๊ฐ ๋ํด+๋ค๋ฅธ ์ฌ๋์ ์ ์ฒ๋จน๊ธฐ+๋ด๊ฐ ์ด๋ฌ๋ ค๊ณ ์ด ์ฝ๋๋ฅผ ์งฐ๋ ์๊ดด๊ฐ ๋ค๊ณ ๊ดด๋ก์ด ์ฌ๋จ ์ฝค๋ณด๊ฐ ์ผ์ด๋ ์ ์๋ค. ๋ํ C์ธ์ด์์ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ๊ธฐ ์ํด ์ด์ฉ ์ ์์ด ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์๋๋ฐ, setjmp, longjmp ๊ฐ์ ๋์ฉํ์ด ์กด์ฌํ๋ค.
์ด๋ ๊ฒ ์์ค๊ฐ ๊ผฌ์ด๋ ๊ฒ์ ์ฌ๋์๊ฒ๋ง ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ด ์๋๋ค. ํ๋ก๊ทธ๋จ์ ์ปดํ์ผ์ ํ๋ฉด ์ต์ ํ๋ฅผ ํด์ผํ๋๋ฐ, ์ธ์ด ์์์ ์ ๊ณตํด์ฃผ๋ ์กฐ๊ฑด๋ฌธ/๋ฐ๋ณต๋ฌธ ๋ฑ์ ์์ฃผ ์ฌ์ฉ๋๊ฑฐ๋ ๋ถ๊ธฐ๋๋ ํน์ ๋ถ๋ถ์ด ๋ช ํํ๊ธฐ ๋๋ฌธ์ ์ต์ ํ๊ฐ ๊ทธ๋ฆฌ ์ด๋ ต์ง๋ ์์ ํธ์ด๋ค. ํ์ง๋ง GOTO๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ๋ณต๋๋ ๋ถ๋ถ์ด ๋ช ํํด์ง์ง ์์์ ์ต์ ํ ๊ฒฐ๊ณผ๊ฐ ์ข์ง ์๊ฑฐ๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์๋ค.
์ด๋ ๊ฒ ์์ค๊ฐ ๊ผฌ์ด๋ ๊ฒ์ ์ฌ๋์๊ฒ๋ง ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ด ์๋๋ค. ํ๋ก๊ทธ๋จ์ ์ปดํ์ผ์ ํ๋ฉด ์ต์ ํ๋ฅผ ํด์ผํ๋๋ฐ, ์ธ์ด ์์์ ์ ๊ณตํด์ฃผ๋ ์กฐ๊ฑด๋ฌธ/๋ฐ๋ณต๋ฌธ ๋ฑ์ ์์ฃผ ์ฌ์ฉ๋๊ฑฐ๋ ๋ถ๊ธฐ๋๋ ํน์ ๋ถ๋ถ์ด ๋ช ํํ๊ธฐ ๋๋ฌธ์ ์ต์ ํ๊ฐ ๊ทธ๋ฆฌ ์ด๋ ต์ง๋ ์์ ํธ์ด๋ค. ํ์ง๋ง GOTO๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฐ๋ณต๋๋ ๋ถ๋ถ์ด ๋ช ํํด์ง์ง ์์์ ์ต์ ํ ๊ฒฐ๊ณผ๊ฐ ์ข์ง ์๊ฑฐ๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด ์ ์๋ค.
5. ์ฅ์ [ํธ์ง]
int sock_create_lite(int family, int type, int protocol, struct socket **res)
{
err = security_socket_create(family, type, protocol, 1);
if (err)
goto out;
sock = sock_alloc();
if (!sock) {
err = -ENOMEM;
goto out;
}
sock->type = type;
err = security_socket_post_create(sock, family, type, protocol, 1);
if (err)
goto out_release;
out:
*res = sock;
return err;
out_release:
sock_release(sock);
sock = NULL;
goto out;
}[2]
GOTO๋ฌธ์ ๋จ์ฉ์ ์์ค์ฝ๋์ ์ดํด๋ฅผ ์ด๋ ต๊ฒ ๋ง๋ค์ง๋ง, ์ ์ ํ ์ฌ์ฉ์ ์คํ๋ ค ์์ค์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ๋ช ๋ฃ์ฑ์ ๋์ด๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ๊ฐ๋ น ๋ค์ค ๋ฐ๋ณต๋ฌธ์์์ ํ์ถ, ์๋ฌ์ ๋ํ ์์ธ ์ฒ๋ฆฌ[3] ๋ฑ ์ผ๋ถ ์์ ์ ํํด์๋ GOTO๋ฌธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ ๋ช ๋ฃํ ๊ฒฝ์ฐ๋ ์๋ค. ๋ค๋ง ์์ ๊ฒฝ์ฐ๋ผ๋ ๋ก์ง ๋ ๋ฒจ์์์ ํ์ถ์ด๋ ํจ์ํ ์ํจ ํ์ return๋ฑ์ ์ด์ฉํ๋ ๋ฑ GOTO๋ฌธ์ ์ฐ์ง ์๊ธฐ๋ฅผ ๊ถ๊ณ ํ๋ ๊ฒฝ์ฐ๋ ๋ง๋ค.
๋ํ์ ์ธ ์์๋ก ๋ฆฌ๋ ์ค ์ปค๋ ์์ค์ฝ๋๋ฅผ ๊น๋ด๋ ์ฌ์ฌ์ฐฎ๊ฒ GOTO๋ฌธ์ ๋ฐ๊ฒฌํ ์ ์๋ค.[4] ์์ ์ฑ์ด ๋งค์ฐ ์ค์ํ ์ด์์ฒด์ ์ปค๋์์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ์์ ์ฝ๋๋ ๋ฆฌ๋ ์ค ์ปค๋์ ์ฝ๋๋ค. ํฐ๋ถ์ ๋๊ธฐ์๋ ๋๋ฆ๋๋ก ์ฐ์์๊ฐ ์๋ ๊ฒ๋ ์ฌ์ค. ๊ทธ๋ฌ๋ ์ด๋ณด์์๊ฒ๋ ๋ง์ ๊ฒฝ์ฐ์ ์ผ์ข ์ ๊ธ๊ธฐ๋ก์จ ๊ฐ๋ฅด์น๋ค. GOTO๋ฌธ์ด ์ ์ฉํ ๊ฒฝ์ฐ๋ ์ด๋๊น์ง๋ ํน์ํ ์ผ์ด์ค์ด๊ณ ์๋ชป ์ฌ์ฉํ์ ๊ฒฝ์ฐ์ ์ด๋์๋ถํฐ ์๋์ผํ ์ง ๋ชจ๋ฅด๋ ์คํ๊ฒํฐ๋ฅผ ๋ง๋ค์ด๋ฒ๋ฆฌ๋๋ฐ๋ค๊ฐ ์ด๋ณด์์ ๊ฒฝ์ฐ ํนํ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ. C์ธ์ด๋ณด๋ค ๊ณ ์์ค ์ธ์ด๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์์ธ์ฒ๋ฆฌ๋ exception(try-catch)์ผ๋ก, C++๊ฐ์ด ๋ฆฌ์์ค ํด์ ๊ฐ ์๋์ด์ง๋ง RAII๋ฅผ ์ง์ํ๋ ๊ฒฝ์ฐ๋ RAII๋ฅผ ์ฌ์ฉํ์. ์ฉ๋ฒ์ ๊ฐ์ผ๋ฉด์ ๊ฐ๋ ์ฑ์ ์ฆ๊ฐํ๋ค. ๋ค๋ง ๊ทธ๋ฐ๊ฑฐ ์๋ C์ธ์ด์์๋ ์์ธ์ฒ๋ฆฌ์ ๋์ ๋ฆฌ์์ค ํด์ฒด์ goto๋ฅผ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
์ด GOTO๋ฌธ์ ์ด์ ๋ธ๋ฆฌ์ด์ ์ฐ๋ฌผ์ด๋ค๋ณด๋ ์ด์ ๋ธ๋ฆฌ์ด์์๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉ์ด ๊ฐ์ ๋๋ค. ์ด์ ๋ธ๋ฆฌ์ด์์๋ ํ๋ก๊ทธ๋จ์ ํ๋ฆ์ ์ ์ดํ ์ ์๋ ๊ตฌ๋ฌธ์ด Jump[5] ๊ณ์ด์ ๋ช ๋ น์ด๋ฐ์ ์๋๋ฐ, ์ด๋ ๋ฌด์กฐ๊ฑด์ ์ผ๋ก ํน์ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด ๋ช ๋ น์ด์์ ์ง์ํ๋ ํ๋ก๊ทธ๋จ ์นด์ดํฐ๋ก ์ด๋ํ๋ ๊ตฌ๋ฌธ์ด๋ค. ๊ณ ๊ธ ์ธ์ด๋ก ์ฐ์ธ ์ฝ๋๋ ์ปดํ์ผํด์ ์ด์ ๋ธ๋ฆฌ ์์ค๋ฅผ ์ด์ด๋ณด๋ฉด ์ ๋ถ GOTO๋ฌธ์ ๋ฐ๋ณตํ์ผ๋ก ๋์ด์๋ค.[6] ์ ํํ๋ jmp ๊ณ์ด ๋ช ๋ น(jmp, jnz, jz ๋ฑ. CPU์ ์ํคํ ์ฒ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค)์ผ๋ก ๋ฐ๋๋ค.
6. ๊ธฐํ[ํธ์ง]
- BASIC์๋ GOTO๋ฌธ ์ธ์๋ GOTO๋ฌธ๊ณผ ๋น์ทํ GOSUB๋ฌธ์ด ์๋ค. ์ฐจ์ด์ ์ GOTO๋ RETURN์ด ์ง์๋์ง ์์ง๋ง GOSUB๋ ์ง์ํ๋ค. GOSUB๋ก ์ง์ ํ ์๋ธ๋ฃจํด์ GOTO๋ก ํ์ถํ๋ ๊ฒ๋ ๊ฐ๋ฅํ์ง๋ง(BASIC์๋ ํจ์ ์ค์ฝํ ๊ฐ๋ ์ด ์๋ค) GOTO๋ก ์ง์ ํ ์๋ธ๋ฃจํด์ RETURN์ผ๋ก ํ์ถํ๋ ค ํ๋ฉด ํ๋ก๊ทธ๋จ์ ๋์์ ์์ธกํ ์ ์๊ฒ ๋๋ค.
- PHP์๋ 5.3 ๋ฒ์ ์์ ์๊ฒผ๋ค.
- Lua์๋ 5.2๋ถํฐ, LuaJIT์์๋ 2.0๋ถํฐ ์๋๋ฐ, ํน์ดํ ์ ์ ํ ์ธ์ด์ Continue๊ฐ ์กด์ฌํ์ง ์๋๋ค.
- C์ธ์ด์์ if์ goto๋ง ์์ด๋ for, while๋ฑ์ ๋๋ถ๋ถ ๋์ฒดํ ์ ์๋ค. ์ฌ์ค for, while๊ฐ GOTO๋ฅผ ๋์ฒดํ ๋ชฉ์ ์ผ๋ก ๋ง๋ค์ด์ก๋ค. ๋ค๋ง switch์ ๊ฒฝ์ฐ๋ ์ ํํ ์ด๋ธ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ์์ ํ ๋์ฒดํ๊ธฐ๋ ํ๋ค๋ค.
[1] ์ด 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๋ฌธ์ ํด๋ก์'์ ํด๋ก์'์ ํด๋ก์?)์ ๋ณด๋๋ค.
[2] ์์ผ ์ธํฐํ์ด์ค ๊ตฌํ(linux/net/socket.c:1027-1054) ์ค ๋ฐ์ท. (GPL ๋ผ์ด์ผ์ค ๋ฐ ์ปค๋ฐ 3c435c)
[3] ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋๋ ์๋ฌ ์ฝ๋ ๋ฐ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ ํ์ ํ๋ก๊ทธ๋จ์ ๊ทธ ์๋ฆฌ์์ ์ข
๋ฃ์์ผ์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ๊ณ์ ์คํ์์ผฐ๋ค๊ฐ๋ ์๋ฌ๊ฐ ์ฐ์์ ์ผ๋ก ๋ฐ์ํ๊ฑฐ๋ ์๊ธฐ์น ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ goto ๋ฌธ์ ํ๋ก๊ทธ๋จ์ ๊ฐ์ฅ ๋์ค๋ก ์ ํ์ํค๋ ์ฉ๋๋ก๋ ์ฌ์ฉํ ์ ์๋ค. ์์ ์์ค์ฝ๋๋ ์๋ฌ ์์ธ์ฒ๋ฆฌ๋ก GOTO๋ฅผ ์ฌ์ฉํ ์์ด๋ค.
[4] ๋ฆฌ๋์ค ํ ๋ฅด๋ฐ์ค๋ ๋ํ์ ์ธ GOTO๋ฌธ ์นํธ์ ์ค์ ํ ๋ช
์ด๋ค.
[5] ์ํคํ
์ฒ์ ๋ฐ๋ผ Branch๋ก ์ฐ๊ธฐ๋ ํจ
[6] ์ด์
๋ธ๋ฆฌ ํ๋ก๊ทธ๋๋ฐ์ ์
๋ฌธํ๋ ๊ฒฝ์ฐ๋ ์ผ๋ถ๋ฌ ๋ฐ๋ณต๋ฌธ์ GOTO์์ผ๋ก ๊ณ ์ณ์ ์ฐ๋ ์ฐ์ต์ ํ๊ธฐ๋ ํ๋ค