티스토리 뷰




변수는 하나의 값만을 저장할 수있는 메모리 공간입니다. 변수에 대해서 잘모르신다면 이에 대한 설명은 지난 포스팅에서 많이 해드렸으니 아래의 글을 참조하시기 바랍니다. 



오늘의 글에서는 연속된 메모리 공간에 데이터를 저장할 때 사용하는 자료구조에 대해서 알아보도록 하겠습니다. 그렇다면 연속적인 데이터를 저장하기 위한 방법은 무엇이 있을까요? 변수를 여러개 선언을 해야할까요? 


1. 배열이란?


바로 '배열'이라는 자료구조를 많이 사용합니다. 

배열은 같은 자료형을 가진 연속된 메모리 공간으로 이루어진 자료구조로써, 같은 자료형에 대한 변수 여러개를 한번에 선언할 수 있는 방법이라고 생각을 하시면 됩니다.


예를 들어볼까요. 정수형 데이터를 가지는 변수 5개가 필요합니다. 어떻게 선언을 할 수 있을까요? 아래와 같이 선언이 가능하겠죠?


Dim value1, value2, value3, value4, value5 As Integer 


그렇다면 1000개 필요하다면 어떨까요?


물론 아래와 같이 value1부터 value1000까지 만들수도 있을것입니다. 그럼 10000개는? 100000개는? 데이터를 저장해야 하는 저장소에 대한 선언의 크기가 커지면 커질 수록 사용자는 변수로 선언하기 힘들 수 밖에 없습니다. 


Dim value1, value2, value3, value4, value5, value6, value7, .... value1000 As Integer


담배2

'1000개를 다 치려니, 담배가 생각이난다.'


많은 양의 데이터를 저장하기 위해서는 변수를 선언하기 보다, 배열을 사용해야 합니다. VBA에서 배열을 선언하는 방법은 아래와 같습니다.


Dim 배열변수이름(크기) As 데이터형

또는

Dim 배열변수이름(시작 인덱스 To 종료 인덱스) As 데이터형


변수를 선언하는 방법과 차이점은 ()안에 크기를 넣어주는 것 밖에 없습니다. Value에 대한 1000개의 배열을 만들어야 한다면, 아래와 같이 선언을 할 수 있습니다 .



Dim values(1000) as Integer 또는 Dim values2(1 to 1000) as Integer


위와 같은 배열을 정적 배열이라고 합니다. 정적 배열은 크기가 선언시 지정이 되는 배열을 의미하는데요. 데이터를 저장해야 하는 저장소의 크기가 지정된 경우에 사용을 할 수 있습니다. 


그럼 정적 배열을 사용해보도록 하겠습니다. 아래의 코드는 1000개 짜리 배열을 두개(value, value2)를 선언하고, For문을 이용해서 1부터 1000의 값을 배열의 순서에 맞게 입력한 결과입니다. 마지막에는 메시지 박스를 통해서 value의 999번째 값과 value2의 500번째 값을 나타냅니다. 


Sub Test()


Dim value(1000) As Integer

Dim value2(1 To 1000) As Integer

Dim index As Integer



For index = 1 To 1000


    value(index) = index

    value2(index) = index


Next


MsgBox "999번째 Value 배열 값 : " & value(999) & " / 500번째 Value2 배열 값 : " & value2(500)


End Sub


위의 코드를 실행하게 되면 아래와 같은 결과를 얻을 수 있습니다. 배열에 값들이 제대로 들어갔음을 확인할 수 있습니다. 




2. 동적 배열


그렇다면 어떠한 코드가 실행이 되기 전까지 배열의 크기가 명확히 정해지지 않는다면 어떻게 배열을 생성할 수 있을까요?

배열의 크기를 아주큰 (예를 들면 10,000,000) 수로 미리 지정을 해서 사용을 해야 할까요? 아닙니다. 이런 경우에는 동적 배열을 선언할 수 있습니다. 


동적 배열을 선언하는 방법은 아래와 같습니다.


Dim 배열변수이름() As 데이터형식

ReDim 배열변수이름(크기) 


ReDim에 대한 코드는 사용자가 필요한 코드 부분에 집어넣으시면 됩니다. ReDim을 하게 되면 ReDim을 선언한 시점에서 배열의 크기가 결정이 되고, 배열을 사용할 수가 있습니다.


ReDim을 사용할 때는 주의해야할 점이 하나있습니다.

ReDim 배열변수이름(크기)로 배열의 크기를 선언하면 기존에 배열안에 있던 내용이 모두 지워지게 됩니다. 배열의 크기를 재설정하면서 기존 배열의 값을 지우지 않게 하기 위해서는 Preserve라는 키워드를 사용해야 합니다.


아래의 예를 한번 살펴볼까요?


Sub Test()


Dim 동적배열() As Integer

Dim index As Integer

ReDim 동적배열(1000) ' 동적 배열 1000으로 지정


