최근 수정 시각 : 2024-10-31 09:09:57

AutoHotkey

오토핫키
AutoHotKey
파일:오토핫키 로고.svg
AutoHotkey
Automation. Hotkeys. Scripting.
라이선스 GNU GPLv2
최신 버전 2.0.18 (2024년 6월 6일)
홈페이지 파일:홈페이지 아이콘.svg
1. 개요2. 문법3. 장점
3.1. 쉬운 난이도와 높은 접근성3.2. 설치의 간편함
4. 단점
4.1. 소스 코드 유출4.2. 보안 프로그램 오류4.3. 인식4.4. 확장성 제한
5. 공식 문서 및 강좌6. 커뮤니티7. 여담

[clearfix]

1. 개요

오토핫키(AutoHotkey)는 윈도우에서 키보드 단축키 설정, 간단한 매크로 제작, 자동화 등을 목적으로 하는 무료 오픈 소스 기반의 스크립트 언어이다. 간단한 프로그램 제작에 특화된 직관적인 문법을 갖추고 있으며 마우스와 키보드 제어, 화면에서 이미지 검색, 윈도우 창 조작, 간단한 GUI 제작 등 언어의 목적에 맞는 기능이 내장되어 있다.

2. 문법

BASIC, Python 같은 언어처럼 단순하고 직관적인 문법을 가지고 있다. 1999년경에 나온 AutoIt을 만들던 제작자 그룹 중 한 명이 AutoIt V2에서 V3로 넘어가는 시점에서 컨셉에 대한 견해차이로 따로 독자적으로 만들어 AutoIt 커뮤니티에 공개하면서 오토핫키가 탄생하였다. AutoIt V2를 기반으로 했기 때문에 그 문법을 그대로 차용하고 있다. 반면, 현재의 AutoIt V3는 아예 다른 문법을 가지고 있다.

2023년 v2.0으로 바뀌면서 기존 버전(v1.0, v1.1(AutoHotkey_L))과 하위 호환성이 거의 없어졌다. 다른 프로그래밍 언어들과 비슷하게 문법이 바뀌었고, 함수 기반 구문으로 전환이 필요하다. 예를 들어 기존 버전에서는
MsgBox, Hello, World!
처럼 함수 이름 다음에 매개변수를 쉼표로 구분해 나열했다면 v2.0 부터는
MsgBox("Hello, World!")
MsgBox "Hello, World!" ; 반환값이 필요 없는 경우 소괄호를 쓰지 않을 수 있다
이렇게 써야 한다.

난이도가 쉽다지만 다른 프로그래밍 언어와 다른 점이 많다보니 난해한점도 많다. := 익스프레션= 리터럴의 차이만 봐도 그렇고 내장된 명령과 사용자 함수의 표현 차이도 난다. 익스프레션은 식을 집어넣는 수식이고, 리터럴은 문자를 그대로 대입하는 수식이다. v2 버전에선 하위 호환성을 버리고 이런 문제를 수정하여 새로운 버전을 이용하려면 기존 소스 코드의 대대적인 수정이 필요하다.

Python에 익숙하다면 ahk 같은 라이브러리를 이용하여 오토핫키를 대신할 수 있다.

3. 장점

3.1. 쉬운 난이도와 높은 접근성

쉽다. 쉽게 만든다고 만든 AutoIt 만 해도 BASIC 언어의 형태를 그대로 가지고 있었기 때문에 비프로그래머들에게는 배우기 매우 어려웠던 반면, AHK 는 직관적이고 꼭 필요한 기능만 담아 논리적인 센스만 조금 있다면 누구나 쉽게 접근할 수 있다. 대부분의 명령은 영어만 할 줄 안다면 바로 이게 무슨 역할을 하는지 알아볼수 있다. C언어에선
#!syntax cpp
#include <stdio.h>
int main(void)
{
     printf("Hello world!");
     return 0;
}
처럼 코딩을 할 수 있다면, 오토핫키에선
Msgbox, Hello world!
라고 코딩할 수 있다. 비전문가가 볼때 훨씬 간결하고 Msgbox를 "메시지 박스"라고 직관적으로 알아듣는다.

또한, 처리 순서에 대해서도 비전문가가 이해하기 쉽다. 그냥 위에서 아래로 굴러가니까. C언어의 경우 함수를 따라 이동하지만, 오토핫키는 그런거 없다.

C에서는 수 줄에 걸쳐서 사용해야하는 랜덤 함수는, 오토핫키에선 한 줄로 간단하게 표현 가능하다.
#!syntax cpp
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(void)
{
     srand((unsigned int)time(NULL));
     int var = rand()%100+1; //(1부터 100사이의 난수를 생성하여 var에 저장한다)
     return 0;
}
Random, var, 1, 100 ;(1부터 100사이의 난수를 생성하여 var에 저장한다)

