📣 더 깊은 내용이 담긴 '프날 오토핫키 강좌 v2'의 서적판이 공개되었습니다.
가장 최신의 오토핫키를 담은 '프날 오토핫키 강좌 v2'를 책으로 만나보세요!
v2 페이지에 공개된 분량보다 더욱 깊은 내용을 처음이라도 괜찮아, 오토핫키 프로그래밍을 통해 배울 수 있습니다.
전국 온/오프라인 서점에서 만나요!
책 더 알아보기 및 구매하기
[몰라도 되는] 오토핫키는 왜 전통식과 표현식이 나뉘었을까?
오토핫키는 변수를 사용할 때 크게 두 가지의 방법으로 나뉩니다. 하나는 전통식이고, 하나는 표현식입니다.
아마 많은 분들이 헷갈려하셨던 개념이실거고, 아마 퍼센트 기호를 쓰지 말아야할 곳에 퍼센트 기호를 써서 원하는대로 작동이 되지 않았던 기억도 있을 겁니다. 개념에 대해 설명하는 글은 아니니 간단하게만 짚고 넘어가겠습니다.
'표현식(expressions)'은 숫자가 오는 것을 기본으로 생각하고, 따라서 문자열이 들어오면 변수명으로 해석하게 되는 자리입니다. 문자 그대로(리터럴로)의 문자열을 사용하고 싶다면 따옴표 ("")로 묶어줍니다.
'전통식(traditional)'은 문자가 오는 것을 기본으로 생각하는 자리입니다. 식이나 숫자가 들어오면 문자 그대로 생각하게 되며, 따라서 변수를 사용하기 위해 %기호를 사용하게 됩니다.
예를 들어서, 대입 연산자 ":="의 오른쪽 부분은 '표현식'입니다. 수식이 와도, 변수가 와도 ok입니다.
foo := bar
foo := 1 + 2
// bar 변수의 값과 1+2 수식이 foo 변수에 담깁니다. 계산의 결과이고, 따라서 '식'입니다.
단, 아래와 같이 문자열이 들어오면 '변수명'으로 취급하므로
foo := string
아래와 같이 따옴표를 이용하여 리터럴하게(적힌 문자 그대로) 대입해야합니다.
foo := "string"
그리고, MsgBox의 Text 매개변수는 대표적인 '전통식'자리입니다. 수식도 변수도 올 수 없으며, '있는 그대로' 출력하게 됩니다.
MsgBox, foo
MsgBox, 1 + 2
//두 코드 모두 "foo"와 "1+2"를 문자 그대로 출력하게 됩니다. '전통식'이라고 많이 부르지만 식은 아닙니다.
변수를 표현하려면 %기호를 이용해야겠죠.
MsgBox, %var%
그럼 자연스럽게 두 가지 의문이 떠오르실겁니다.
1. 표현식에서 '문자 그대로' 출력하는 방법은 무엇인가?
2. 전통식에서 '식'을 쓰는 방법은 무엇인가?
여기서부터 오토핫키 문법의 춘추전국시대가 시작됩니다. 이 글은 이 배경을 설명하는 글입니다.
태초에 전통식이 있었습니다.
2003년, 오토핫키가 오토잇에서 떨어져 나온 이후엔 표현식이라는 개념이 없었습니다. 모든 문법은 지금의 전통식으로 쓰여졌습니다. 지금은 흔히 쓰는 := 연산자는 2005년 선보이게 되었습니다.
프로그래밍의 꽃이자 제일 핵심 개념인 '변수'를 사용하기 위해서 오토핫키측이 채택한 방법은 '변수는 변수라는 표시를 하자'입니다. 즉, 아래와 같이 변수엔 퍼센트 기호(%)를 써서 변수임을 표기해주기로 약속한 것입니다.
MsgBox, %var% //이건 var라는 변수이고
MsgBox, string //이건 문자열이야!
이 방법은 그럴듯해보였습니다. 아무튼 변수를 선언할수도, 사용할수도 있었습니다. 규칙도 일관적입니다. 문자 그대로 쓸 부분은 그냥 써주고, 변수로 사용할 부분만 퍼센트 기호로 표시해주면 끝이었습니다. 물론 일부 예외도 있었습니다. 표현식이란 개념은 약했지만 아무튼 연산(var++와 같은 일부 연산에 한했지만요)은 지원했습니다.
표현식이 필요하지 않을까?
당시 오토핫키는 프로그래밍 언어기보단 스크립팅 툴에 가까웠고, 언어가 아닌 도구로 사용되도록 개발한 것이 원래 제작자의 의도였습니다. 이후 오토핫키 커뮤니티에 의해 언어의 형태가 완성된 것이고요.
어느 순간 근본적인 의문이 들었던것입니다. 왜 우리는 다른 프로그래밍 언어와 다른 방식으로 변수를 표기할까? 왜 우리는 연산을 이렇게 불편하게 할까?
그래서 타 언어와 동일한 표현식 기법이 연구되고 개발됩니다. 2005년 := 연산자가 그 선두였습니다. 이 연산자가 개발된 이후, 많은 표현식 문법들이 등장하게 되었습니다. 그리하여 정립된 새로운 표기 방식은 기존과 정반대였습니다. 기존엔 항상 특수한 경우를 제외하곤 어떤 자리엔 항상 '문자 그대로'가 온다고 생각했던 관념을 깨고 '수식'이 오는걸 가정하는 형태로 만들자고 한 것입니다.
말이 어렵죠?
기존엔 대입 연산자로 =를 사용하고, 그 뒤는 항상 문자 그대로가 온다고 가정하고 오토핫키가 개발되어왔습니다. 그 흔적은 아직도 찾을수 었어서, 아래와 같은 문법은 '3'이 아닌 '1+2'를 대입합니다.
var = 1 + 2
그러나 이것에 의구심을 느낀 많은 사람들에 의해 아래와 같이 '식이 온다고 가정하는' 형태의 문법이 생겨났습니다.
var := 1 + 2
그리고 기존처럼 '문자 그대로'를 이용하기 위해선 큰따옴표("")로 해당 부분을 묶기로 약속했습니다. 마치 오토핫키가 처음 나왔을 때, 변수에 %기호를 씌워주던 것과 마찬가지로 말입니다. 기존엔 변수에만 특별한 표시(%)를 해주었지만, 이젠 문자열에만 특별한 표시("")를 해주기로 한것입니다.
표현식 이후 오토핫키엔 큰 바람이 불었습니다. 함수 개념이 나오고, 배열 개념이 나오고, 변수를 자유롭게 다룰 수 있게 되었으며, 객체와 클래스가 나오고, 심지어는 전통식 자리를 강제로 표현식으로 바꿔주는 문법도 등장하게 되었습니다. 툴이 아닌 언어라고 부를만큼 많은 프로그래밍적인 요소들이 생겨나게 되었습니다. 결과적으론 이에 회의감을 느꼈던 오토핫키의 최초 개발자 Chris Mallett이 오토핫키 개발에서 손을 떼게 되었지만요.
그럼에도 전통식은 사라지지 않습니다.
많은 사람들은 새 문법에 당황했지만, 곧잘 적응했습니다. 하지만 큰 문제가 남았는데, 바로 두가지 표기법이 혼용되기 시작한 것입니다. 대표적인 전통식 대입인 =와 표현식 대입인 :=부터가 지금까지도 혼용되고 있습니다. 또, 어떤 자리에는 전통식으로 사용하게 되고 어떤 자리는 표현식으로 사용하게 되었습니다.
그렇지만 전통식은 사라지지 못하고 있습니다. 분명 표현식이 더 자유롭고 (그래봤자 2005년이긴 하지만)최신 문법인데 전통식이 사라지지 않는 이유는 오토핫키의 독자적인 command 문법 때문입니다.
타 언어를 볼까요? 모든 명령문은 함수의 형태로 이루어집니다.
printf("C language");
Console.WriteLine("C#");
MsgBox("VBA");
System.out.println("JAVA");
println("Swift");
println!("Rust");
등등... 소괄호로 묶여서 함수를 호출하는 형태인 것을 알 수 있습니다. 소괄호를 쓰지 않는 언어도 있다고요? 처음부터 오토핫키의 표현식과 같이 수식이 오는 것을 고려해서 만든 언어들입니다.
반면 오토핫키는 명령어의 매개변수 전달법이 독특합니다.
Command, param1, param2, param3
명령어가 맨 앞에 오고, 매개변수와 매개변수는 콤마로 구분합니다. 기존에 전통식 방법으로 설계했기 때문에 다른 언어처럼 소괄호로 구분되는 것도 아니고, 해당 자리가 표현식 자리인지 전통식 자리인지도 보기만 해선 모릅니다.
이를 수정하려면 언어를 뜯어고쳐야하는 지경이며 하위호환성을 버리는 일이 됩니다.
이전의 스크립트가 현재 버전에 맞지 않는 일이 생긴다는것이죠.
그래서 오토핫키는 현재 전통식과 표현식이 혼용되고 있습니다. 기본적으로 과거의 전통식 구문은 전통식 사용이 가능합니다. 표현식으로 쓸 수 있는 구문도 있지만, 그렇다고 해서 전통식이 미지원이진 않습니다.
다만 새로 나오는 구문들은 대부분 표현식으로, 가능하면 함수 형태로 나옵니다. 과거의 것을 바꾸기엔 하위호환성을 버리는 일이고, 새로 나오는 것만 그나마 표현식으로 바꿔나가는 것이죠.
StringMid, StringLeft, StringRight → SubStr()
StringReplace → StrReplace()
if, ifinstring, ifwinexist → if ()
등등..
이것은 과거의 구문들(레거시 명령어;위에 설명의 화살표 왼쪽에 있는 명령어들)을 새로운 구문(함수형)으로 써야하는 이유가 되기도 합니다. 레거시 명령어는 하위 호환성을 위해 존재하는 '찌꺼기'와 같은 역할입니다. 가능하면 새로운 형태로 사용하시기를 강력히 권장합니다.
전통식의 미래
결국 전통식 문법은 사라질것입니다. 하위호환성을 버리는 한이 있더라도 버려질 것이고, 그렇게 해서 지금 오토핫키 2.0이 개발중에 있습니다(알파버전이지만요). 커맨드 방식의 문법이 함수 방식으로 바뀌고, 따라서 전통식은 결국 사라지게 될 것입니다.
너무 아쉬워하지 않아도 되는 것이, 지금껏 오토핫키 진입장벽 중 꽤 높은 부분이 일관되지 않은 문법이었는데, 앞으로의 발전을 위해서라면 하위호환성을 버리는 일을 한번쯤은 해야했을겁니다. 똑똑하신 분들이 열심히 개발중이시니, 저희는 일단 현문법에서 표현식을 쓸 수 있는 부분에서 최대한 표현식을 쓰는 연습을 해두면 그걸로 충분합니다.
⚠ 이 강좌는 오토핫키 v1을 다룹니다
지금 보시는 강좌는 구버전 오토핫키(v1.1)를 다루고 있습니다. 따라서 본 강좌의 내용은 현재 최신 오토핫키 버전 (v2.0)과 호환되지 않습니다. 구버전의 정보가 필요한 것이 아니라면, 가능한 한 새로운 사이트에 작성한 v2 강좌(https://ahkv2.pnal.dev)를 봐주시길 바랍니다.