29 - [오토핫키] 함수

    수학시간에 함수에 대해 배우죠? Y = 2x + 1 처럼 입력 값에 따라 출력값이 변하는것을 함수 라고 배웠는데 오토핫키에서 다루는 함수도 마찬가지 입니다. 반복되는 스크립트를 묶어 함수로 구성한다면 스크립트의 양이 엄청나게 줄어들게 되죠. 또한 함수는 스크립트 어느곳에 있어도 순서에 영향을 받지 않는 독립적인 영역입니다. 일반적으로 함수는 하단부에 모아놓는 경우가 많아요.

    또한 앞서 Return을 설명할때 스크립트를 종료하는 기능으로 사용했죠? 함수에서 Return은 값을 반환하는 역할을 합니다. 무조껀 많이 해보세요.

     

     

    1. 함수의 선언

    Name(Var1, Var2...)

    {

      Script

      Return Value

    }

    Name : 함수 이름

    Var1, 2... : 함수 안에서 사용될 변수

    { } : 함수는 반드시 중괄호로 묶여야함

    Script : 함수 안에서 실행될 명령어

    Return Vlaue : 반환값 (생략가능)

     

     

    2. 함수의 호출

    Name(InputValue1, InputValue2...)

    Name : 함수 이름

    InputValue1, 2... : 함수에게 사용할 값

     

     

    예제

    예제1)

    F1::

    a:=My_Function(2)  ;함수호출

    MsgBox, %a%

    Return

     

    My_Function(a)  ;함수선언

    {

      Return a+1

    }

    예제2)

    My_Function(a, b)  ;함수선언

    {

      c:=a+b

      Return c

    }

     

    F1::

    a=3

    b=5

    MsgBox % My_Function(a, b)  ;함수호출

    Return

     

     

    예제1을 볼게요. 변수 a에 My_Function함수값 2를 넣어 호출을 합니다. 따라서 다음 줄인 MsgBox를 읽는게 아니라 함수선언 부분을 읽어갑니다. My_Function함수 내부에는 a라는 변수를 사용합니다. 함수 내부는 지역변수 라고 하여 함수 바깥부분과 별개로 변수를 사용합니다. 따라서 스크립트부분에 있는 변수 a와 함수 내부의 변수 a는 값이 다르게 되겠죠.

    함수호출에서 2라는 값을 함수선언에 대입 하였기 때문에 a=2가 됩니다. 이제 함수부분의 { } 중괄호 부분을 읽는데 Return으로 a+1이라는 값을 반환하네요. 즉 2라는 값을 받아 +1을 한 후 함수를 호출한 값에 돌려준다는 뜻입니다. 값을 돌려받았으니 MsgBox가 읽히면서 3이라는 출력값이 나오게 되는거죠.

    예제2를 봅시다. 함수선언을 먼저 해도 상관없어요. "F1"을 누르면 a=3, b=5라는 변수가 선언되고 MsgBox를 실행합니다만 %가 하나만 사용되었습니다!! 이는 변수를 표현식으로 열어볼 수 있게 합니다.

    그럼 함수호출을 하는데 a=3, b=5이기 때문에 함수선언부에 3, 5가 각각 입력됩니다. 또한 함수 내부에서 c라는 새로운 변수가 선언되었고 이 c값을 함수호출에게 돌려줘야 하니까 Return을 사용하여 8이라는 결과를 얻습니다.

     

     

    예제

    예제3)

    F1::

    My_Function(300, 400)  ;함수호출

    My_Function(100, 240)  ;함수호출

    Return

     

    My_Function(a, b)  ;함수선언

    {

      MouseClick, , a, b

      MsgBox, 좌표%a% / %b%를 클릭합니다.

    }

    예제4)

    F1::

    a=3

    b=5

    My_Function()  ;함수호출

    MsgBox, %a% / %b%

    Return

     

    My_Function()  ;함수선언

    {

      global a, b

      a:=a+b

    }

     

     

    예제3은 각기 다른 값으로 함수를 두번 호출 했습니다. 또한 함수 자체가 명령어를 실행하고 반환할 값이 없기 때문에 Return은 생략해도 됩니다.

    예제4는 값을 지정하지 않은채 함수를 사용했습니다. 함수 안에 있는 global이 보이시나요? 앞서 함수 내부의 변수는 지역변수로 스크립트 부분과 별개로 다룬다고 했습니다만 global을 사용하면 일시적으로 스크립트의 변수를 사용할 수 있고 이를 전역변수라고 합니다. 따라서 a=3, b=5라는 값을 함수에서 사용하여 a는 8이 되고 b는 원래의 변수 값인 5라는 값을 출력합니다.

     

    예제

    예제5)

    F1::

    MsgBox % My_Function(2)  ;함수호출

    MsgBox % My_Function(2, 6)  ;함수호출

    Return

     

    My_Function(a, b=3)  ;함수선언

    {

      Return a*b

    }

    예제6)

    F1::

    MsgBox % My_Function(1)  ;함수호출

    Return

     

    My_Function(a)  ;함수선언

    {

      If a=10

        Return a

      else

        Return a+My_Function(a+1)

    }

     

     

    예제5는 값을 생량할 수 있는 함수 입니다. 함수를 선언할때 b=3이라는 기본값을 지정했기 때문에 첫번째 메시지박스는 2를 a에 대입하고 기본값인 3을 사용하여 6이라는 결과를 얻습니다. 두번째 메시지박스는 2와 6을 대입하여 12라는 결과를 얻어요.

    예제6은 재귀함수 라고 하며 함수가 자신의 함수를 다시 실행합니다. 1을 입력하여 함수를 호출합니다. a=10이 아니기 때문에 else에서 Return a+My_Function(a+1)을 실행하여 함수에+1을 더한 함수를 다시 호출합니다. 이 과정을 반복하여 a=10이 되는 순간 a를 반환하며 55라는 결과를 얻었습니다. 사람으로 따지면 1+2+3+4+5+6+7+9+10=55 라고 계산한것과 같아요.

     

     

     

     

     

     

    Posted by 옹봉이