Variant 변수에 저장된 객체
객체는 Variant 변수에 저장될 수 있습니다. 이는 객체를 포함한 다양한 데이터 유형을 효율적으로 처리해야 할 때 유용할 수 있습니다. 예를 들어 배열의 모든 요소는 동일한 데이터 유형을 가져야 합니다. 객체를 다른 데이터 유형과 함께 동일한 배열에 저장하려면 배열의 데이터 유형을 Variant로 설정합니다.
정렬
다른 언어로 프로그래밍한 경험이 있다면 배열의 개념을 잘 알고 있어야 합니다. 배열 덕분에 동일한 이름을 가진 일련의 변수를 참조하고 숫자로 식별(인덱싱)할 수 있습니다. 많은 상황에서 배열을 사용하면 여러 상황을 효율적으로 처리하기 위해 인덱스 값을 사용하여 루프를 설계할 수 있으므로 프로그램이 단축되고 단순화될 수 있습니다. 배열에는 상한과 하한이 있으며, 배열의 요소는 상한과 하한 내에서 연속적입니다. Visual Basic에서는 각 인덱스 값에 공간을 할당하므로 비현실적으로 큰 배열을 선언하지 마십시오.
이 섹션에서 설명하는 배열 은 프로그램에서 선언된 변수의 배열입니다. 이는 컨트롤의 Index 속성을 설정하여 디자인 타임에 지정되는 컨트롤 배열과 다릅니다. 변수 배열은 항상 연속적입니다. 제어 배열과 달리 배열 요소는 배열 중간에서 로드하거나 언로드할 수 없습니다.
배열의 모든 요소는 동일한 데이터 유형을 갖습니다. 물론 데이터 유형이 Variant인 경우 각 요소는 다양한 유형의 데이터(객체, 문자열, 값 등)를 포함할 수 있습니다. 사용자 정의 유형(8장, "다시 프로그래밍"의 "자신만의 데이터 유형 만들기" 참조) 및 개체 변수(9장, "객체를 사용한 프로그래밍" 참조)를 포함하여 모든 기본 데이터 유형의 배열을 선언할 수 있습니다.
Visual Basic에는 항상 동일한 크기를 유지하는 고정 크기 배열과 런타임 시 크기가 변경될 수 있는 동적 배열이라는 두 가지 유형의 배열이 있습니다. 동적 배열은 이 장 뒷부분의 "동적 배열"에서 자세히 설명합니다.
고정 크기 배열 선언
고정 크기 배열을 선언하는 방법에는 세 가지가 있으며, 사용하는 방법은 배열이 가져야 하는 유효한 범위에 따라 달라집니다.
공용 배열을 만들려면 모듈의 선언 섹션에서 Public 문을 사용하여 배열을 선언합니다.
모듈 수준 배열을 만들려면 모듈의 선언 섹션에서 PRivate 문을 사용하여 배열을 선언합니다.
로컬 배열을 생성하고 프로세스에서 Private 문을 사용하여 배열을 선언합니다.
상한 및 하한 설정
배열을 선언할 때 배열 이름 뒤에는 괄호로 묶인 상한값이 옵니다. 상한은 Long 데이터 유형의 범위(-2,147,483,648 ~ 2,147,483,647)를 초과할 수 없습니다. 예를 들어, 모듈의 선언 섹션에 다음과 같은 배열 선언이 나타날 수 있습니다.
DimCounters(14)AsInteger '15개 요소.
DimSums(20)AsDouble '21 요소.
공용 배열을 생성하려면 Dim을 Public으로 직접 바꾸십시오.
PublicCounters(14)AsInteger
PublicSums(20)AsDouble
동일한 선언에서는 프로시저에서 Dim을 사용합니다. DimCounters(14)AsIntegerDimSums(20)AsDouble 첫 번째 선언은 0에서 14까지 인덱싱된 15개 요소가 있는 배열을 만듭니다. 두 번째 선언은 0에서 20까지 인덱싱된 21개 요소로 구성된 배열을 만듭니다. 기본 하한은 0입니다.
하한을 지정하려면 To 키워드를 사용하여 명시적인 하한을 제공합니다(Long 데이터 유형의 경우).
DimCounters(1To15)AsInteger
딤섬(100To120)AsString
앞의 문장에서 Counters는 1부터 15까지의 인덱스 값을 가지고 있고, Sum은 100부터 120까지의 인덱스 값을 가지고 있습니다.
다른 배열을 포함하는 배열
Variant 데이터 유형의 배열을 생성하고 이를 다양한 데이터 유형의 배열과 함께 배치할 수 있습니다. 다음 코드는 두 개의 배열을 생성합니다. 하나는 정수를 포함하고 다른 하나는 문자열을 포함합니다. 그런 다음 세 번째 Variant 배열을 선언하고 그 안에 정수 및 문자열 배열을 배치합니다.
PrivateSubCommand1_Click()
DimintXAsInteger '카운터 변수를 선언합니다.
'정수 배열을 선언하고 배치합니다.
DimcountersA(5)AsInteger
포린트X=0To4
카운터A(intX)=5
넥스트인트엑스
'문자열 배열을 선언하고 배치합니다.
DimcountersB(5)AsString
포린트X=0To4
countersB(intX)=안녕하세요
넥스트인트엑스
DimarrX(2)AsVariant '두 개의 멤버가 있는 새 배열을 선언합니다.
arrX(1)=countersA() '다른 배열을 배열로 이동합니다.
arrX(2)=카운터B()
MsgBoxarrX(1)(2) '각 배열 구성원을 표시합니다.
MsgBoxarrX(2)(3)
EndSub
다차원 배열
때로는 배열에서 관련 정보를 추적해야 하는 경우도 있습니다. 예를 들어 컴퓨터 화면의 모든 픽셀을 추적하려면 해당 X 및 Y 좌표를 참조해야 합니다. 이때 값을 저장하려면 다차원 배열을 사용해야 합니다. 다차원 배열은 Visual Basic으로 선언할 수 있습니다. 예를 들어, 다음 명령문은 프로시저 내에서 10×10 2차원 배열을 선언합니다.
StaticMatrixA(9,9)AsDouble
명시적인 하한을 사용하여 차원 중 하나 또는 둘 다를 선언할 수 있습니다.
정적 행렬A(1To10,1To10)AsDouble
이 모든 것은 2차원 이상의 배열로 일반화될 수 있습니다. 예를 들어:
DimMultiD(3,1To10,1To15)
이 선언은 4×10×15 크기의 3차원 배열을 생성합니다. 총 요소 수는 3차원의 곱인 600입니다.
배열의 차원을 늘리면 배열이 차지하는 저장 공간이 크게 늘어나므로 다차원 배열을 사용할 때는 주의 해야 합니다. Variant 배열을 사용할 때는 더 큰 저장 공간이 필요하므로 특히 주의하십시오.
루프를 사용하여 배열 조작
중첩된 For 루프를 사용하여 다차원 배열을 효과적으로 처리할 수 있습니다. 예를 들어, MatrixA에서는 각 요소에 배열에서의 위치에 따라 값이 할당됩니다.
DimIAsInteger,JAsInteger
정적 행렬A(1To10,1To10)AsDouble
ForI=1To10
J=1To10의 경우
행렬A(I,J)=I*10J
다음J
다음I
추가 정보 루프에 대한 자세한 내용은 이 장 뒷부분의 "루프 구조" 섹션을 참조하십시오.
동적 배열
배열의 크기가 얼마나 커야 하는지 알 수 없는 경우가 있습니다. 그래서 런타임에 배열의 크기를 변경할 수 있는 기능이 있기를 바랍니다.
동적 배열은 언제든지 크기를 변경할 수 있습니다. Visual Basic에서는 동적 배열이 가장 유연하고 편리하여 메모리를 효과적으로 관리하는 데 도움이 됩니다. 예를 들어, 큰 어레이를 짧은 시간 동안 사용한 다음 어레이가 사용되지 않을 때 메모리 공간을 시스템에 해제할 수 있습니다.
동적 배열을 사용하지 않는 경우 가능한 가장 큰 크기의 배열을 선언한 다음 불필요한 요소를 삭제하세요. 하지만 이 방법을 과도하게 사용하게 되면 메모리 동작 환경이 느려지는 원인이 됩니다.
동적 배열을 만들려면 다음 단계를 따르세요.
1. (배열을 공용 배열로 지정하려는 경우) Public 문을 사용하여 배열을 선언하거나, (배열을 모듈 수준으로 지정하려는 경우) 모듈 수준에서 Dim 문을 사용하여 배열을 선언합니다. 또는 (배열을 로컬 배열로 지정하려는 경우) Static 또는 Dim 문을 사용하여 프로시저 중에 배열을 선언합니다. 빈 차원 테이블을 추가하여 배열을 동적으로 선언합니다.
DimDynArray()
2. ReDim 문을 사용하여 실제 요소 수를 할당합니다.
ReDimDynArray(X 1)
ReDim 문은 프로시저 내에서만 나타날 수 있습니다. Dim 문 및 Static 문과 달리 ReDim 문은 실행 가능한 문이므로 애플리케이션은 런타임에 작업을 수행합니다. ReDim 문은 고정 배열에 사용되는 것과 동일한 구문을 지원합니다. 각 차원에 대해 각 ReDim 문은 요소 수와 상한 및 하한을 변경할 수 있습니다. 그러나 배열의 크기는 변경할 수 없습니다.
ReDimDynArray(4to12)
예를 들어 처음으로 모듈 수준에서 생성된 동적 배열 Matrix1을 사용합니다.
DimMatrix1()AsInteger
그런 다음 프로시저에서 배열에 공간을 할당합니다.
SubCalcValuesNow()
.
.
.
ReDimMatrix1(19,29)
EndSub
여기서 ReDim 문은 20×30 정수 행렬을 Matrix에 할당합니다(총 요소 크기는 600). 변수를 사용하여 동적 배열의 경계를 설정하는 또 다른 방법이 있습니다.
ReDimMatrix1(X,Y)
가변 크기 바이트 배열에 문자열을 할당할 수 있습니다 . 바이트 배열은 가변 길이 문자열에 할당될 수도 있습니다. 문자열의 바이트 수는 플랫폼에 따라 다르다는 점에 유의하는 것이 중요합니다. 동일한 문자열은 유니코드가 아닌 플랫폼에서와 마찬가지로 유니코드 플랫폼에서 두 배 더 많은 바이트를 갖습니다.
동적 배열의 내용 보존
ReDim 문이 실행될 때마다 현재 배열에 저장된 모든 값이 손실됩니다. Visual Basic에서는 배열 요소의 값을 비어 있음(Variant 배열의 경우), 0(숫자 배열의 경우), 길이가 0인 문자열(문자열 배열의 경우) 또는 Nothing(개체 배열의 경우)으로 재설정합니다. .
이는 새 데이터에 대한 배열을 준비하거나 메모리를 절약하기 위해 배열 크기를 줄이려는 경우에 유용합니다. 때때로 배열의 데이터를 잃지 않고 배열의 크기를 변경하고 싶을 때가 있습니다. 이는 Preserve 키워드와 함께 ReDim 문을 사용하여 수행할 수 있습니다. 예를 들어, 상한을 참조하기 위해 UBound 함수를 사용하면 기존 요소의 값을 잃지 않고 배열이 확장되고 요소가 추가됩니다.
ReDimPreserveDynArray(UBound(DynArray) 1)
Preserve 키워드를 사용하는 경우 다차원 배열의 마지막 차원의 상한만 변경할 수 있습니다. 다른 차원이나 마지막 차원의 하한을 변경하면 런타임에 오류가 발생합니다. 따라서 다음과 같이 프로그래밍할 수 있습니다.
ReDimPreserveMatrix(10,UBound(행렬,2) 1)
다음과 같이 프로그래밍하는 대신:
ReDimPreserveMatrix(UBound(행렬,1) 1,10)
동적 배열에 대한 자세한 내용 은 언어 참조의 "ReDim 함수"를 참조하세요. 객체 배열에 대한 자세한 내용은 9장, "객체를 사용한 프로그래밍"을 참조하십시오.
->