[현상과 원인]
오늘은 배열에 대한 이야기를 하고자 합니다.
엄숙한 표정으로 말하자면 같은 데이터형의 집합이 배열입니다. 그러나 뭐 그리 딱딱하게 할 필요가
있나요? 그저 떨이로 처리하기 위해 여러 개의 변수를 묶어 놓은 거라고 보면 되겠죠.
보통 배열하면 가로,세로가 일정한 직사각형의 매트릭스를
생각할 수 있습니다. 그래서
Dim A(10,20)
으로 배열을 선언하면 가로와 세로가 11개, 21개인
정사각형의 메모리라고 봅니다. (실제 배열은 가로세로를 따지는 메모리는 아니지만)
배열과 관련하여 자주 사용하는 함수가
Array()함수입니다. 이것은 매개변수를 원소로 하는 배열을 만들어 주는 역할을 합니다. 혹시
익숙치 못한 독자분을 위해 엑셀의 도움말을 빌리자면,
Array 함수 예제 |
아래 예제에서는Array 함수를 사용하여 배열을 포함하는 Variant를 반환합니다.
Dim MyWeek, MyDay
MyWeek =
Array("Mon", "Tue", "Wed", "Thu", "Fri",
"Sat", "Sun")
' 하위 제한 범위가 1로 지정되었다고 가정한 값을 반환합니다.
' (Option Base 문 사용)
MyDay =
MyWeek(2) ' MyDay가 "Tue"를 포함하고 있습니다.
MyDay =
MyWeek(4) ' MyDay가 "Thu"를 포함하고 있습니다.
|
주의할 점은 Array()함수가 만들어준 배열을 받으려면 자격조건이
Variant형 변수이어야 한다는 점입니다.
[방법]
그러나 대개의 사용자들이 Array()함수는
1차원 배열만 만들 수 있는 것으로 생각합니다. 다음의 코드는 그러한 고정관념을 깨는 것입니다.
Private Array1()
Private Array2()
Private Array3()
Private ArrayOfArrays As Variant
Sub Test()
Dim i As Long
Dim j As Long
ReDim Array1(1 To 10)
ReDim Array2(1 To 10)
ReDim Array3(1 To 10)
ArrayOfArrays = Array(array1, Array2, Array3)
For j = 0 To 2
For i = 1 To 10
ArrayOfArrays(j)(i) = i * (j + 1)
Next i
Next j
For j = 0 To 2
For i =
1 To 10
Debug.Print ArrayOfArrays(j)(i);
Next i
Debug.Print
Next j
End Sub |
Array()함수가
매개변수로서 Variant형을 받고, 되돌려주는 것도 Variant형을 사용한다는 점은 이용한
것입니다. 이 코드에 따르면 ArrayOfArrays변수는 3 by 10형식의 2차원의 배열이
됩니다.
또한 위에서는 Array1,
Array2, Array3변수의 차원을 모두 10개로 하였지만 각 변수의 차원들 달리한다면 필자가
위에서 처음 얘기한 직사각형의 메모리가 아니라 삼각형의 메모리를 만들 수 있습니다.
|