이번 강좌는 Part.1 부분의 마지막 강좌입니다. 앞으로 남은 두 강은 프로그래밍 문제가 되겠군요.

 

그렇지만 이번 강은 새로운 명령어를 배우는 것이 아닙니다. "더 보기좋은" 코드를 작성하기 위해서 함수라는 개념을 배우도록 하겠습니다.


 특정 동작들을 묶어주는 함수 

위 그림은 오토핫키에서의 함수를 설명한 그림입니다. 학창시절 수학시간에 배웠던 함수 또한 위와 같은 형태입니다. (X를 넣으면 Y가 나오니까요.)

 

즉, 오토핫키에서 함수는 "입력값을 받아서, 가공하여 출력해주는" 작업을 하게됩니다. 그리고 아래와 같은 기본 형태를 가지게 됩니다.

함수명(전달할 값) // 호출하는 부분
return

함수명(매개변수)
{
    //함수가 호출될 때 할 내용. 매개변수를 변수로 사용할 수 있습니다.
    //이 때, 매개변수의 값은 호출부분에서 전달받은 값입니다.
    //즉 3을 전달받아서 x의 매개변수로 받으면, 변수 x의 값은 3인 것입니다.

    //여담: 함수 내에서 만들어진 변수는 함수 바깥의 변수와 별도입니다.

    return 반환값
}

매개변수는 코드에 설명해놓았고, 반환값은 "함수가 끝난 후 함수가 가질 값"입니다. 예제를 보면 좀 더 쉽게 이해하실 수 있습니다.

 


 간단한 예제 

result := Add(1, 3)
Msgbox, %result%
return

Add(x, y)
{
    c := x + y
    return c
}

44강 1.ahk
0.00MB

일단은 가장 간단한 함수 형태지만, 언뜻 보면 복잡해보입니다. 걱정하지 마세요.

 

먼저, 첫 줄에 result변수에 Add(1, 3)을 대입하는 것을 볼 수 있습니다. 그렇다면 Add(1, 3)은 무엇인지부터 알아보아야겠지요.

 

5번째 줄에 Add(x, y)가 있습니다. 이는 Add(1, 3)에서 1, 3을 각각 x, y 변수에 담아주겠다는 뜻입니다.

 

그 후, 중괄호가 열리면서 x와 y를 더해 c라는 새로운 변수에 담습니다. 그리고 return c라는 구문이 있네요. return이 되는 순간 원래 진행하던 스크립트 위치인 첫 번째 줄로 돌아가서, return된 값이 원래 함수를 호출한 부분에 대신 들어가게 됩니다.

 

즉, Add(1, 3)은 c를 return했으므로 c의 값인 4와 동일합니다.

 

그림으로 요약하면 다음과 같습니다.

result 변수엔 4가 들어가겠네요.

 

 

그럼, 아래와 같은 구문을 이해할 수 있을까요? 반복 횟수를 매개변수로 받아서, 해당하는 수 만큼 반복해주는 스크립트입니다.

BanBok(5)
return

BanBok(x)
{
    Loop, %x%
        MsgBox, %X%회 중 %A_Index%회 반복중입니다.
    return
}

44강 2.ahk
0.00MB

원하는만큼 반복을 시킬 때, 매번 반복문 안의 내용을 써주는 것은 보기에 좋지 않습니다. 위와 같이 BanBok()함수로 묶어서 사용해주시면 예쁘겠네요. 반복문 안의 내용이 길어지면 길어질수록 효율적입니다.

 

첨부한 예제 파일에는 return이 써져있지 않은데, 제 실수입니다. 사실 이처럼 반환값이 없을 땐 return만 써주는 것이 정석이며, 생략이 가능합니다. 습관처럼 생략하다보니 정석을 놓쳤네요.

 

마지막으로, 매개변수가 필요없으면 생략이 가능합니다.

함수명()
return

함수명()
{
    //함수의 내용
    return
}

함수의 내용을 실행한 후 돌아옵니다. Gosub과 동일한 동작입니다. (그래서, Gosub 대신 함수를 권장합니다.)

 


 추가 예제 

내용이 많이 어려우니 몇 가지 예제를 더 들고 마치겠습니다.

gugudan(7)
gugudan(8)
gugudan(9)
return

gugudan(dan)
{
    a := 0
    Loop, 9
        result .= dan " x " A_Index " = " dan * A_Index "`n"
    MsgBox, %result%
    return
}

44강 3.ahk
0.00MB

구구단 7, 8, 9단을 세 줄의 코드와 하나의 함수로 작성했습니다.

 

CoordMode, Pixel, Screen

err := Img("1")
if (err = 0)
    MsgBox, 1번 이미지 찾았습니다.
err := Img("2")
if (err = 1)
    MsgBox, 2번 이미지는 못찾았습니다.
return

Img(ImageName)
{
    ImageSearch, vx, vy, 0, 0, 1920, 1080, *30 %ImageName%.png
    return errorlevel
}

44강 4.ahk
0.00MB

복잡한 이미지서치 구문을 함수화시켰습니다. 이미지서치를 할 때마다 이미지 이름만 매개변수로 넣어주면 되겠네요. Img("1")처럼 말이에요. 이 때, 이미지 이름은 문자열이므로 괄호 안에서 따옴표("")를 써준 것을 볼 수 있습니다.

 

errorlevel을 반환해주었고, errorlevel을 err 변수에 담아주었습니다.

err의 값에 따라 이미지서치의 동작을 다르게 하면 됩니다. 예제와 같이 말입니다.

 


함수는 써봐야 늡니다. 잘만 쓰면 1000줄이 넘어가는 코드도 1/10의 크기로 줄일 수 있는 경우가 많습니다.

특히 어떤 행위를 조금씩만 바꿔가며 반복해야할 때, 함수를 사용해주면 간단하게 줄일 수 있습니다.

 

필수적으로 사용해야하는 구문은 아니지만, 이왕이면 보기 좋은 코드를 작성하는게 좋으니까요. 사용하시는 것을 권장합니다.

 

다음 강은 프로그래밍 문제입니다.

 


| 44. 함수 |