[엑셀 VBA #11] (배열#1) 배열 이해하기. 배열의 차원과 

정적, 동적배열




이번 시간부터는 엑셀 VBA를 배울 때 가장 까다로운 개념 중 하나인 배열에 대해 알아보겠습니다.


한 포스팅에 담기에는 벅찰 것 같아서 나눠서 진행하도록 하겠습니다.




배열은 확실히 까다로운 개념이 맞습니다.


하지만 정말 중요한 개념이고 많이 쓰이기 때문에 꼭 이해해야 하는 개념이기도 합니다.


엑셀 VBA의 배열은 수학적 개념의 배열과 동일합니다.


변수 i에 한 가지의 수, 문자를 저장할 수 있다면, 배열 i에는 한꺼번에 여러 개의 수와 문자를 저장할 수 있습니다.


하지만 안타깝게도 배열이 이렇게 단순하지만은 않습니다...


엑셀 VBA는 배열을 1차원부터 60차원까지 허용하고 있습니다.


이는 무엇을 의미하고 있는 것일까요?





N차 배열의 의미


1. 1차 배열


1차 배열은 직선형의 단순한 배열을 의미합니다.



배열 속에 있는 각각 개체들이 앞, 뒤 순서로만 배치되어 있습니다.


엑셀의 한 에 위치한 값들의 배열이라고 생각할 수 있습니다.





2. 2차 배열


2차 배열은 직사각형(정사각형) 의 배열을 의미합니다.



배열 속의 개체들이 상하좌우로 나뉘어서 배치되어 있습니다.


엑셀의 한 시트 안에 있는 값들의 배열이라고 생각할 수 있습니다. 배열이 (i, p)와 같은 좌표로 구성이 됩니다.




3. 3차 배열


3차 배열은 직육면체(정육면체) 의 배열을 의미합니다.




배열 속의 개체들이 상하좌우 및 위 아래로 배치되어 있습니다.


여러 시트(sheet1, sheet2, sheet3.....)로 구성된 엑셀 파일에 있는 값들의 배열이라고 생각할 수 있습니다. 배열이 (i, p, o)와 같은 좌표로 구성됩니다.





4. 4차 이상 배열


사실 4차 이상 배열은 잘 사용되지 않습니다. 엑셀의 범위를 넘어가기 때문이지요..


4차 배열의 경우 여러 엑셀 파일을 담고있는 폴더, 5차 배열의 경우 여러 폴더를 담고있는 하드드라이브, 6차 배열의 경우 여러 하드드라이브를 담고있는 컴퓨터, 7차 배열의 경우 여러 컴퓨터들을 담고있는 PC방에 비유할 수 있겠네요.


계속 차원을 넓혀가면 우주까지 다다를 수 있습니다. 


억지스런 비유이긴 하지만, 엑셀 VBA에 이런 고차원적인 요소는 필요 없기에,일반적으로 3차 배열까지만 사용되고 있습니다.


물론 4, 5, 6차 배열도 분명 사용할 수 있고 사용되고 있습니다. 하지만 일반적인 엑셀에는 그 만큼 넓은 배열이 필요하지 않습니다. 







자, 이해가 되시나요? 아직 좀 아리송할겁니다.


더 간단하게 비유해보겠습니다.


배열을 엑셀에 비유했을 때, 엑셀이라는 것이 점점 진화를 한다고 생각해 보겠습니다.


엑셀의 가장 작은 기본 단위는 "셀"입니다.


그렇다면 태초의 엑셀은 아래와 같다고 가정할 수 있습니다.


이 때의 엑셀에는 배열의 개념이 필요 없습니다.


셀이 하나밖에 없기 때문이죠.


하지만 엑셀이 한단계 진화한다면 말은 달라집니다.



엑셀이 한 단계 진화해서 한 개의 행을 이루었습니다.


이 때부터 배열의 개념이 필요하게 됩니다.


배열(0), 배열(1), 배열(2), ... , 배열(n)으로 구성된 1차 배열이 등장하게 됩니다.




엑셀이 한 단계 더 진화해서 시트를 구성했습니다.


배열(0, 0) 배열(0, 1) 배열(0, 2)..... 배열(n, m)으로 구성된 2차 배열이 등장하게 됩니다.




엑셀이 한 단계 더 발전해서 엑셀 파일을 구성했습니다.


배열(0, 0, sheet1) 배열(0, 0, sheet2) ..... 배열(n, m, sheetx)로 구성된 3차 배열이 등장하게 됩니다.






정적배열과 동적배열


정적배열과 동적배열의 개념은 간단합니다.


정적배열은 이미 배열의 용량을 정해준 배열이고, 동적배열은 배열의 용량을 정해주지 않은 배열입니다.


동적배열은 배열이 차지하는 크기가 확실하지 않을 때 사용합니다.


굳이 동적배열을 선언하지 않고 정적배열로 배열을 최대한 크게 만들어도 이론상으로는 상관 없습니다.


하지만 배열은 상당히 많은 메모리를 차지합니다.


배열을 불필요하게 크게 선언한다면 메모리 부족 현상이 나타나기 쉽습니다.


따라서 배열을 동적으로 선언하여 불필요한 메모리 차지를 방지해야 합니다.




정적배열의 선언


1차 정적배열


Dim varArray(1 to 10)


2차 정적배열


Dim varArray(1 to 10, 1 to 20)    '행은 10, 열은 20인 직사각형 배열


동적배열의 선언



1차 동적배열


Dim varArray()

...

...                '배열에 필요한 크기 n을 구함

Redim varArray(n)            'varArray() 배열을 크기 n의 정적배열으로 다시 선언



2차 동적배열


Dim varArray()

...

...                '배열에 필요한 행 크기 n, 열 크기 m을 구함

Redim varArray(1 to n, 1 to m)                'varArray() 배열을 행 크기 n, 열 크기 m의 정적배열으로 다시 선언






이번 포스팅에선 배열의 기본 개념과 배열의 차원, 그리고 정적, 동적 배열에 대해 알아봤습니다.


다음 포스팅은 배열에 대한 좀 더 심화된 내용으로 찾아오겠습니다.



Posted by Simon K
: