프날 오토핫키 강좌
누르면 강좌 리스트가 나와요
프날 오토핫키 강좌

⚠ 이 강좌는 오토핫키 v1을 다룹니다

지금 보시는 강좌는 구버전 오토핫키(v1.1)를 다루고 있습니다. 따라서 본 강좌의 내용은 현재 최신 오토핫키 버전 (v2.0)과 호환되지 않습니다. 구버전의 정보가 필요한 것이 아니라면, 가능한 한 새로운 사이트에 작성한 v2 강좌(https://ahkv2.pnal.dev)를 봐주시길 바랍니다.

[프날 오토핫키] 42. Goto와 Gosub

이번 강에서는 레이블(Label)의 개념과 Goto, Gosub을 알아보겠습니다.

 


 위치를 표시해주는 레이블 

레이블은 스크립트 상 특정 줄에 이름을 매겨주는 역할을 합니다. 아래와 같이 사용합니다.

레이블명:

핫키를 사용할 때와 다르게, 콜론(:)이 하나만 들어갑니다.

 

예를 들어서, 70번째 줄에 point1이라는 레이블이 있다고 가정합시다.

그렇다면 우리는 이 줄을 "70번째 줄"이라고 부를 수도 있겠지만, "point1"이라고도 부를 수 있습니다.

 

언뜻 보면 쓸모가 없어 보입니다.

그렇지만 아래 나올 Goto와 Gosub, 추후에 배울 GUI에서의 g레이블 개념은 이 레이블이 필수적입니다.

 

이 때, 콜론(:)과 return 사이를 "서브루틴"이라고 부릅니다.

[서브루틴]

Label:
..// 스크립트
..// 스크립트
..// 스크립트
..// 스크립트
..// 스크립트
return

 위치를 이동시켜주는 Goto 

Goto의 용법은 아래와 같습니다.

Goto, 레이블
레이블:

Goto 뒤에 오는 레이블을 스크립트에서 찾아, 해당 서브루틴으로 "점프"합니다.

 

아래와 같이, Goto는 일종의 순간이동 장치라고 할 수 있습니다.

MsgBox, 첫 번째 대화 상자
Goto, Point1
MsgBox, 여기는 대화 상자가 나오지 않습니다.
Point1:
MsgBox, 두 번째 대화 상자

 

즉 Goto는 레이블로 서브루틴을 호출한다고 할 수 있습니다.

다시 말씀드리지만, Goto의 매개변수가 "레이블", 콜론으로 써진 (레이블:)부분부터 return까지가 서브루틴입니다.

Goto, 레이블
return


;▼ 서브루틴

레이블:
..// 스크립트
..// 스크립트
return

 


 갔다가 돌아오는 Gosub 

Gosub은 Goto와 비슷합니다. Goto처럼 레이블명으로 순간이동 한 뒤, return을 만나면 다시 원래 자리로 돌아옵니다.

줄 번호로 설명을 해드릴려고 하니 사진을 잘 봐주세요.

첫 줄에서 Gosub을 만나 Point1레이블로 이동합니다.

그 후 첫 번째 대화상자를 출력한 후, return을 만나 "Gosub의 바로 밑 줄인 2번 줄"로 돌아옵니다.

두번째 MsgBox를 출력한 후 스크립트가 종료될것입니다.

 


 예시 

아래 예시와 같은 끔찍한 예시가 있습니다. 반복문과 탈출(Loop, Break)구문을 goto만으로 구현했습니다.

point1:
a++
Msgbox, %a%
if (a = 10)
{
    goto, point2
}
goto, point1
point2:
exitapp

정말 알아보기도 힘들고 끔찍합니다.

 

MsgBox, 부
Gosub, point
MsgBox, 자
Gosub, point
ExitApp
Point:
MsgBox, 전
return

역시 끔찍합니다. "부" "전" "자" "전" 글자를 하나씩 출력하는 구문입니다. 그냥 MsgBox 4줄 쓰세요.

 


Goto와 Gosub은 오토핫키에서 완전히 매장된 명령어입니다. 예시와 같이, 스크립트가 더럽고 알아보기 힘들기도 하고, 지정된 스크립트의 흐름을 벗어나서 이동하기 때문에 코드를 눈으로 따라가기 힘들어지기 때문입니다.

 

그럼에도 불구하고 굳이 꺼내서 강좌를 쓴 이유는

  1. 레이블의 사용법을 알려드리기 위해
  2. Goto와 Gosub이 안좋다는 것을 눈으로 보여드리기 위해

입니다.

 

다음 강좌는 Goto와 Gosub이 왜 좋지 않은지에 대해 따로 설명을 드리도록 하겠습니다. 더불어, 강좌를 읽으시는 여러분들은 Goto와 Gosub을 가능한 한 사용하지 말아주세요. 좋은 코딩 습관을 위해서입니다.

 

명심하세요. 모든 Goto와 Gosub 구문은 다른 구문으로 더 간결하게 대체할 수 있습니다.

 


| 42. Goto와 Gosub |