⚠ 이 강좌는 오토핫키 v1을 다룹니다
지금 보시는 강좌는 구버전 오토핫키(v1.1)를 다루고 있습니다. 따라서 본 강좌의 내용은 현재 최신 오토핫키 버전 (v2.0)과 호환되지 않습니다. 구버전의 정보가 필요한 것이 아니라면, 가능한 한 새로운 사이트에 작성한 v2 강좌(https://ahkv2.pnal.dev)를 봐주시길 바랍니다.
[프날 오토핫키] 배열 #2: 가짜 배열
1. 오토핫키나 자바스크립트 진영에서 Pseudo-array는 국내에서 '의사 배열' 혹은 '유사 배열'이라고 번역되어 왔으나, 표준적으로 통일된 번역이 없습니다. '의사 배열'은 비직관적이며 번역기가 문맥을 고려하지 않고 일괄적으로 번역한 용어라 생각하여('의사 코드(pseudo-code)'와 같은 용례에 쓰였던 접두어이긴 합니다), pseudo의 어감을 살려 '가짜 배열'이라는 새 우리말 용어를 만들어 사용하겠습니다.
2. '배열'은 처음 들으면 분명 어려운 개념입니다. 이해하면 쉽고요. 구문 자체에 난이도가 있는 것은 아닌지라, 머리로는 잘 받아들여지나 굉장히 낯설 것입니다. 앞으로의 배열 강좌는 PC로 보시면서 직접 타이핑해보셨으면 좋겠습니다.
가짜 배열?
앞서 배열을 '연관되거나 연속된 값을 한 번에 묶어 관리할 수 있는 자료구조'라고 정의했습니다. 이에 부합하지 않는 방식으로(그러니까 배열은 아닙니다.) 연속된 값을 처리할 수 있는 방법이 있는데, 바로 '가짜 배열(Pseudo-array)'입니다.
가짜 배열은 아래와 같은 형식의 '변수 집단'을 일컫는 말입니다.
var1
var2
var3
...
var21 등등
그냥 변수 뒤에 1부터 숫자를 붙인 것이지요. 숫자 부분이 변수 num이라면, 우리는 var%num%을 이용하여 각 항목에 접근할 수 있을 것입니다. 만약 Loop안에서 순차 접근 하게 된다면 var%A_index%를 사용할 수 있겠지요.
전통식 자리를 표현식으로 강제로 바꿔주는 구문은 퍼센트 기호(%)를 매개변수 시작에 쓴 후 한 칸 띄워주는 것입니다. 강좌에선 쉬어가는 파트에서 잠시 말씀드린 적이 있는데, 예를 들어서 아래와 같이 쓰게 된다면
MsgBox, % var
MsgBox의 첫 번째 매개변수는 전통식 자리임에도 불구하고 (퍼센트 기호 + 한 칸 공백)을 통해 표현식이 되어 var 변수를 %%로 감싸지 않더라도 변수를 사용할 수가 있는 것이지요.
배열은 표현식에서만 사용할 수 있기 때문에 위와 같이 표현식 자리로 만들어준 후 가짜 배열을 사용하게 되면
var1 := "가"
var2 := "나"
var3 := "다"
Loop, 3
{
MsgBox, % var%A_index%
}
처럼 사용할 수 있을 것입니다. %기호의 띄어쓰기에 유의해주세요. 보기 복잡해도 알아두면 좋은 테크닉입니다.
가짜 배열은 배열이 아닙니다.
이름에서 알 수 있듯 가짜 배열은 배열이 아닙니다. 분명 배열은 '연관되거나 연속된 값을 한 번에 묶어 관리할 수 있는 자료구조'였죠. 그러나 이렇게 쓴다면 연속적인 값만 처리할 수 있을 뿐, 연관된 값은 처리할 수 없습니다. 1강에서 들었던 '독서실 문제'에서 '4번째 학생'까지는 구현이 가능하지만, 그 학생의 이름을 담기위한 또 별도의 변수가 필요하겠죠. (이름은 1,2,3등의 숫자로 표현하긴 좀 그렇죠. name이라는 표지가 사용되어야 할 듯 합니다.) name이라는 변수를 붙이면 var%num%%name%처럼 쓸 수는 있겠습니다. (으악! 점점 알아보기 힘들게 되네요)
또한 이는 '자료구조'가 아니게 됩니다. 자료구조의 대표적인 특징이 탐색의 효율성인데 효율적이지도 않기 때문입니다. 자료구조가 아니기 때문에 배열이 아닙니다.
결정적으로, 오토핫키는 이렇게 만들어진 '변수 집단'을 어떤 형태로든 연결시키지 않습니다. 즉, 오토핫키 입장에서 보았을 때 var1과 var2는 어떤 연관도 없는 별도의 변수 두 개일 뿐입니다. 따라서 배열이 아닙니다. 변수 집단이죠.
그래서 가짜 배열은 쓰지 마세요. 모두 '진짜 배열'의 형태로 쓰는 것이 낫습니다. 프로그램의 성능에도, 가독성에도 좋은 영향이 전혀 없습니다. 그러나 오토핫키에서 일부 명령어는 이러한 '가짜 배열'형태로 값을 뱉는 명령어가 있는데(RegExMatch가 그렇습니다.), 이런 불가피한 경우를 제외하고는 사용을 권장드리지 않습니다.