🔬 과학·테크/🔥 AutoHotkey v2 입문 가이드

AutoHotkey v2 입문 가이드 #9: 함수 기초 - 코드 재사용의 마법

_eNKI 2025. 12. 12. 19:46
반응형

🎯 이 글에서 배우는 것: 함수 정의, 매개변수, 반환값, 지역/전역 변수


📦 함수란?

함수는 재사용 가능한 코드 블록입니다. 마치 레시피처럼 한 번 만들어두면 필요할 때마다 사용할 수 있죠!

왜 함수를 쓸까?

❌ 함수 없이:

; 여러 곳에서 같은 코드 반복...
MsgBox("=== 시작 ===")
MsgBox("처리 중...")
MsgBox("=== 완료 ===")

; 또 반복...
MsgBox("=== 시작 ===")
MsgBox("처리 중...")
MsgBox("=== 완료 ===")

✅ 함수 사용:

ShowProgress() {
    MsgBox("=== 시작 ===")
    MsgBox("처리 중...")
    MsgBox("=== 완료 ===")
}

ShowProgress()  ; 호출만 하면 됨!
ShowProgress()  ; 또 필요하면 다시 호출

📝 함수 정의하기

기본 구조

함수이름() {
    ; 실행할 코드
}

예제

SayHello() {
    MsgBox("안녕하세요!")
}

; 함수 호출
SayHello()

📨 매개변수 (Parameters)

함수에 값을 전달할 수 있습니다:

단일 매개변수

Greet(name) {
    MsgBox("안녕하세요, " name "님!")
}

Greet("홍길동")    ; "안녕하세요, 홍길동님!"
Greet("김철수")    ; "안녕하세요, 김철수님!"

여러 매개변수

Add(a, b) {
    MsgBox(a " + " b " = " (a + b))
}

Add(3, 5)    ; "3 + 5 = 8"
Add(10, 20)  ; "10 + 20 = 30"

기본값 (Default Value)

Greet(name := "손님") {
    MsgBox("안녕하세요, " name "님!")
}

Greet("홍길동")  ; "안녕하세요, 홍길동님!"
Greet()          ; "안녕하세요, 손님님!" (기본값 사용)

🎁 반환값 (Return)

함수가 결과를 돌려줍니다:

기본 반환

Add(a, b) {
    return a + b
}

result := Add(3, 5)
MsgBox(result)  ; 8

여러 곳에서 반환

GetGrade(score) {
    if (score >= 90)
        return "A"
    if (score >= 80)
        return "B"
    if (score >= 70)
        return "C"
    return "F"
}

MsgBox(GetGrade(85))  ; "B"
MsgBox(GetGrade(92))  ; "A"

아무것도 반환 안 하기

PrintMessage(msg) {
    MsgBox(msg)
    ; return 없으면 빈 문자열("") 반환
}

🌍 변수 범위 (Scope)

지역 변수 (Local)

함수 안에서만 존재:

TestLocal() {
    localVar := "나는 지역 변수"
    MsgBox(localVar)
}

TestLocal()
; MsgBox(localVar)  ; ❌ 에러! 함수 밖에서는 접근 불가

전역 변수 (Global)

스크립트 어디서든 접근 가능:

global myGlobal := "전역 변수입니다"

ShowGlobal() {
    global myGlobal
    MsgBox(myGlobal)
}

ShowGlobal()  ; "전역 변수입니다"

전역 변수 수정

global counter := 0

Increment() {
    global counter
    counter++
}

Increment()
Increment()
Increment()
MsgBox(counter)  ; 3

📤 참조로 전달 (ByRef)

변수를 직접 수정하고 싶을 때:

; 일반 전달 (값 복사)
Double(n) {
    n := n * 2
}

num := 5
Double(num)
MsgBox(num)  ; 여전히 5 (원본 안 바뀜)

; 참조 전달 (&)
DoubleByRef(&n) {
    n := n * 2
}

num := 5
DoubleByRef(&num)
MsgBox(num)  ; 10 (원본 바뀜!)

여러 값 반환하기

GetMinMax(arr, &minVal, &maxVal) {
    minVal := arr[1]
    maxVal := arr[1]
    for val in arr {
        if (val < minVal)
            minVal := val
        if (val > maxVal)
            maxVal := val
    }
}

numbers := [5, 2, 8, 1, 9]
GetMinMax(numbers, &min, &max)
MsgBox("최소: " min ", 최대: " max)  ; 최소: 1, 최대: 9

♾️ 가변 매개변수

매개변수 개수가 정해지지 않을 때:

Sum(numbers*) {
    total := 0
    for num in numbers
        total += num
    return total
}

MsgBox(Sum(1, 2, 3))          ; 6
MsgBox(Sum(1, 2, 3, 4, 5))    ; 15
MsgBox(Sum(10, 20))           ; 30

🚀 화살표 함수 (Fat Arrow)

