ETC/Auto Hotkey

오토핫키 스크립팅의 심장: 변수 완전 정복 가이드

shimdh 2025. 10. 26. 20:08
728x90

안녕하세요, 자동화 마니아 여러분! 오늘은 오토핫키(AutoHotkey, AHK) 스크립팅의 핵심을 파헤쳐보겠습니다. AHK는 단순한 반복 작업 자동화부터 복잡한 시스템 제어까지, 일상과 업무를 혁신적으로 바꿔주는 강력한 도구입니다. 하지만 이 모든 마법의 중심에는 변수가 자리 잡고 있죠. 변수를 제대로 다루지 못하면 스크립트가 딱딱하고 비효율적으로 느껴질 테니까요. 이 가이드에서는 변수의 기본부터 고급 활용까지 완벽히 정복하는 방법을 단계별로 설명하겠습니다. 초보자부터 중급자까지, AHK를 더 깊이 파고들고 싶다면 이 글이 딱 맞아요!

728x90

변수란 무엇이며 왜 중요한가?

변수는 스크립트 내에서 데이터를 저장하고 조작할 수 있는 이름이 붙은 저장 공간입니다. 비유하자면, 정보를 담는 '컨테이너'나 특정 값을 가리키는 '라벨'이라고 할 수 있어요. 프로그래밍에서 변수가 왜 필수적인지, 그 이유를 세 가지로 정리해 보죠.

1. 정의: 값을 저장하는 상징적인 이름

변수는 단순한 메모리 공간이 아니라, 특정 값과 연결된 상징적인 이름입니다. 이 이름을 통해 스크립트의 어디서든 데이터를 쉽게 불러오거나 수정할 수 있어요. 예를 들어, name 변수에 "김철수"라는 값을 저장하면, 스크립트 전체에서 name을 호출할 때마다 "김철수"에 접근할 수 있습니다. 이는 코드를 읽기 쉽고 유지보수하기 좋게 만들어줍니다.

2. 목적: 동적인 데이터 처리의 기반

변수가 없다면 모든 값이 하드코딩(hardcoding) 되어야 해요. 즉, "볼륨 50"처럼 숫자를 직접 입력해야 하는데, 이는 유연성이 떨어집니다. 사용자 입력, 시스템 시간, 파일 내용 등 변화무쌍한 데이터에 대응하려면 변수가 필수죠. 변수 덕분에 스크립트가 조건에 따라 동적으로 반응하고, 더 상호작용적이고 실용적인 자동화를 구현할 수 있습니다. 예를 들어, 현재 시간에 따라 다른 인사말을 출력하는 스크립트도 변수 하나로 가능해요!

3. 추가 이점: 코드 재사용성과 디버깅 용이성

변수는 코드를 모듈화하고 재사용하기 쉽게 하며, 디버깅 시 문제점을 빠르게 추적할 수 있게 해줍니다. AHK처럼 가벼운 언어에서 변수는 스크립트의 '뼈대' 역할을 하죠.

오토핫키에서 변수 선언하기

AHK에서 변수를 선언하는 건 초간단합니다. 할당 연산자를 사용해 변수 이름에 값을 넣기만 하면 돼요. AHK v1과 v2의 차이를 고려해 보죠 (이 가이드는 v2 기준으로 설명하겠습니다).

  • := (표현식 할당): 권장 방식. 복잡한 표현식 결과를 변수에 저장합니다.
  • = (간단 할당): 숫자나 기본 문자열에만 사용하세요. 표현식에서 오해의 소지가 있어요.
name := "John Doe"  ; 표현식 할당: 문자열 "John Doe"를 name에 저장
age = 30            ; 간단 할당: 숫자 30을 age에 저장

이 예시에서 name은 문자열을, age는 숫자를 담고 있어요. 선언 후 바로 사용 가능하니, AHK의 직관성을 느껴보세요!

변수에 저장되는 다양한 데이터 유형

AHK 변수는 유연해서 여러 유형의 데이터를 담을 수 있습니다. 각 유형은 특정 용도에 최적화되어 있어요. 아래에서 주요 유형을 살펴보죠.

1. 문자열 (String)

텍스트 기반 데이터(메시지, 경로, 이름 등)를 저장합니다. . 연산자로 문자열을 연결할 수 있어요.

greeting := "Hello, " . name  ; "Hello, John Doe" 생성

2. 숫자 (Number)

정수나 부동 소수점 숫자를 저장하며, 계산에 필수적입니다. AHK는 자동으로 유형을 처리해줘요.