For index = 1 To 1000

    동적배열(index) = index

Next


MsgBox "1: 999번째 동적배열 배열 값 : " & 동적배열(999)


ReDim Preserve 동적배열(2000) ' 동적 배열 2000으로 지정 및 Preserve 키워드 사용

MsgBox "2: 999번째 동적배열 배열 값 : " & 동적배열(999)


ReDim 동적배열(2000) ' 동적 배열 2000으로 재지정

MsgBox "3: 999번째 동적배열 배열 값 : " & 동적배열(999)


End Sub




위의 코드를 실행하면 아래와 같은 결과를 보여줍니다.

ReDim에 Preserve 키워드를 사용(메시지 박스 2번)하면 999번째 값이 남아 있지만, Preserve를 사용하지 않으면(메시지 박스 3번) 배열의 값이 0으로 초기화 된것을 확인할 수 있습니다.



3. 다차원 배열


지금까지 1차배열에 대한 정적 배열 선언과 동적 배열 선언방법에 대해서 알아보았습니다. 다차원 배열은 인덱스를 2개 이상 사용하는 배열을 말합니다. 다차원 배열은 배열의 길이가 하나가 아닌 2개 이상입니다. 2개이면 이차원배열, 3개이면 삼차원배열이됩니다.


1차원 배열과 다차원 배열의 차이를 그림을 통해서 살펴보도록 하겠습니다. 아래의 그림은 모두 12개의 Integer 데이터를 저장하기 위한 저장소입니다. 1차원 배열은 행만, 2차원 배열은 행과 열로, 3차원 배열은 면,행,열로 구성이 됩니다. 




<그림 참조 : http://ropas.snu.ac.kr/~gslee/lecture-slides/c2011-01/20110513-01.pdf>


2차원 배열의 선언 방법은 아래와 같습니다.


정적의 경우 : 

Dim 배열변수이름(행의 크기, 열의 크기) As 데이터형


동적의 경우 : 

Dim 배열변수이름() As 데이터형

ReDim 배열변수이름(행의 크기, 열의 크기)


*Preserve를 사용하는 경우 :

Dim 배열변수이름() As 데이터형

ReDim Preserve 배열변수이름(행의 크기, 열의 크기)


데이터에 접근을 하는 방법도 동일합니다. ,를 통해서 배열에 접근을 하면됩니다. 위의 2차원 배열 그림에서 2행 3열의 데이터에 접근을 하고자 한다면 Array(2,3)을 통해서 접근을 할 수 있습니다.


*Preserve를 사용하는데는 하나의 주의점이 있습니다. Preserve를 사용하여 크기 조정을 하는경우 배열의 마지막 차원 크기만 조정할 수 있습니다. 다른 모든 차원에 대 한 기존 배열의 범위를 지정 해야 합니다.



그럼 실제 사용예를 살펴보도록 하겠습니다. Preserve를 설명하기 위해서 동적배열로 2차원 배열을 선언하고 이용하였습니다. 


Sub Test()


Dim 동적배열() As Integer

Dim index, index2 As Integer

ReDim 동적배열(1000, 1000) ' 동적 배열 1000으로 지정


For index = 1 To 1000

    For index2 = 1 To 1000

        동적배열(index, index2) = index

    Next

Next


MsgBox "1: 999번째 동적배열 배열 값 : " & 동적배열(1, 999) '1행 999열의 값을 가져옴


ReDim Preserve 동적배열(2000, 2000) ' 동적 배열 2000, 2000으로 지정

MsgBox "2: 999번째 동적배열 배열 값 : " & 동적배열(1, 999)


ReDim 동적배열(2000, 2000) ' 동적 배열 2000, 2000으로 재지정

MsgBox "3: 999번째 동적배열 배열 값 : " & 동적배열(1, 999)


End Sub



위의 코드는 1000행 1000열 짜리 배열을 하나 만들고, 값을 넣은뒤 Preserve와 Preserve가 아닌 방식을 통해서 2000, 2000개의 배열을 생성하였습니다.


위의 코드를 실행하게 되면 아래와 같은 에러가 발생을 합니다. Preserve를 이용하면 마지막 차원의 크기만 변경할 수있습니다. 하지만 코드에서 행의 크기도 1000에서 2000으로 변경을 하였기 때문에 에러가 발생을 합니다. 



행의 크기를 1000으로 고정하고 열의 크기만 2000으로 변경을 하게 되면 에러없이 실행이 정상적으로 동작합니다.



Preserve를 사용하지 않고 ReDim만 하는 경우라면 행의 크기가 1000이든, 2000이든, 3000이든 상관이 없습니다.


이글에서는 배열에 대해서 알아보았습니다. 배열에는 정적배열과 동적배열이 있고, 이를 선언하고 사용하는 방법에 대해서만 숙지하시면 될것 같습니다.


이 글이 도움이 되셨나요?

그렇다면 아래의 그림을 클릭해주세요.



댓글