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

AutoHotkey v2 입문 가이드 #7: 변수와 데이터 타입 - 데이터 다루기의 기초

_eNKI 2025. 12. 10. 19:44
반응형

🎯 이 글에서 배우는 것: 변수 선언, 문자열, 숫자, 배열, 객체, Map


📦 변수란?

변수는 값을 저장하는 상자입니다. 이름을 붙여서 나중에 다시 사용할 수 있죠.

name := "홍길동"     ; 상자에 "홍길동" 넣기
age := 25           ; 상자에 25 넣기

MsgBox(name)        ; 상자에서 꺼내서 보여주기
MsgBox(age)

📝 변수 선언과 할당

기본 할당

v2에서는 := 연산자로 값을 할당합니다:

x := 10              ; 숫자
name := "Alice"      ; 문자열
isActive := true     ; 불리언 (참/거짓)

⚠️ 주의: = 하나만 쓰면 비교입니다! 할당은 반드시 :=

x = 10   ; ❌ 이건 비교 (x가 10과 같은가?)
x := 10  ; ✅ 이건 할당 (x에 10을 넣어라)

변수명 규칙

  • 영문자, 숫자, 언더스코어(_) 사용 가능
  • 숫자로 시작할 수 없음
  • 대소문자 구분 안 함 (Namename은 같음)
myVariable := 1      ; ✅ OK
my_variable := 2     ; ✅ OK
_private := 3        ; ✅ OK
myVar2 := 4          ; ✅ OK

2ndVariable := 5     ; ❌ 숫자로 시작 불가
my-var := 6          ; ❌ 하이픈 불가

🔤 문자열 (String)

따옴표

v2에서는 큰따옴표 또는 작은따옴표 모두 사용 가능:

str1 := "Hello World"
str2 := 'Hello World'

문자열 연결

first := "Hello"
second := "World"

; 방법 1: 공백으로 연결
combined := first " " second          ; "Hello World"

; 방법 2: 점(.)으로 연결
combined := first . " " . second      ; "Hello World"

문자열 안에 변수 넣기

v2에서는 문자열 안에서 변수를 직접 사용할 수 없습니다:

name := "홍길동"

; ❌ 안 됨 (v1 스타일)
; MsgBox("안녕하세요, %name%님!")

; ✅ 연결 사용
MsgBox("안녕하세요, " name "님!")

특수 문자 (이스케이프)

표기 의미
`n 줄바꿈
`t
`r 캐리지 리턴
` `` 백틱 자체
"" 따옴표 안의 따옴표
msg := "첫 줄`n두 번째 줄"
MsgBox(msg)

quote := "그가 말했다: ""안녕!"""
MsgBox(quote)  ; 그가 말했다: "안녕!"

🔢 숫자 (Number)

정수와 소수

intNum := 42           ; 정수
floatNum := 3.14159    ; 소수 (부동소수점)
negative := -100       ; 음수

기본 연산

a := 10
b := 3

sum := a + b           ; 13 (덧셈)
diff := a - b          ; 7 (뺄셈)
prod := a * b          ; 30 (곱셈)
quot := a / b          ; 3.333... (나눗셈)
intDiv := a // b       ; 3 (정수 나눗셈)
remainder := Mod(a, b) ; 1 (나머지)
power := a ** 2        ; 100 (거듭제곱)

복합 할당 연산자

x := 10
x += 5    ; x = x + 5 → 15
x -= 3    ; x = x - 3 → 12
x *= 2    ; x = x * 2 → 24
x /= 4    ; x = x / 4 → 6
x++       ; x = x + 1 → 7
x--       ; x = x - 1 → 6

✅ 불리언 (Boolean)

참(true) 또는 거짓(false) 값:

isRunning := true
isFinished := false

if (isRunning)
    MsgBox("실행 중!")

Truthy와 Falsy

AutoHotkey에서 거짓으로 취급되는 값:

  • false
  • 0
  • "" (빈 문자열)

나머지는 모두 으로 취급됩니다.

if (0)
    MsgBox("안 보임")  ; 0은 false

if (1)
    MsgBox("보임!")    ; 1은 true

if ("")
    MsgBox("안 보임")  ; 빈 문자열은 false

if ("hello")
    MsgBox("보임!")    ; 문자열은 true

📋 배열 (Array)

여러 값을 순서대로 저장하는 목록입니다.

배열 생성

; 방법 1: 대괄호 사용
fruits := ["사과", "바나나", "오렌지"]

; 방법 2: Array() 사용
numbers := Array(1, 2, 3, 4, 5)

; 빈 배열
emptyArr := []

요소 접근

인덱스는 1부터 시작합니다 (0이 아님!):

fruits := ["사과", "바나나", "오렌지"]

MsgBox(fruits[1])    ; "사과"
MsgBox(fruits[2])    ; "바나나"
MsgBox(fruits[3])    ; "오렌지"

; 마지막 요소
MsgBox(fruits[-1])   ; "오렌지" (음수 인덱스!)

배열 수정

fruits := ["사과", "바나나"]

fruits[1] := "딸기"          ; 수정
fruits.Push("오렌지")        ; 끝에 추가
fruits.InsertAt(2, "포도")   ; 2번 위치에 삽입
lastItem := fruits.Pop()     ; 마지막 요소 제거하고 반환
fruits.RemoveAt(1)           ; 1번 요소 제거

