배열

In AutoHotkey, there are two different types of things that are related to arrays:

주의: The following code examples show different approaches which lead to the same end result.

Object-based Arrays [AHK_L 31+]

Such arrays can be associative arrays or simple arrays. Associative arrays are created using the Object function or the brace syntax, while simple arrays are created using the array function or bracket syntax. For more information, see the AutoHotkey Beginner Tutorial or the Objects page.

The following example shows the usage of a simple array:

; 배열을 생성합니다. 최초는 비어 있습니다:
Array := [] ; or Array := Array()

; 배열에 씁니다:
Loop, Read, %A_WinDir%\system.ini ; 이 회돌이는 파일로부터 각 줄을 한 번에 하나씩 열람합니다.
{
    Array.Push(A_LoopReadLine) ; 이 줄을 배열에 추가합니다.
}

; 배열로부터 읽습니다:
; Loop % Array.MaxIndex()   ; 좀 전통적인 접근법.
for index, element in Array ; Enumeration is the recommended approach in most cases.
{
    ; "Loop"를 사용하면, 인덱스는 1 부터 배열의 원소의 개수까지.
    ; 연속적인 숫자가 되어야 합니다 (또는 회돌이 안에서 계산되어야 합니다).
    ; MsgBox % "Element number " . A_Index . " is " . Array[A_Index]

    ; "for"를 사용하면, 인덱스 (또는 "키")와 그에 연관된 값이 제공됩니다
    ; 그리고 인덱스는 선택에 따라 *어떤 값이든* 될 수 있습니다.
    MsgBox % "Element number " . index . " is " . element
}

이 정도는 객체가 제공하는 기능의 일부만 보여줄 뿐입니다. 항목을 설정, 열람, 삽입, 제거 그리고 열거할 수 있습니다. 문자열과 객체는 숫자와 더불어 키로 사용할 수 있습니다. 객체는 값으로 다른 객체에 저장하고 함수의 매개변수 또는 반환 값으로 건넬 수 있습니다. 객체는 또 새로운 기능으로 확장할 수 있습니다.

Though Push() and enumerators have their uses, some users might find it easier to use the more traditional approach (the commented out lines are the counterparts using the pseudo-arrays described below):

  ; 각 배열은 사용하기 전에 초기화해야 합니다:
  Array := []

; Array%j% := A_LoopField
  Array[j] := A_LoopField

; Array%j%_%k% := A_LoopReadLine
  Array[j, k] := A_LoopReadLine

  ArrayCount := 0
  Loop, Read, %A_WinDir%\system.ini
  {
      ArrayCount += 1
    ; Array%ArrayCount% := A_LoopReadLine
      Array[ArrayCount] := A_LoopReadLine
  }

  Loop % ArrayCount
  {
    ; element := Array%A_Index%
      element := Array[A_Index]
    ; MsgBox % "Element number " . A_Index . " is " . Array%A_Index%
      MsgBox % "Element number " . A_Index . " is " . Array[A_Index]
  }

ArrayCount는 편의를 위해 변수로 남겨 두었지만, 배열 자체에 Array.Count := n로 저장하거나 아니면 제거하고 그 자리에 Array.MaxIndex()를 사용해도 됩니다. 시작 위치를 1 말고 다른 것으로 하고 싶다면, Array.MinIndex()를 사용할 수 있습니다.

의사-배열

주의: If possible, always use the object-based array mentioned above. It is superior to a pseudo-array in almost every aspect: it is space-saving, more flexible, clearer, and similar to many other programming languages.

의사 배열은 대단히 개념적입니다: 각 배열은 실제로 그저 연속적으로 번호가 붙은, 그리고 각각 배열의 원소로 인지되는 변수함수 집단에 불과합니다. 오토핫키는 이 원소들을 어떤 식으로든 하나로 연결하지 않습니다.

StringSplitWinGet List같은 배열-생성 명령어 말고도, OutputVar를 받는 명령어나 값을 변수에 할당하는 명령어라면 무엇이든 배열을 생성하는데 사용할 수 있습니다. 가장 간단한 예는 아래에 보여주는 바와 같이 할당 연산자 (:=)입니다:

Array%j% := A_LoopField

다차원 배열은 선택한 가름 문자를 인덱스 사이에 사용하면 가능합니다. 예를 들어:

Array%j%_%k% := A_LoopReadLine

다음 예제는 배열을 만들고 접근하는 법을 보여줍니다. 이 경우 배열은 텍스트로부터 열람한 일련의 이름입니다:

; 배열에 쓰기:
ArrayCount := 0
Loop, Read, %A_WinDir%\system.ini   ; 이 회돌이는 파일로부터 각 줄을 한 번에 하나씩 열람합니다.
{
    ArrayCount += 1  ; 배열에 얼마나 많은 항목이 있는 추적 관리합니다.
    Array%ArrayCount% := A_LoopReadLine  ; 이 줄을 다음 배열 원소에 저장합니다.
}

; 배열로부터 읽습니다:
Loop %ArrayCount%
{
    ; 다음 줄은 := 연산자를 사용하여 배열 원소를 열람합니다:
    element := Array%A_Index%  ; A_Index는 내장 변수입니다.
    ; 다른 방법으로, "% " 접두사를 사용하여 MsgBox나 기타 다른 명령어를 표현식으로 만듭니다:
    MsgBox % "Element number " . A_Index . " is " . Array%A_Index%
}

배열에 관련된 개념은 NumPut()NumGet()을 사용해 이진 형태의 숫자 집단을 저장하고 열람하는 것입니다. 이것은 수행성능과 메모리 보전이 중요한 경우에 도움이 될 수 있습니다.