짧은 함수를 한 줄로:

기본 형태

; 일반 함수
Add(a, b) {
    return a + b
}

; 화살표 함수
Add := (a, b) => a + b

MsgBox(Add(3, 5))  ; 8

매개변수 없는 경우

GetTime := () => FormatTime(, "HH:mm:ss")
MsgBox(GetTime())

핫키와 함께 사용

^1::MsgBox("Ctrl+1 눌림!")  ; 이것도 일종의 화살표 함수!

🔧 실용적인 함수 예제

예제 1: 경로 처리

GetFileName(path) {
    SplitPath(path, &name)
    return name
}

GetFolder(path) {
    SplitPath(path,, &dir)
    return dir
}

fullPath := "C:\Users\홍길동\Documents\report.docx"
MsgBox("파일명: " GetFileName(fullPath))  ; report.docx
MsgBox("폴더: " GetFolder(fullPath))      ; C:\Users\홍길동\Documents

예제 2: 문자열 반복

Repeat(str, times) {
    result := ""
    Loop times
        result .= str
    return result
}

MsgBox(Repeat("안녕 ", 3))  ; "안녕 안녕 안녕 "
MsgBox(Repeat("*", 10))     ; "**********"

예제 3: 배열 필터링

FilterEvens(arr) {
    result := []
    for num in arr {
        if (Mod(num, 2) = 0)
            result.Push(num)
    }
    return result
}

numbers := [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
evens := FilterEvens(numbers)

for num in evens
    MsgBox(num)  ; 2, 4, 6, 8, 10

예제 4: 안전한 클릭

SafeClick(x, y, waitTime := 100) {
    Click x, y
    Sleep waitTime
}

; 사용
SafeClick(100, 200)       ; 클릭 후 100ms 대기
SafeClick(300, 400, 500)  ; 클릭 후 500ms 대기

예제 5: 클립보드 처리

CopyToClipboard(text) {
    A_Clipboard := ""
    A_Clipboard := text
    ClipWait(1)
    return A_Clipboard != ""
}

if CopyToClipboard("복사할 텍스트")
    MsgBox("복사 성공!")
else
    MsgBox("복사 실패!")

📚 내장 함수 활용

문자열 함수

str := "Hello World"

MsgBox(StrLen(str))           ; 11 (길이)
MsgBox(SubStr(str, 1, 5))     ; "Hello" (부분 문자열)
MsgBox(StrUpper(str))         ; "HELLO WORLD"
MsgBox(StrLower(str))         ; "hello world"
MsgBox(InStr(str, "World"))   ; 7 (위치)
MsgBox(StrReplace(str, "World", "AHK"))  ; "Hello AHK"

숫자 함수

MsgBox(Abs(-5))        ; 5 (절댓값)
MsgBox(Round(3.7))     ; 4 (반올림)
MsgBox(Floor(3.7))     ; 3 (내림)
MsgBox(Ceil(3.2))      ; 4 (올림)
MsgBox(Max(3, 7, 5))   ; 7 (최댓값)
MsgBox(Min(3, 7, 5))   ; 3 (최솟값)
MsgBox(Random(1, 100)) ; 1~100 랜덤

🎮 실습 과제

  1. 섭씨를 화씨로 변환하는 함수 CtoF(c) 만들기 (공식: F = C × 9/5 + 32)
  2. 문자열을 뒤집는 함수 Reverse(str) 만들기
  3. 배열의 합계를 구하는 함수 ArraySum(arr) 만들기
정답 보기 👀
#Requires AutoHotkey v2.0

; 1. 섭씨→화씨
CtoF(c) {
    return c * 9 / 5 + 32
}
MsgBox(CtoF(0))    ; 32
MsgBox(CtoF(100))  ; 212

; 2. 문자열 뒤집기
Reverse(str) {
    result := ""
    Loop StrLen(str)
        result := SubStr(str, A_Index, 1) . result
    return result
}
MsgBox(Reverse("Hello"))  ; "olleH"

; 3. 배열 합계
ArraySum(arr) {
    total := 0
    for num in arr
        total += num
    return total
}
MsgBox(ArraySum([1, 2, 3, 4, 5]))  ; 15

📚 다음 시간 예고

다음 글에서는 키 리매핑을 배웁니다:

  • 키 재배치
  • CapsLock 활용
  • 특수 리매핑 기법

키보드를 재창조해봅시다! ⌨️


🔑 오늘 배운 핵심 정리

개념 문법 예제
함수 정의 이름() {...} Add(a, b) {...}
반환 return 값 return a + b
기본값 param := 값 Greet(name := "손님")
참조 전달 &param Swap(&a, &b)
가변 인자 params* Sum(nums*)
화살표 함수 => Add := (a,b) => a+b
전역 변수 global global counter

이전 글: [#8 제어문]
다음 글: [#10 키 리매핑]

반응형