totalPrice := 19.99 * age  ; 19.99 * 30 = 599.7 계산

3. 부울 (Boolean)

true 또는 false만 저장. 조건문(if)에서 조건을 표현할 때 유용합니다.

isActive := true  ; 상태 플래그로 사용
if (isActive) {
    MsgBox "활성 상태입니다!"
}

4. 배열 및 객체 (Array & Object) - 고급 활용

복잡한 데이터를 다룰 때 빛을 발합니다.

  • 배열(Array): 순서 있는 목록.
  • 객체(Object): 키-값 쌍으로 구조화된 데이터.
myArray := ["사과", "바나나", "체리"]  ; 배열: myArray[1] = "사과"
myObject := {Name: "Alice", Age: 25}  ; 객체: myObject.Name = "Alice"

이 유형들은 루프나 JSON 처리 같은 고급 작업에 필수예요.

변수 스코프: 접근 범위 이해하기

변수의 스코프(scope) 는 어디서 접근할 수 있는지를 정의합니다. 잘못된 스코프 관리는 버그의 원인이 되니 주의하세요!

1. 전역 변수 (Global Variable)

스크립트 전체에서 접근 가능. 공유 데이터(설정값 등)에 적합합니다.

globalVar := "나는 전역 변수야"

myFunction() {
    MsgBox globalVar  ; 함수 안에서도 OK
}

2. 지역 변수 (Local Variable)

함수 내에서만 유효. local 키워드로 선언하며, 메모리 효율이 좋습니다.

myFunction() {
    local localVar := "나는 지역 변수야"
    MsgBox localVar  ; 함수 밖에서는 접근 불가
}

전역은 과도하게 사용하지 말고, 지역으로 한정하세요. AHK v2에서는 기본적으로 지역 스코프를 권장합니다.

변수 값 수정하기: 동적 스크립트의 힘

변수는 선언 후 언제든 수정할 수 있어요. 이는 AHK 스크립트를 사용자 입력이나 실시간 변화에 적응하게 만듭니다.

count := 0  ; 초기화
count += 1  ; count = count + 1 (1 증가)
MsgBox count  ; "1" 출력

게임 점수 업데이트, 루프 카운터, 상태 변경 등에 활용하세요. +=, -=, *=, /= 같은 단축 연산자가 편리합니다.

실용적인 변수 사용 사례 예시

이론만으로는 부족하죠? 실제 AHK 스크립트에서 변수를 어떻게 쓰는지 두 예시로 확인해 보세요.

예시 1: 간단한 계산기 스크립트

사용자 입력으로 두 숫자를 더하는 기본 계산기. 변수가 입력과 출력을 연결합니다.

num1 := InputBox("첫 번째 숫자를 입력하세요:")
num2 := InputBox("두 번째 숫자를 입력하세요:")
sum := num1 + num2  ; 합계 계산
MsgBox "합계는: " . sum  ; 결과 표시

이 스크립트는 변수 덕분에 사용자 맞춤형으로 동작하며, 더 복잡한 연산(곱셈, 나눗셈)으로 확장하기 쉽습니다.

예시 2: 사용자 환경설정 관리

볼륨 레벨이나 창 크기 같은 설정을 변수로 관리하면, 한 곳만 수정해도 전체 스크립트가 업데이트됩니다. (코드베이스의 여러 줄을 변경할 필요 없이!)

; 기본 설정 변수
volumeLevel := 50  ; 기본 볼륨 (0-100)
windowWidth := A_ScreenWidth / 2  ; 화면 너비의 절반 (A_ScreenWidth: 내장 변수)
windowHeight := A_ScreenHeight * 0.8  ; 화면 높이의 80%

; 설정 적용 예시 (가상의 볼륨 조절 및 창 리사이즈)
SoundSet, %volumeLevel%  ; 시스템 볼륨 설정
WinMove, A,, (A_ScreenWidth - windowWidth) / 2, (A_ScreenHeight - windowHeight) / 2, %windowWidth%, %windowHeight%  ; 활성 창 중앙 배치

; 사용자 입력으로 설정 변경
newVolume := InputBox("새 볼륨 레벨을 입력하세요 (0-100):")
if (newVolume >= 0 && newVolume <= 100) {
    volumeLevel := newVolume
    SoundSet, %volumeLevel%
    MsgBox "볼륨이 " . volumeLevel . "으로 변경되었습니다!"
}

이 예시는 변수가 설정 중앙화의 힘을 보여줍니다. 파일에서 설정을 불러오거나 GUI로 수정하면 더 강력해져요.

728x90