반응형

🎯 이 글에서 배우는 것: 함수 정의, 매개변수, 반환값, 지역/전역 변수
📦 함수란?
함수는 재사용 가능한 코드 블록입니다. 마치 레시피처럼 한 번 만들어두면 필요할 때마다 사용할 수 있죠!
왜 함수를 쓸까?
❌ 함수 없이:
; 여러 곳에서 같은 코드 반복...
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 랜덤
🎮 실습 과제
- 섭씨를 화씨로 변환하는 함수
CtoF(c)만들기 (공식: F = C × 9/5 + 32) - 문자열을 뒤집는 함수
Reverse(str)만들기 - 배열의 합계를 구하는 함수
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 := "손님") |
| 참조 전달 | ¶m |
Swap(&a, &b) |
| 가변 인자 | params* |
Sum(nums*) |
| 화살표 함수 | => |
Add := (a,b) => a+b |
| 전역 변수 | global |
global counter |
이전 글: [#8 제어문]
다음 글: [#10 키 리매핑]
반응형
'🔬 과학·테크 > 🔥 AutoHotkey v2 입문 가이드' 카테고리의 다른 글
| AutoHotkey v2 입문 가이드 #11: GUI 기초 - 나만의 창 만들기 (0) | 2025.12.14 |
|---|---|
| AutoHotkey v2 입문 가이드 #10: 키 리매핑 - 키보드 재창조하기 (0) | 2025.12.13 |
| AutoHotkey v2 입문 가이드 #8: 제어문 - if/else, Loop, While, For (0) | 2025.12.11 |
| AutoHotkey v2 입문 가이드 #7: 변수와 데이터 타입 - 데이터 다루기의 기초 (0) | 2025.12.10 |
| AutoHotkey v2 입문 가이드 #6: 프로그램 실행과 창 관리 - Run, WinActivate, WinWait (0) | 2025.12.09 |