배열 속성과 메서드

fruits := ["사과", "바나나", "오렌지"]

MsgBox(fruits.Length)        ; 3 (길이)
fruits.Has(2)                ; true (2번 인덱스 존재?)

배열 순회

fruits := ["사과", "바나나", "오렌지"]

; for 루프 (인덱스와 값)
for index, fruit in fruits
    MsgBox(index ": " fruit)

; Loop로 순회
Loop fruits.Length
    MsgBox(fruits[A_Index])

🗂️ Map (연관 배열)

키-값 쌍으로 데이터를 저장합니다. 다른 언어의 Dictionary나 HashMap과 비슷해요.

Map 생성

; 방법 1
person := Map("name", "홍길동", "age", 25)

; 방법 2
person := Map()
person["name"] := "홍길동"
person["age"] := 25

값 접근

person := Map("name", "홍길동", "age", 25)

MsgBox(person["name"])    ; "홍길동"
MsgBox(person["age"])     ; 25

Map 수정

person := Map()
person["name"] := "홍길동"
person["job"] := "개발자"
person.Delete("job")       ; 키 삭제
person.Clear()             ; 전체 삭제

Map 순회

person := Map("name", "홍길동", "age", 25, "city", "서울")

for key, value in person
    MsgBox(key ": " value)

Map vs Array 언제 쓸까?

상황 추천
순서가 있는 목록 Array
이름으로 접근하고 싶을 때 Map
파일 목록, 사용자 목록 Array
설정값, 사용자 정보 Map

🧱 객체 (Object)

속성(property)을 가진 데이터 구조입니다.

객체 생성

; 중괄호 사용
person := {name: "홍길동", age: 25, city: "서울"}

; 빈 객체
obj := {}
obj.name := "홍길동"
obj.age := 25

속성 접근

person := {name: "홍길동", age: 25}

; 점 표기법
MsgBox(person.name)

; 대괄호 표기법 (동적 접근)
propName := "name"
MsgBox(person.%propName%)

객체 순회

person := {name: "홍길동", age: 25}

for prop in person.OwnProps()
    MsgBox(prop ": " person.%prop%)

🔄 타입 확인과 변환

타입 확인

x := 42
y := "hello"
z := [1, 2, 3]

MsgBox(Type(x))    ; "Integer"
MsgBox(Type(y))    ; "String"
MsgBox(Type(z))    ; "Array"

타입 변환

; 문자열 → 숫자
num := Integer("42")      ; 42
num := Float("3.14")      ; 3.14
num := Number("123")      ; 123 (자동 판단)

; 숫자 → 문자열
str := String(42)         ; "42"

🌐 내장 변수

AutoHotkey는 유용한 내장 변수들을 제공합니다:

시스템 정보

MsgBox(A_UserName)       ; 현재 사용자명
MsgBox(A_ComputerName)   ; 컴퓨터 이름
MsgBox(A_Desktop)        ; 바탕화면 경로
MsgBox(A_MyDocuments)    ; 문서 폴더 경로
MsgBox(A_Temp)           ; 임시 폴더 경로

날짜/시간

MsgBox(A_Now)            ; 현재 날짜시간 (YYYYMMDDHH24MISS)
MsgBox(A_YYYY)           ; 연도 (4자리)
MsgBox(A_MM)             ; 월 (01-12)
MsgBox(A_DD)             ; 일 (01-31)
MsgBox(A_Hour)           ; 시 (00-23)
MsgBox(A_Min)            ; 분 (00-59)

스크립트 정보

MsgBox(A_ScriptDir)      ; 스크립트 폴더 경로
MsgBox(A_ScriptName)     ; 스크립트 파일명
MsgBox(A_LineNumber)     ; 현재 줄 번호

🎮 실습 과제

  1. 이름, 나이, 도시를 저장하는 Map 만들기
  2. 좋아하는 음식 5개를 배열에 저장하고 출력
  3. 현재 날짜를 "2024년 01월 15일" 형식으로 출력
정답 보기 👀
#Requires AutoHotkey v2.0

; 1. Map
person := Map("name", "홍길동", "age", 25, "city", "서울")
for key, value in person
    MsgBox(key ": " value)

; 2. 배열
foods := ["피자", "치킨", "햄버거", "파스타", "초밥"]
for index, food in foods
    MsgBox(index "번째: " food)

; 3. 날짜
MsgBox(A_YYYY "년 " A_MM "월 " A_DD "일")

📚 다음 시간 예고

다음 글에서는 제어문을 배웁니다:

  • if/else 조건문
  • Loop, While, For 반복문
  • Break, Continue

프로그램의 흐름을 제어해봅시다! 🔀


🔑 오늘 배운 핵심 정리

타입 예제 설명
문자열 "Hello" 텍스트
정수 42 정수
소수 3.14 부동소수점
불리언 true/false 참/거짓
배열 [1, 2, 3] 순서 있는 목록
Map Map("a", 1) 키-값 쌍
객체 {name: "홍길동"} 속성 모음

이전 글: [#6 프로그램 실행과 창 관리]
다음 글: [#8 제어문 - if/else와 반복문]

반응형