프날 오토핫키 강좌
누르면 강좌 리스트가 나와요
프날 오토핫키 강좌

⚠ 이 강좌는 오토핫키 v1을 다룹니다

지금 보시는 강좌는 구버전 오토핫키(v1.1)를 다루고 있습니다. 따라서 본 강좌의 내용은 현재 최신 오토핫키 버전 (v2.0)과 호환되지 않습니다. 구버전의 정보가 필요한 것이 아니라면, 가능한 한 새로운 사이트에 작성한 v2 강좌(https://ahkv2.pnal.dev)를 봐주시길 바랍니다.

[프날 오토핫키] 배열 #1: 배열의 의미와 종류

안녕하세요. 오랜만에 추가 강좌글로 뵙습니다.

 

이번엔 배열에 관해 설명드릴 수 있게 되어 기쁩니다. 타언어에서도 많이 쓰이는 배열은 오토핫키에서도 당연히 지원합니다. 배열이 무엇인지, 왜 쓰는지 등에 대해서 알아보고나서 본격적인 강좌를 시작해도 늦지 않겠습니다. 따라서 이번 편에서는 배열의 개념과 사용 이유, 종류 등을 먼저 알아보도록 하겠습니다.


 변수만으론 부족하기에... 

 

아마 제 강좌 본편을 보고 오토핫키를 이용하여 약간의 프로그램을 개발해보신 분들은 아래와 같은 상황이 종종 있었을 것입니다.

변수가 너무 많이 필요해요!

예를 들어서 정원이 30명인 독서실의 회원 관리 프로그램을 개발하였다고 하면, 각 학생의 데이터를 관리하기위해 student1, student2, student3 ... student30 이라는 변수가 필요할 것입니다. 만약 학생의 이름과 생년월일, 입실 시간과 퇴실 시간을 담을 변수가 필요하다면 student1Name, student1Birth, student1Enter, student1Exit 등의 변수가 필요할 것입니다. 당연히 30명 모두에게 이런 변수가 필요하겠죠.

 

혹은 이런 경우도 있습니다. 하나의 긴 문자열을 줄 단위로 잘라서 파싱하는 작업이 필요한데, 잘린 문자열을 A, B, C... 변수에 저장하고자 하는 경우입니다. 예를 들어서 첫 번째 줄은 A, 두 번째 줄은 B, 세 번째 줄은 C라는 변수에 저장하고자 합니다. 강좌 본편에 소개드린 Loop, Parse와 A_LoopField를 이용하면 되긴 하겠는데, Loop 밖에서도 사용하고자 별도 변수에 저장하려고 합니다. 만약 문장이 50줄이라면 50개의 변수가 필요하겠죠. 문장의 줄 수를 모른다면? 몇 개의 변수가 필요한지도 알지 못합니다. 어쩌면 100만개가 필요할 수도 있겠네요. (물론, 강좌에서 설명하진 않았지만 StrSplit() 함수를 사용하여 바로 배열로 나눌 수 있습니다.)

 

변수가 너무 많습니다. 일일이 관리하기 어려울 뿐더러, 혹여나 변수명이 다른 변수와 겹치는 불상사까지 일어날 수 있습니다. 이렇게 연속적이거나, 연관되어있는 값을 하나로 묶어 관리하면 얼마나 좋을까요? 네, 이럴때 사용하는 것이 '배열'입니다.


 배열 

 

배열은 연속적이거나 연관된 여러 값을 하나로 묶어 관리할 수 있는 '자료 구조'입니다. 넓게 해석하면 배열도 변수이고, 그렇다면 배열은 '여러 변수를 관리할 수 있는 하나의 큰 변수'라고 할 수 있겠네요.

 

위에서 든 예시의 30명 정원의 독서실 문제에서 필요한 변수는

(사람 수: 30명) * (사람이 가진 성질의 수: 이름, 생년월일, 입실 시간, 퇴실 시간 = 4개)
= 30 * 4 = 120

총 120개가 되겠네요. 각 요소('4번째' 학생의 '이름')를 하나의 변수(student)로 처리할 수 있다면 매력적일 것입니다. 그런데 배열을 사용하면 아래와 같이 깔끔하게 처리할 수 있습니다.

student[4].name

배열을 사용하면 "네 번째 학생의 이름"은 위와 같이 표현할 수 있게 됩니다. 앞으로의 배열 강좌를 잘 따라오시면 위와 같은 구문을 통해 배열을 사용할 수 있을 것입니다.

 

배열은 당연히 Expressions(표현식)이기 때문에, 연산 등의 처리를 하기에도 적합합니다. 예를 들어서, 입실 시간과 퇴실 시간을 가지고 독서실에 있는 시간을 계산하고자 하면

time := student[4].Enter - student[4].Exit

처럼 계산할 수도 있습니다. 만약 배열을 배우지 않았더라면 student4Enter - student4Exit 와 같이 두 개의 변수를 사용하여 계산했을 것이고, 심지어 앞의 한 사람(student3)이 나갔다고 해도 이 회원은 student4로 관리되는 모순이 발생합니다. (네 번째 학생이 아닌데 4번을 달고있게 되는 셈인데, 얼마나 비직관적인데요!)

 

따라서 배열을 사용하면 연속된(혹은 연관된) 여러 데이터들을 효율적으로 처리할 수 있게 됩니다. 그러나 그와 반대로, 오토핫키의 표현식 개념을 모르면 배열을 배우기도 어렵습니다.

[배열이란]
연관되거나 연속된 값을 한 번에 묶어 관리할 수 있는 자료구조.

[배열을 사용하는 이유]
- 배열을 사용하지 않으면 연속된 데이터라 할지라도 각각의 변수를 준비할 필요가 있으며, 데이터의 개수를 알지 못하는 경우 변수가 몇 개 필요할지도 모르게 됨.
- 따라서 비효율적, 비직관적으로 프로그램이 개발되게 되며, 데이터의 이동이 까다롭기 때문에(위에서 언급한 '앞 사람이 퇴장했을 때의 독서실 회원은 여전히 4번 회원인 문제' 등) 개발 난이도가 상승함.
- 여러 변수가 필요한 동작을 한 개의 배열로 관리하기 때문에 스크립트가 깔끔해짐.

아직 왜 사용해야하는지 모르거나, 사용하지 않아도 부족함이 없을 것 같다든지 하면 일단 써보세요. 배열 맛을 한 번 보게 된 후 이를 논해도 나쁘지 않습니다. (다만, 저는 여러분들이 한 번 배열을 제대로 써보면 이 맛에서 못 빠져나올 것이라는 확신이 있습니다.)


배열의 종류

 

배열의 종류는 크게 3가지가 있는데, 나열해보면 아래와 같습니다.

  • 가짜 배열 (Pseudo-arrays)
  • 간단 배열 (Simple Arrays)
  • 연관 배열 (Associative Arrays)

'가짜 배열'의 경우엔 이름에서 알 수 있듯 엄밀히 말하면 배열이 아닙니다. 배열 흉내를 내기 때문에 저렇게 불리지만, 배열이 아니라는 점을 알아두세요. 오토핫키에 배열이 없던 시절엔 아마 저 '가짜 배열'이 배열 역할을 대신했을 것입니다. 그러나 지금은 사용할 필요가 없다는 점을 미리 말씀드립니다. ('가짜 배열'에 대한 강좌는 짧게 진행하도록 하겠습니다.)

 

다음 강부터 본격적으로 배열을 배워봅시다!