Programming/Visual Basic

VB :: 배열

bcheul 2006. 10. 19. 09:08

VB :: 배열

다른 언어프로그램 경험이 있다면 배열개념이 친숙할 것이다. 배열은 동일한 이름으로 연속되는 변수를 참조하고 인덱스번호를 사용할 수 있다. 배열은 인덱스번호를 사용하여 인덱스번호에 따라 효율적으로 루프를 설정하므로 여러 상황에서 코드를 작고 간단하게 작성할 수 있다. 배열의 인덱스번호는 상한값과 하한값을 가지며, 배열의 요소는 범위내에서 연속적이다. visual basic은 인덱스번호에 따라 공간을 할당하기 때문에 필요한 크기로 배열을 선언할 수 있다.
visual basic에는 항상 같은 크기를 갖는 고정크기배열과 실행시간에 크기가 변하는 동적배열의 두가지 배열형식이 있다.

고정크기배열
배열의 선언은 일반변수선언과 비슷하다. 다만 변수 명 뒤에 (인덱스번호)를 넣는 것만 다를 뿐이다.
'일반배열의 선언을 나타내고 있다. (인덱스의 시작은 0이다.)
Dim Counters(14) As Integer  '요소의 수는 15이다.
Dim Sums(20) As Double  '요소 수는 21이다.
첫번째 선언은 인덱스는 0에서 14까지의 15개 요소를 갖는 배열을 생성한다. 두번째는 인덱스번호는 0에서 20까지의 21개 요소를 갖는 배열을 생성한다. 인덱스번호 하한값의 기본값은 0이다. 만약 하한값의 기본값을 변경하고자 한다면, (일반)(선언)부에 [Option Base 하한값]을 설정하면 된다.

예를 들어, 모듈의 선언부분에
Option Base 1
Dim Counters(10)
라고 코드를 작성했다면, 이 문장은 1부터 10까지 총 10개의 배열요소를 갖게 된다.

그러나 다음과 같이 To키워드를 사용하여 명시적으로 지정할 수도 있다.
Dim Counters(1 To 15) As Integer
Dim Sums(100 To 120) As String
Counters배열의 인덱스번호는 1에서 15까지이고, Sums의 인덱스번호범위는 100에서 120까지이다.

다차원배열
배열에서 관련정보를 추적해야 할 때가 있다. 예를 들어, 컴퓨터 화면의 각 픽셀을 추적하려면 x와 y좌표가 있어야 한다. 이런 경우 값을 저장하려면 다차원배열을 사용해야 한다. 다음 예문은 프로시저 내에 2차원배열을 선언하고 있다.
' option base 1이 지정되어 있다면 총 81개의 인덱스가 생긴다.
Dim MatrixA(9, 9) As Double
다차원 배열 역시 일반고정배열과 마찬가지로 인덱스 하한값을 다음과 같이 명시적으로 선언할 수 있다.

Dim MatrixA(1 To 10, 1 To 10) As Double
2차원 이상의 배열 선언시에는 계속해서 콤마(,)를 삽입하면 다차원 배열을 확장시킬 수 있다.

Dim MultiD(3, 1 To 10, 1 To 15)
MultiD배열은 4*10*15크기의 3차원 배열을 생성한다. 요소의 총 수는 3차원 요소들의 곱으로서 600이다.

동적배열
배열을 어느 정도 크기로 만들어야 할 지 모를때., 실행중에 배열크기를 변경할 수 있는 것을 '동적배열'이라고 한다. 동적배열은 언제라도 크기를 조절할 수 있어 아주 유연하고 편리한 기능으로서 메모리를 효율적으로 관리할 수 있다. 에를 들어, 단 시간에 큰 배열을 사용하고, 배열이 더 이상 필요하지 않으면 메모리를 해제할 수 있다. 하지만 이 방식을 너무 많이 사용하면 메모리가 적은 상태에서 실행되는  운영환경을 유발할 위험이 따른다. 동적배열을 생성하려면 다음과 같은 방법을 따르면 된다.

1, Public문(전역 배열을 원하는 경우), Dim문(모듈레벨 배열을 원하는 경우) 프로시저에서 Static 또는 Dim문 중 하나를 사용하여 배열을 선언한다. 동적배열 선언시 인덱스번호 부분을 비워두면 된다.
2, ReDim문을 사용하여 요소의 실제숫자를 할당할 수 있다.
ReDim DynArray(x + 1)

ReDim문은 프로시저에만 나타날 수 있다. Dim 및 Static문과는 달리 ReDim문은 실행가능한 문으로, 실행시간에 응용프로그램이 기능을 수행하도록 만든다. ReDim문은 고정배열에 사용된 것과 동일한 구문을 사용한다. 각 ReDim은 각차원에 대해 요소의 수, 인덱스의 상한값과 하한값등을 변경할 수 있지만, 배열의 차원수는 변경할 수 없으므로 유의하기 바란다.
ReDim DynArray(4 To 12)
ReDim문을 사용할 때마다 기존의 값은 없어지게 된다. 하지만 데이터를 보존하면서 크기를 바꾸려면 ReDim문과 Preserve키워드와 함께 사용하면 된다. 예를 들어, 인덱스의 상한값을 참조하는 UBound함수를 사용하면 기존의 요소의 값을 보존하면서 배열을 한 요소만큼 확대할 수 있다.

ReDim Preserve DynArray(UBound(DynArray) +1)


다음은 Redim문으로 동적배열변수의 저장공간을 할당하거나 재할당하는 예를 보이고 있다.

Option Explicit
Option Base 1
Dim myArray() As integer

Private Sub Command1_Click()
Dim I Integer
ReDim myArray(5)  ' 동적배열에 5개의 구성요소

' 동적배열의 각 요소에 값을 할당한다.
For i = 1 to 5  ' 5번 반복수행
 myArray(i) = i  ' 배열을 1부터 5까지 초기화한다.
 Print myArray(i)
Next i

' 배열의 크기를 재조정하면 기존의 값들은 모두 지워진다.
' 구성요소에 새로운 값을 할당할 수 있다.
ReDim myArray(10)
For i = 1 To 10
 myArray(i) = i + 1
 print myArray(i)
Next i

' 배열의 크기는 확장되지만, 기존배열에 들어갔던 값들은 그대로 보존된다.
' 확장된 배열의 값은 0으로 할당된다.
ReDim Preserve myArray(15)  ' 15의 구성요소로 크기를 재 조정
For i = 1 To 15
 Print myArray(i)
Next i
End Sub