3.2. 설치의 간편함

오토핫키의 설치 파일의 용량은 3 MB 이하이며, 설치도 매우 빠르다. 부담없이 빠르게 PC에 설치해서 쓸 수 있다.

4. 단점

4.1. 소스 코드 유출

모든 프로그래밍 언어가 비슷하지만, 오토핫키는 특히 심하다. L버전 오토핫키를 쓴다면 exe파일에 열기(O)→메모장을 선택시 하단부에 소스가 적나라하게 보인다. 이외의 버전에서는 디컴파일러 혹은 올리디버거를 이용해 누구나 쉽고 빠르게 뚫을 수 있다. 그러나, 이를 막는 패킹 및 난독화라는 작업이 활성화 되고, 오핫도 슬슬 안전지대에 들어가는 듯 했으나... 그런 거 없다. 이마저도 리버싱 고수에게는 통하지 않는다. 다만 오토핫키는 GPL 라이센스 하에 배포되고 있으므로, AHK2EXE를 이용해 컴파일된 오토핫키 스크립트는 (컴파일 과정에서 오토핫키 소스코드가 통합되므로) 자동적으로 GPL 오픈소스 라이센스가 전염되어 오픈소스로 공개를 해야 한다는 주장이 있다.

그렇지만 GPL 라이선스의 제품이 직접 포함되지 않은 산출물은 GPL이 아니어도 된다! 실제로, GPL 라이선스 컴파일러인 GCC로 산출된 프로그램은 GPL과 별개이다. 오토핫키에서의 바이너리화가 된다면 하나의 실행 파일에 묶이게 되며, 이는 라이브러리와 같은 형태가 아니므로(그리고 분리불가능한 상태이므로) 산출된 프로그램에는 GPL이 적용되지 않는다. 또한, 스크립트 언어에서의 컴파일은 인터프리터와 스크립트가 하나의 exe로 묶이는 개념으로 설명되곤 하는데, 이 경우 또한 자유 소프트웨어 재단의 FAQ에서 GPL 전염이 일어나지 않는다고 밝혔다. 한국어 번역

또한, 오토핫키(1.0)의 제작자 Chris Mallett도 컴파일된 exe(산출물)은 GPL전염이 되지 않는다고 말한 바 있다.
No, because the EXE doesn't contain AutoHotkey's source code. Therefore, when you distribute a compiled script, you're not distributing any GPL source, and thus your application isn't subject to the GPL unless you want it to be. In other words, when you build an app with AutoHotkey, there are no restrictions on selling it, nor do you have to release your script's source code. This is because it is similar in principle to having built the app with a GPL C++ compiler.
'AutoHotkey를 이용한 결과물에 GPL전염이 됩니까?'에 대한 Chris의 답변 원문
즉, GPL 라이선스의 범위는 오토핫키(인터프리터)의 소스 코드(C++)와 그로 인해 나온 산출물(오토핫키 인터프리터, AutoHotkey.exe)의 경우이며, 이를 이용하여 인터프리터와 묶여 컴파일된 프로그램은 GPL C++ 컴파일러를 사용한 빌드와 마찬가지로 GPL이 아니어도 좋다는 뜻이다.

4.2. 보안 프로그램 오류

작성한 스크립트(.ahk)를 실행파일(.exe)로 컴파일하는 옵션도 있는데 바이러스로 판정되는 경우가 많다. 키보드 보안 프로그램이 실행중이라면 작동하지 않을 수 있다.

4.3. 인식

문법의 난이도가 매우 낮아 누구나 쉽게 코딩이 가능하고 일부 몰상식한 사용자들에 의해 제작된 게임 핵 형태의 매크로가 돌아다니는 것을 쉽게 목격할 수 있기 때문에 툴키디들의 전유물이라는 인식이 꽤 퍼져있는 편이다.

한편 상술한 사용처의 문제 때문에 일부 백신에선 오토핫키를 바이러스로써 잡아내기도 한다. 행위 기반으로 잡히는 경우가 90%인데, 어베스트맥아피같은 유명한 백신들에게도 가끔가다 걸리니 주의요망. 바이러스 토탈에 검사를 해보면 멀쩡한 오토핫키 파일이라도 적게는 두세 개부터 많게는 10개이상의 백신이 감지하는 모습을 볼 수 있다.

4.4. 확장성 제한

문법을 더 쉽고, 더 쉽고, 또 더 쉽게 만드는 바람에 자유도가 낮다. 라이트하게 코딩하는 오토핫키 유저에겐 상관 없지만, 오리지널 B버전은 global 명령도 없으며[1] 약간 개선된 L버전도 Python같은 다른 스크립트 언어에 비해선 확실히 떨어진다. 그래서 복잡한 매크로 프로그램을 작성하기엔 기능이 부족하거나 코드가 복잡해지고 가독성도 떨어진다.

