정적(Static) 및 동적(Dynamic) 이란 말은 많은 곳에서 사용중이다. 물리에서도 많이 사용되고, VBA에서도 두 가지 배열의 구분에 사용된다.
우선 사전적 의미 부터 알아보자.
1) 정적(Static) : 움직임이 없이 고정된.
2) 동적(Dynamic) : 움직이는 역동적인.
Static 이라는 말은 말 그대로 움직이지 않는 다는 뜻이다. 그래서 정전기를 Static Electricity라고 한다. 반면, 동적(Dynamic)이라는 말은 역동적으로 움직인다는 뜻이다. 간단히 말해, 정적배열은 크기가 고정된 배열이란 뜻이고, 동적(Dynamic) 배열이란 크기가 변하는 배열이란 뜻이다.
배열(array)은 많은 다른 변수(Byte, Boolean, Integer, Long, Date ... Variant)들과 마찬가지로 데이터를 담는 그릇과 같다. 그런데 막 넣는게 아니고 배치할 때 열을 맞추어 넣으므로 배열이라고 부른다. 우리가 밥을 먹을 때 세수대야에 먹으면 이상하고, 세수를 밥그릇에 하면 비효율적인 것처럼 필요할 때마다 배열의 크기를 자기가 사용할 데이터에 맞추어 사용하는게 좋다. "난 항상 세수대야에 밥도 먹고 세수도 한다고 우기는 분이 있다면?" ....... 할말 없다.
실생활(사용하는 그릇의 크기) = 컴퓨터(사용하는 메모리의 크기). 큰 그릇을 사용하면 많은 메모리를 사용하고, 작은 그릇을 사용하면 적은 메모리를 사용한다. 항상 큰 그릇을 사용하면 편하지만 설거지가 힘들고, 항상 작은 그릇을 사용하면 설거지는 편하지만 10명의 국을 끓이기 위해 10개의 작은 냄비를 사용해야 한다. 역시 비효율적이다. 결국, VBA사용 시 넣을 데이터의 크기가 이미 정해져 있다면, 예를 들어 A1셀에서 A100셀 까지의 데이터를 넣을 경우, 이런 때에는 정적배열을 사용한다. 즉,
Dim varTemp() '(정적/동적)배열로 사용할 변수
Redim varTemp(1 to 100) '배열의 크기를 1부터 시작해서 100까지의 정적배열로 지정함
위와 같이 배열(그릇)의 크기를 100 이라고 선언한 또는 확정한 후 사용한다. (Redim은 Re - Dimension 의 약자로 배열의 크기를 재지정한다는 뜻. 즉 처음에는 Dim varTemp()라고 하여 배열을 선언만 하고, 그런 다음에 배열의 크기를 자기가 사용할 크기로 확정하는 것이다. 배열은 index가 0부터 시작하므로 0 To 99로 지정하면 복잡하므로 1 ~ 100 으로 지정하는 것)
하지만, 시트1에 있는 A열의 데이터만을 넣을 예정(A열에 얼마나 많은 데이터가 들어갈지 아직 알 수 없는 경우)이면 어떠한가. 이 경우 제일 큰 그릇 또는 엄청난 양의 메모리를 확보해두면 되겠지만 낭비가 심하다. 이런 경우에는 넣는 데이터의 양에 따라서 메모리의 사용도 동적(Dynamic)으로 변동되는 동적배열을 사용한다.
Dim i As Long '반복구문에 사용할 변수
Dim r As Long '배열크기 늘려갈 변수
Dim varTemp() '(정적/동적)배열로 사용할 변수
For i = 1 to 100 '100회 반복
r = r + 1 '배열크기를 1씩 늘려감
Redim Preserve varTemp(1 to r) '기존값을 유지하며 배열의 크기를 r 만큼 늘려감
Next i
위와 같이하여 r 이 늘어날 때마다 배열의 크기도 조금씩 커지게 하면 불필요하게 큰 그릇(메모리)을 사용할 필요가 없다. (Redim은 위에서 설명한 바와 같이 배열 크기를 재지정 하는 것이며, Preserve는 이미 입력된 배열내의 값을 버리지 말고 보존하라는 뜻이다. 그냥 Redim varTemp(1 to 10) 하였다가 Redim varTemp(1 to 100) 으로 바꿀 경우 기존의 데이터가 모두 사라진다. 하지만 Preserve를 사용하면 기존값들이 보존된다.)
그럼, 이런 의문이들 것이다. "동적배열을 사용하면 효율적인 것 같은데, 항상 동적배열을 사용하지 뭐하러 정적배열을 사용하나?" 라고. 동적배열은 배열크기를 상황에 따라 변동시켜 효율적으로 메모리를 사용하지만, 그것이 부메랑이 되어 단점이 된다. 즉, 동적배열은 데이터를 하나 입력시마다 배열의 크기를 매번 Redim 하여 크기를 늘려주어야 하므로 속도가 저하된다. 정리하면,
정적배열(Static array) 동적배열(Static array)
메모리 효율 : 비효율적 효율적
속도 : 빠르다 정적배열에 비해 느리다
결론적으로, 자신이 사용할 데이터의 형태에 따라 적당한 정적 또는 동적 배열을 사용하여야 한다.