⚠ 이 강좌는 오토핫키 v2를 다룹니다
지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만,
새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.
65. 배열
마지막 수정일: 2023-12-21
이름부터 가장 단순해보이는 배열부터 차근차근 배워보겠습니다.
배열
배열은 순차적인 값을 처리하기 위해 등장한 자료 구조입니다. 학생 100명을 관리하기 위해 100개의 변수를 사용하는 대신, 순차적으로 한 명씩 자료 구조에 담을 수 있게 한 것이죠. 각 학생은 '1번 학생', '2번 학생' 등으로 표현됩니다. 이렇듯 배열은 '순서'가 중요한 측면이 있습니다.
배열은 주로 한 줄의 표 형태로 나타냅니다. 프날 오토핫키 강좌도 마찬가지로, 아래와 같은 1행 표 형태로 배열을 표현하겠습니다.
사진 1. 배열의 구조 예시Tip: 요소와 인덱스
앞으로 강좌에서 요소, 인덱스라는 말을 많이 사용할 것입니다.
요소는 배열 안에 있는 각 값을 의미하는데, 그러니까 '사진 1'에서 장종훈
, 정민철
등이 요소입니다.
인덱스는 배열의 요소가 가진 순번을 말합니다.
'사진 1'에서 김태균
의 인덱스는 4
이죠.
- 요소(Element): 배열 안에 있는 각 값을 말합니다.
- 인덱스(Index): 배열의 요소가 가진 순번을 의미합니다.
참고로, '인덱스'라는 용어는 내장 변수 A_Index
에서 알 수 있듯이 프로그래밍에서 어떤 순번을 의미하는 일반적인 용어입니다.
대부분 언어에서 인덱스는 0
부터 시작하지만, 오토핫키에선 현실 세상과 마찬가지로 1
부터 시작합니다.
첫 번째 요소의 인덱스는 1
인 셈이죠.
배열의 생성과 할당, 사용
이제 배열을 만들어보고, 배열 안에 값을 넣어보겠습니다.
생성
오토핫키에서 배열은 아래와 같이 만듭니다.
1 arr := Array()
2 arr := []
두 줄 모두 arr이라는 배열을 만드는 구문입니다.
1번 줄보다는 2번 줄이 좀 더 축약된 형태로서, 흔히 사용되는 구문입니다.
강좌에서는 2번 줄처럼 빈 대괄호쌍([]
)을 이용하겠습니다.
어? 1번 줄 말인데요... 이거 클래스로 인스턴스를 만드는 방법과 똑같은데요?
instance := 클래스명()
으로 인스턴스를 만들잖아요!
이런 의문이 있다면 정확한 관찰입니다.
실제로 오토핫키 내엔 Array 클래스가 있고, 우리는 이를 이용하여 인스턴스를 만들어주는 것입니다.
그래서 Array()
로 새 배열을 생성해줄 수 있습니다.
아무튼, 이제 arr 배열이 만들어졌습니다. 만약 빈 배열이 아닌 요소가 들어있는 배열을 만들고 싶다면 아래와 같이 콤마로 구분된 요소를 적어줄 수 있습니다. 이 역시 두 줄 모두 같은 구문입니다.
1 score := Array("장종훈", "정민철", "송진우", "김태균")
2 arr := ["장종훈", "정민철", "송진우", "김태균"]
할당
아래와 같이, 배열의 원하는 인덱스에 값을 할당할 수 있습니다.
1 arr[4] := "노시환"
현재 존재하지 않는 인덱스에 할당할 수는 없습니다.
새 요소를 추가하기 위해서는 후술할 Push()
메서드를 사용하는 것이 좋습니다.
1 arr[7] := "문동주"
사용
배열에 들어가 있는 값에 접근하려면 위에 할당의 예시처럼 []
를 사용합니다.
간단히 출력을 해보겠습니다.
1 MsgBox(arr[2])
위에서 이용했던 배열을 계속 이용한다면, 이는 정민철을 출력할 것입니다.
할당과 사용의 예에서 보았다싶이, arr[n]
은 "arr 배열의 n번째 요소"를 의미합니다.
Tip: 첨자 연산자
배열 인덱스에 접근하는 연산자인 []
는 첨자 연산자 혹은 항목 접근 연산자라고 합니다.
첨자 연산자 안에 인덱스를 적으면, 그 인덱스에 해당하는 요소(값)에 접근할 수 있습니다.
⚠ 첨자 연산자와 배열 리터럴은 다릅니다.
배열을 처음 만들 때 쓴 arr := []
의 []
는 첨자 연산자라고 하지 않습니다.
이 경우의 []
는 '배열 리터럴'이라고 부릅니다.
그 안에 [1, 10, 20]
처럼 여러 항목을 적어서 배열 그 자체를 적어줄 수 있죠.
첨자 연산자는 배열 리터럴과 다르게 인덱스를 적어줘서 값을 할당할 때 사용한 arr[3]
부분의 []
입니다.
모양은 같지만 '첨자 연산자'는 배열의 인덱스에 접근하는 경우의 []
임을 알아두세요.
당연히, 첨자 연산자 바로 앞에는 배열명이 있어야 할 것입니다.
배열에서 사용할 수 있는 메서드와 속성
이전 강에서, 오토핫키에서 배열은 객체로 구현되어있다고 말씀 드렸습니다. 그래서, 오토핫키의 배열은 메서드를 이용할 수 있습니다. 객체에 들어있는 멤버 함수, 메서드 말입니다.
메서드를 이용하면 인덱스를 계산하지 않고도 배열의 요소를 추가하거나 삭제하는 등 유용한 동작을 할 수 있습니다. 자주 사용되는 메서드는 아래와 같습니다.
메서드 | 매개변수 | 반환값 | 역할 |
---|---|---|---|
Push() | Value | - | 배열의 마지막에 값 추가 |
Pop() | - | 제거된 값 | 배열의 마지막 값을 제거 후 반환 |
InsertAt() | Index, Value1 [, Value2, ..., ValueN] | - | 배열의 특정 위치에 값 추가 |
RemoveAt() | Index [, Length] | 제거된 값 | 배열의 특정 위치에서 값 제거 |
특히 Push()
, Pop()
은 정말 많이 쓰는 메서드입니다.
배열의 마지막에 값을 추가하거나, 마지막 값을 제거하기 때문입니다.
배열에서 쓸 수 있는 속성(=멤버 변수)도 있는데, 주로 Length
하나만 사용합니다.
속성 | 의미 |
---|---|
Length | 배열의 길이 (비어있는 요소를 포함) |
실습
오랜만에 실습을 좀 해보겠습니다.
1. 50칸의 배열에 2의 배수 넣기
길이가 50인 배열에 2의 배수 50개, 즉 2, 4, 6, 8, ..., 100을 넣어보겠습니다.
1 doubleNumbers := []
2 Loop 50
3 doubleNumbers.Push(A_Index * 2)
Push()
메서드는 인수로 전달된 값을 배열의 끝에 삽입하는 역할이었죠?
이를 이용하여 2의 배수 50개를 순차적으로 요소를 추가해 주었습니다.
간략하게 그림을 그려보면 아래와 같습니다.
2. 배열의 값 모두 출력해보기
'예제 1'의 배열에 실제 값이 잘 담겼는지 확인하려면 이를 직접 출력해보는 수밖에 없을 것입니다. 이번엔 배열의 값을 모두 출력하는 스크립트를 작성해보겠습니다.
~ 예제 1의 코드 생략
1 Loop doubleNumbers.Length
2 result .= "[" A_Index "]" doubleNumbers[A_Index] "`n"
3 MsgBox(result)
배열의 원본 데이터를 삭제하지 않고 출력만 하기 위해 Pop()
메서드를 사용하지 않고 첨자 연산자로 직접 값을 읽었습니다.
doubleNumbers[A_Index]
가 바로 그 부분이죠.
그 앞에 쓰인 "[" A_Index "]"
는 단순히 몇 번째 인덱스의 값인지 출력해주기 위해 적은 것입니다.
헷갈리시면 안됩니다.
그 밖에, 반복 횟수로 Length
속성을 이용해준 것이 특기할만 합니다.
이렇게 적으면 doubleNumbers 배열의 길이가 변경되어도, 코드는 수정해줄 필요가 없습니다.
제일 좋은 것은 이 예제 전체를 함수화하여, doubleNumbers 부분을 매개변수로 수정해주는 것이죠.
함수화 시키면 배열이 바뀌어도 그 길이에 상관 없이 모든 내용을 출력할 수 있습니다.
이번 강을 이해하셨다면 다음 강은 쉽습니다. 더욱 재미있는 자료 구조인 맵을 만날 차례입니다.