5. 공식 문서 및 강좌

6. 커뮤니티

  • AutoHotKey를 사용하는 사람들: 오토핫키 공식 홈페이지 최하단에 안내되어있는 커뮤니티이다. 사설 커뮤니티이지만, 공식적으로 인정된 케이스. 신규 회원가입은 되지 않는 상태이다.
  • 오토핫키 연구소: 네이버 카페 형식으로, 위 두 개의 커뮤니티보다 활발한 활동을 보이는 편이다.

7. 여담

  • 국내엔 관련 서적이 없으며, 해외에는 있다. 다만, 상당히 옛날에 지어진 책이므로 설령 영어가 된다 하더라도 고수들 모두가 추천하지 않는 책. 외국 오토핫키 포럼과 국내 오토핫키 관련 사이트, 블로그에 정리가 잘 되어있기 때문에 인터넷에서 배우는 것도 좋다.
  • 많은 사람들이 매크로 제작 도구라고 알고있지만, 개발자가 공식 홈페이지에 Script Language라고 직접적으로 적어놓았으므로 스크립트 언어라고 봐야한다.
  • 인터넷 강좌를 고를 때에는 매크로를 위주로 가르치는 강좌를 피해야 한다. 매크로를 만들고 싶다고 매크로부터 만드는게 아니다. 기초부터 쌓아가야지 제작기간도 짧고, 실제로 제작이 수월하다. 만약 매크로 먼저 배우기 시작한다면 끝도없이 밀려오는 오류의 바다에서 헤어나오지 못할 뿐더러, 오히려 오류를 수정하느라 제작기간도 오래걸린다. 변수나 연산자의 개념을 빨리, 마우스 클릭이나 키보드 입력 개념을 늦게 알려주는 강좌를 찾는 것도 하나의 팁. 단, 이미 다른 언어들을 다루어 보았다면 강좌를 볼 필요도 없이 공식 홈페이지 도움말을 구글 번역기 돌려보는게 더 빠르다. 사실 아래에 공식 번역된 한국어 도움말이 있다.
  • 언어와 컴파일러의 소스코드가 모두 공유되고 있다. AHK를 입맛에 맞게 수정해서 써도 된다는 뜻. 컴파일러를 수정해서 소스 보호를 위해 난독화를 진행하는 경우가 있다.
  • 언어의 특성상 타 언어에 비해 속도 면에서 떨어진다. 스크립트 언어일 뿐더러 GUI 기반 언어라서 어쩔 수 없는 부분. 만약 자기 프로그램이 속도를 극한으로 뽑아내야 하는 프로그램이라면 다른 언어를 배우는게 좋다. 참고
  • 국내에서 인식이 좋지 못하다. 상기 서술했듯이 매크로, 핵 제작 문제로 인해서 언어로 취급을 안해주는 편. 그래서 대부분의 오토핫키 개발자들은 다른 언어로 전향을 하기 마련이다. 다만, 이 경우에 또 문제가 되는 것이 '너무 쉬웠던 오토핫키 문법'에 적응해버린 나머지 다른 빡빡한 언어는 배우기 힘들어진다. 실제로 AHK → C언어 순으로 배운 사람이 아예 C언어를 처음 배우는 사람보다 세미콜론, 비교 연산자 실수를 많이한다.
  • 동명의 주식 자동 매매 프로그램이 있다. 다만 프로그래밍 언어 AutoHotkey는 훨씬 먼저인 2003년에 공개되었다. 네이버에선 상용 프로그램 검색 결과의 검색순위가 높아서 정작 언어 오토핫키의 검색은 원활하게 되지 않는다. 구글을 통해 검색하는 것을 추천.
  • 스크립트 대신 간단한 GUI로 좀 더 쉽게 단축키를 설정할 수 있는 프로그램도 있다. 이름은 WindowexeReSendKey. 다만 아무래도 AutoHotkey에 비하면 커스터마이징의 범위가 좀 좁다.
  • 한 때 이걸로 온라인 게임의 오토 프로그램을 만드는 사람도 있었지만 지금은 게임가드 등에 막혀서 작동이 안된다. 물론 게임가드가 없는 외산 프로그램, 예를 들자면 디아블로 3 같은 데에선 무기들을 간편하게 교환하는데 매우 애용되고 있다.
  • 다음과 같이 실행하면 DOS 창에 출력이 가능은 하다.
    {{{stdout := FileOpen("*", "w `n")
stdout.Write(msg)
stdout.Read(0)
sleep 5000
}}}또는
{{{FileAppend,Test Message`n,*
}}}으로 구문을 저장하고
{{{For /F "tokens=*" %L in ('""%ProgramFiles%\AutoHotkey\AutoHotkey.exe" "My Script .ahk""') do @Echo %L
}}}
[1] Byref 사용