프날 오토핫키 강좌  v2

⚠ 이 강좌는 오토핫키 v2를 다룹니다

지금 보시는 강좌는 과거 오랜 시간동안 알려진 오토핫키(v1.1)의 차세대 버전인 오토핫키 v2를 다루고 있습니다.
만약 구버전인 '오토핫키 v1.1'의 강좌를 찾으신다면 프날 오토핫키 강좌(https://pnal.kr)를 봐주시면 되지만, 새로 오토핫키를 배우신다면 v2 버전을 배우시는 것을 강력히 추천드립니다.

65. 배열


이름부터 가장 단순해보이는 배열부터 차근차근 배워보겠습니다.

배열

배열은 순차적인 값을 처리하기 위해 등장한 자료 구조입니다. 학생 100명을 관리하기 위해 100개의 변수를 사용하는 대신, 순차적으로 한 명씩 자료 구조에 담을 수 있게 한 것이죠. 각 학생은 '1번 학생', '2번 학생' 등으로 표현됩니다. 이렇듯 배열은 '순서'가 중요한 측면이 있습니다.

배열은 주로 한 줄의 표 형태로 나타냅니다. 프날 오토핫키 강좌도 마찬가지로, 아래와 같은 1행 표 형태로 배열을 표현하겠습니다.

장종훈, 정민철, 송진우, 김태균 사진 1. 배열의 구조 예시

Tip: 요소와 인덱스

앞으로 강좌에서 요소, 인덱스라는 말을 많이 사용할 것입니다.

요소는 배열 안에 있는 각 값을 의미하는데, 그러니까 '사진 1'에서 장종훈, 정민철 등이 요소입니다.

인덱스는 배열의 요소가 가진 순번을 말합니다. '사진 1'에서 김태균의 인덱스는 4이죠.

  • 요소(Element): 배열 안에 있는 각 값을 말합니다.
  • 인덱스(Index): 배열의 요소가 가진 순번을 의미합니다.

참고로, '인덱스'라는 용어는 내장 변수 A_Index에서 알 수 있듯이 프로그래밍에서 어떤 순번을 의미하는 일반적인 용어입니다. 대부분 언어에서 인덱스는 0부터 시작하지만, 오토핫키에선 현실 세상과 마찬가지로 1부터 시작합니다. 첫 번째 요소의 인덱스는 1인 셈이죠.

배열의 생성과 할당, 사용

이제 배열을 만들어보고, 배열 안에 값을 넣어보겠습니다.

생성

오토핫키에서 배열은 아래와 같이 만듭니다.

1arr := Array()
2arr := []
배열의 생성

두 줄 모두 arr이라는 배열을 만드는 구문입니다. 1번 줄보다는 2번 줄이 좀 더 축약된 형태로서, 흔히 사용되는 구문입니다. 강좌에서는 2번 줄처럼 빈 대괄호쌍([])을 이용하겠습니다.

어? 1번 줄 말인데요... 이거 클래스로 인스턴스를 만드는 방법과 똑같은데요?
instance := 클래스명()으로 인스턴스를 만들잖아요!

이런 의문이 있다면 정확한 관찰입니다. 실제로 오토핫키 내엔 Array 클래스가 있고, 우리는 이를 이용하여 인스턴스를 만들어주는 것입니다. 그래서 Array()로 새 배열을 생성해줄 수 있습니다.

아무튼, 이제 arr 배열이 만들어졌습니다. 만약 빈 배열이 아닌 요소가 들어있는 배열을 만들고 싶다면 아래와 같이 콤마로 구분된 요소를 적어줄 수 있습니다. 이 역시 두 줄 모두 같은 구문입니다.

1score := Array("장종훈", "정민철", "송진우", "김태균")
2arr := ["장종훈", "정민철", "송진우", "김태균"]
배열의 생성 (초기값 포함) 장종훈, 정민철, 송진우, 김태균 사진 2. 만들어진 배열의 모습

할당

아래와 같이, 배열의 원하는 인덱스에 값을 할당할 수 있습니다.

1arr[4] := "노시환"
배열의 네 번째 요소를 변경(재할당) 장종훈, 정민철, 송진우, 노시환 사진 3. 4번 인덱스의 값이 '김태균'에서 '노시환'이 된 배열의 모습

현재 존재하지 않는 인덱스에 할당할 수는 없습니다. 새 요소를 추가하기 위해서는 후술할 Push() 메서드를 사용하는 것이 좋습니다.

1arr[7] := "문동주"
현재 배열은 4번 인덱스까지 있기 때문에, 7번 인덱스로는 할당이 되지 않습니다. (오류)

사용

배열에 들어가 있는 값에 접근하려면 위에 할당의 예시처럼 []를 사용합니다. 간단히 출력을 해보겠습니다.

1MsgBox(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을 넣어보겠습니다.

1doubleNumbers := []
2Loop 50
3    doubleNumbers.Push(A_Index * 2)
예제 1. doubleNumbers 배열에 2의 배수 50개 삽입

Push() 메서드는 인수로 전달된 값을 배열의 끝에 삽입하는 역할이었죠? 이를 이용하여 2의 배수 50개를 순차적으로 요소를 추가해 주었습니다. 간략하게 그림을 그려보면 아래와 같습니다.

2, 4, 6, 8, 10, 12, 14, 16, 18, ..., 48, 50 사진 4. 2의 배수가 들어간 배열의 모습

2. 배열의 값 모두 출력해보기

'예제 1'의 배열에 실제 값이 잘 담겼는지 확인하려면 이를 직접 출력해보는 수밖에 없을 것입니다. 이번엔 배열의 값을 모두 출력하는 스크립트를 작성해보겠습니다.

~예제 1의 코드 생략
1Loop doubleNumbers.Length
2    result .= "[" A_Index "]" doubleNumbers[A_Index] "`n"
3MsgBox(result)
예제 2. doubleNumbers 배열의 값 모두 출력 [1] 2, [2] 4, [3] 6, 부터 [50] 100 까지 적힌 알림 상자 사진 6. 출력 결과

배열의 원본 데이터를 삭제하지 않고 출력만 하기 위해 Pop() 메서드를 사용하지 않고 첨자 연산자로 직접 값을 읽었습니다. doubleNumbers[A_Index]가 바로 그 부분이죠. 그 앞에 쓰인 "[" A_Index "]"는 단순히 몇 번째 인덱스의 값인지 출력해주기 위해 적은 것입니다. 헷갈리시면 안됩니다.

그 밖에, 반복 횟수로 Length 속성을 이용해준 것이 특기할만 합니다. 이렇게 적으면 doubleNumbers 배열의 길이가 변경되어도, 코드는 수정해줄 필요가 없습니다. 제일 좋은 것은 이 예제 전체를 함수화하여, doubleNumbers 부분을 매개변수로 수정해주는 것이죠. 함수화 시키면 배열이 바뀌어도 그 길이에 상관 없이 모든 내용을 출력할 수 있습니다.

이번 강을 이해하셨다면 다음 강은 쉽습니다. 더욱 재미있는 자료 구조인 을 만날 차례입니다.

질문하러 가기