Dim 문(Visual Basic)

하나 이상의 변수에 대한 스토리지 공간을 선언하고 할당합니다.

구문

[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]
Dim [ WithEvents ] variablelist

부분

  • attributelist

    선택 사항입니다. 특성 목록을 참조하세요.

  • accessmodifier

    선택 사항입니다. 다음 중 하나일 수 있습니다.

    Access levels in Visual Basic을 참조하세요.

  • Shared

    선택 사항입니다. 공유를 참조하세요.

  • Shadows

    선택 사항입니다. 그림자를 참조하세요.

  • Static

    선택 사항입니다. 정적을 참조하세요.

  • ReadOnly

    선택 사항입니다. ReadOnly를 참조하세요.

  • WithEvents

    선택 사항입니다. 이벤트를 발생시키는 클래스의 인스턴스를 참조하는 개체 변수임을 지정합니다. WithEvents를 참조하세요.

  • variablelist

    필수 사항입니다. 이 문에서 선언되는 변수 목록입니다.

    variable [ , variable ... ]

    variable에는 다음과 같은 구문과 요소가 있습니다.

    variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With{[ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]

    부분 설명
    variablename 필수 사항입니다. 변수의 이름입니다. Declared Element Names을 참조하세요.
    boundslist 선택 사항입니다. 배열 변수의 각 차원 범위 목록입니다.
    New 선택 사항입니다. 문이 실행되면 클래스의 새 인스턴스를 Dim 만듭니다.
    datatype 선택 사항입니다. 변수의 데이터 형식입니다.
    With 선택 사항입니다. 개체 이니셜라이저 목록을 소개합니다.
    propertyname 선택 사항입니다. 인스턴스를 만드는 클래스의 속성 이름입니다.
    propinitializer =이후에 propertyname 필요합니다. 속성 이름에 계산되고 할당되는 식입니다.
    initializer 지정하지 않은 경우 New 선택 사항입니다. 변수를 만들 때 계산되고 변수에 할당되는 식입니다.

설명

Visual Basic 컴파일러는 문을 사용하여 Dim 변수의 데이터 형식 및 변수에 액세스할 수 있는 코드와 같은 기타 정보를 결정합니다. 다음 예제에서는 값을 보유할 변수를 선언합니다 Integer .

Dim numberOfStudents As Integer

열거형, 구조체, 클래스 또는 인터페이스의 이름 또는 데이터 형식을 지정할 수 있습니다.

Dim finished As Boolean
Dim monitorBox As System.Windows.Forms.Form

참조 형식의 경우 키워드를 New 사용하여 데이터 형식으로 지정된 클래스 또는 구조체의 새 인스턴스를 만듭니다. 사용하는 New경우 이니셜라이저 식을 사용하지 않습니다. 대신 필요한 경우 변수를 만드는 클래스의 생성자에 인수를 입력합니다.

Dim bottomLabel As New System.Windows.Forms.Label

프로시저, 블록, 클래스, 구조체 또는 모듈에서 변수를 선언할 수 있습니다. 소스 파일, 네임스페이스 또는 인터페이스에서 변수를 선언할 수 없습니다. 자세한 내용은 선언 컨텍스트 및 기본 액세스 수준을 참조하세요.

프로시저 외부의 모듈 수준에서 선언된 변수는 멤버 변수 또는 필드입니다. 멤버 변수는 클래스, 구조 또는 모듈 전체의 범위에 있습니다. 프로시저 수준에서 선언된 변수는 지역 변수입니다. 지역 변수는 프로시저 또는 블록 내에서만 범위에 있습니다.

다음 액세스 한정자는 프로시저 PublicProtected FriendProtectedFriendPrivate외부에서 변수를 선언하는 데 사용됩니다. 자세한 내용은 Visual Basic 액세스 수준을 참조하세요.

키워드는 Dim 선택 사항이며, 다음 한정자를 ProtectedStaticReadOnlyPublicProtected FriendWithEventsFriendPrivateSharedShadows지정하는 경우 일반적으로 생략됩니다.

Public maximumAllowed As Double
Protected Friend currentUserName As String
Private salary As Decimal
Static runningTotal As Integer

설정(기본값)이면 Option Explicit 컴파일러에 사용하는 모든 변수에 대한 선언이 필요합니다. 자세한 내용은 Option Explicit 문을 참조하세요.

초기 값 지정

변수를 만들 때 변수에 값을 할당할 수 있습니다. 값 형식의 경우 이니셜라이저 를 사용하여 변수에 할당할 식을 제공할 수 있습니다. 식은 컴파일 시간에 계산할 수 있는 상수로 계산되어야 합니다.

Dim quantity As Integer = 10
Dim message As String = "Just started"

이니셜라이저가 지정되고 데이터 형식이 절에 As 지정되지 않은 경우 형식 유추 를 사용하여 이니셜라이저에서 데이터 형식을 유추합니다. 다음 예제에서는 둘 다 num1num2 정수로 강력하게 입력됩니다. 두 번째 선언에서 형식 유추는 값 3의 형식을 유추합니다.

' Use explicit typing.
Dim num1 As Integer = 3

' Use local type inference.
Dim num2 = 3

형식 유추는 프로시저 수준에서 적용됩니다. 클래스, 구조체, 모듈 또는 인터페이스의 프로시저 외부에는 적용되지 않습니다. 형식 유추에 대한 자세한 내용은 Option Infer 문로컬 형식 유추를 참조하세요.

데이터 형식 또는 이니셜라이저를 지정하지 않은 경우 발생하는 작업에 대한 자세한 내용은 이 항목의 뒷부분에 있는 기본 데이터 형식 및 값을 참조하세요.

개체 이니셜라이저를 사용하여 명명된 형식과 익명 형식의 인스턴스를 선언할 수 있습니다. 다음 코드는 클래스의 인스턴스를 Student 만들고 개체 이니셜라이저를 사용하여 속성을 초기화합니다.

Dim student1 As New Student With {.First = "Michael",
                                  .Last = "Tucker"}

개체 이니셜라이저에 대한 자세한 내용은 방법: 개체 이니셜라이저를 사용하여 개체 선언, 개체 이니셜라이저: 명명된 형식 및 익명 형식익명 형식을 참조하세요.

여러 변수 선언

하나의 선언 문에서 여러 변수를 선언하고, 각 변수의 변수 이름을 지정하고, 각 배열 이름을 괄호로 따라 지정할 수 있습니다. 여러 변수는 쉼표로 구분됩니다.

Dim lastTime, nextTime, allTimes() As Date

둘 이상의 변수를 하나의 As 절로 선언하는 경우 해당 변수 그룹에 대한 이니셜라이저를 제공할 수 없습니다.

선언하는 각 변수에 대해 별도의 As 절을 사용하여 서로 다른 변수에 대해 서로 다른 데이터 형식을 지정할 수 있습니다. 각 변수는 해당 부분 다음에 발생한 첫 번째 As 절에 지정된 데이터 형식을 variablename 사용합니다.

Dim a, b, c As Single, x, y As Double, i As Integer
' a, b, and c are all Single; x and y are both Double

배열

여러 값을 보유할 수 있는 배열을 보유할 변수를 선언할 수 있습니다. 변수가 배열을 보유하도록 지정하려면 괄호를 사용하여 바로 뒤에 variablename 옵니다. 배열에 대한 자세한 내용은 배열을 참조하세요.

배열의 각 차원의 하한과 상한을 지정할 수 있습니다. 이렇게 하려면 괄호 안을 포함합니다 boundslist . 각 차원에 대해 boundslist 상한과 선택적으로 하한을 지정합니다. 지정 여부에 관계없이 하한은 항상 0입니다. 각 인덱스 범위는 0부터 상한값까지 다양할 수 있습니다.

다음 두 문은 동일합니다. 각 문은 21 Integer 개 요소의 배열을 선언합니다. 배열에 액세스하면 인덱스가 0에서 20까지 달라질 수 있습니다.

Dim totals(20) As Integer
Dim totals(0 To 20) As Integer

다음 문은 형식 Double의 2차원 배열을 선언합니다. 배열에는 각각 6개 열(5+ 1)의 4개 행(3 + 1)이 있습니다. 상한은 차원의 길이가 아니라 인덱스에 대해 가능한 가장 높은 값을 나타냅니다. 차원의 길이는 상한과 1입니다.

Dim matrix2(3, 5) As Double

배열의 크기는 1~32개일 수 있습니다.

배열 선언에서 모든 범위를 비워 둘 수 있습니다. 이렇게 하면 배열에 지정한 차원 수가 있지만 초기화되지 않습니다. 최소한 일부 요소를 초기화할 때까지의 값 Nothing 이 있습니다. 문은 Dim 모든 차원 또는 차원에 대한 경계를 지정해야 합니다.

' Declare an array with blank array bounds.
Dim messages() As String
' Initialize the array.
ReDim messages(4)

배열에 둘 이상의 차원이 있는 경우 차원 수를 나타내기 위해 괄호 사이에 쉼표가 포함되어야 합니다.

Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte

배열의 차원 중 하나를 -1로 선언하여 길이가 0 인 배열을 선언할 수 있습니다. 길이가 0인 배열을 보유하는 변수에 값 Nothing이 없습니다. 길이가 0인 배열은 특정 공용 언어 런타임 함수에 필요합니다. 이러한 배열에 액세스하려고 하면 런타임 예외가 발생합니다. 자세한 내용은 배열을 참조하세요.

배열 리터럴을 사용하여 배열 값을 초기화할 수 있습니다. 이렇게 하려면 초기화 값을 중괄호({})로 묶습니다.

Dim longArray() As Long = {0, 1, 2, 3}

다차원 배열의 경우 각 개별 차원의 초기화는 외부 차원의 중괄호로 묶입니다. 요소는 행 주 순서로 지정됩니다.

Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}

배열 리터럴에 대한 자세한 내용은 배열을 참조 하세요.

기본 데이터 형식 및 값

다음 테이블에는 Dim 문에서 데이터 형식과 이니셜라이저를 지정하는 다양한 조합의 결과에 대한 설명이 나와 있습니다.

데이터 형식 지정 여부 이니셜라이저 지정 여부 예제 결과
아니요 Dim qty Option Strict가 꺼져 있으면(기본값) 변수가 .로 Nothing설정됩니다.

Option Strict가 on이면 컴파일 시간 오류가 발생합니다.
Dim qty = 5 옵션 유추가 켜진 경우(기본값) 변수는 이니셜라이저의 데이터 형식을 사용합니다. 로컬 형식 유추를 참조하세요.

Option Infer가 off이고 Option Strict고 off이면 변수가 Object의 데이터 형식을 사용합니다.

Option Infer가 off이고 Option Strict는 on이면 컴파일 시간 오류가 발생합니다.
Dim qty As Integer 변수는 데이터 형식의 기본값으로 초기화됩니다. 이 섹션의 뒷부분에 있는 표를 참조하세요.
Dim qty As Integer = 5 이니셜라이저의 데이터 형식을 지정한 데이터 형식으로 변환할 수 없으면 컴파일 시간 오류가 발생합니다.

데이터 형식을 지정하지만 이니셜라이저를 지정하지 않으면 Visual Basic 변수를 해당 데이터 형식의 기본값으로 초기화합니다. 다음 표에는 기본 초기화 값이 표시됩니다.

데이터 형식 기본값
모든 숫자 형식(포함 ByteSByte) 0
Char 이진 0
모든 참조 형식(, 및 모든 배열 포함ObjectString) Nothing
Boolean False
Date 1년 1월 1일 오전 12:00(01/01/0001 오전 12:00:00)

구조체의 각 요소는 별도의 변수인 것처럼 초기화됩니다. 배열의 길이를 선언하지만 해당 요소를 초기화하지 않으면 각 요소가 별도의 변수인 것처럼 초기화됩니다.

정적 지역 변수 수명

Static 지역 변수는 선언된 프로시저보다 수명이 더 깁니다. 변수 수명 경계는 프로시저가 선언된 위치와 변수인지 여부에 Shared따라 달라집니다.

프로시저 선언 초기화된 변수 변수가 기존을 중지합니다.
모듈에서 프로시저를 처음 호출할 때 프로그램 실행이 중지되는 경우
클래스 또는 구조체에서 프로시저는 Shared 프로시저가 특정 인스턴스 또는 클래스 또는 구조체 자체에서 처음 호출되는 경우 프로그램 실행이 중지되는 경우
클래스 또는 구조에서 프로시저는 Shared 프로시저가 특정 인스턴스에서 처음 호출되는 경우 GC(가비지 수집)에 대해 인스턴스가 해제된 경우

특성 및 한정자

지역 변수가 아닌 멤버 변수에만 특성을 적용할 수 있습니다. 특성은 로컬 변수와 같은 임시 스토리지에 의미가 없는 어셈블리의 메타데이터에 정보를 제공합니다.

모듈 수준에서는 한정자를 사용하여 Static 멤버 변수를 선언할 수 없습니다. 프로시저 수준에서는 , Shadows, ReadOnlyWithEvents또는 액세스 한정자를 사용하여 Shared지역 변수를 선언할 수 없습니다.

를 제공하여 accessmodifier변수에 액세스할 수 있는 코드를 지정할 수 있습니다. 클래스 및 모듈 멤버 변수(프로시저 외부)는 기본적으로 프라이빗 액세스로, 구조체 멤버 변수는 기본적으로 공용 액세스로 설정됩니다. 액세스 한정자를 사용하여 액세스 수준을 조정할 수 있습니다. 프로시저 내의 지역 변수에는 액세스 한정자를 사용할 수 없습니다.

프로시저 내의 지역 변수가 아닌 멤버 변수에만 지정할 WithEvents 수 있습니다. 지정 WithEvents하는 경우 변수의 데이터 형식은 .가 아닌 Object특정 클래스 형식이어야 합니다. 를 사용하여 배열 WithEvents을 선언할 수 없습니다. 이벤트에 대한 자세한 내용은 이벤트를 참조하세요.

참고

클래스, 구조체 또는 모듈 외부의 코드는 해당 클래스, 구조체 또는 모듈의 이름으로 멤버 변수의 이름을 한정해야 합니다. 프로시저 또는 블록 외부의 코드는 해당 프로시저 또는 블록 내의 지역 변수를 참조할 수 없습니다.

관리되는 리소스 해제

.NET Framework 가비지 수집기는 추가 코딩 없이 관리되는 리소스를 삭제합니다. 그러나 가비지 수집기를 기다리는 대신 관리되는 리소스를 강제로 삭제할 수 있습니다.

클래스가 특히 중요하고 부족한 리소스(예: 데이터베이스 연결 또는 파일 핸들)를 보유하는 경우 다음 가비지 수집이 더 이상 사용되지 않는 클래스 인스턴스를 정리할 때까지 기다리지 않을 수 있습니다. 클래스는 가비지 IDisposable 수집 전에 리소스를 해제하는 방법을 제공하기 위해 인터페이스를 구현할 수 있습니다. 해당 인터페이스를 구현하는 클래스는 중요한 리소스를 Dispose 즉시 해제하도록 호출할 수 있는 메서드를 노출합니다.

이 문은 Using 리소스를 획득하고, 문 집합을 실행한 다음, 리소스를 삭제하는 프로세스를 자동화합니다. 그러나 리소스는 인터페이스를 IDisposable 구현해야 합니다. 자세한 내용은 using 문을 참조하세요.

예 1

다음 예제에서는 다양한 옵션과 함께 문을 사용하여 변수를 Dim 선언합니다.

' Declare and initialize a Long variable.
Dim startingAmount As Long = 500

' Declare a variable that refers to a Button object,
' create a Button object, and assign the Button object
' to the variable.
Dim switchButton As New System.Windows.Forms.Button

' Declare a local variable that always retains its value,
' even after its procedure returns to the calling code.
Static totalSales As Double

' Declare a variable that refers to an array.
Dim highTemperature(31) As Integer

' Declare and initialize an array variable that
' holds four Boolean check values.
Dim checkValues() As Boolean = {False, False, True, False}

예제 2

다음 예제에서는 1에서 30 사이의 소수를 나열합니다. 지역 변수의 범위는 코드 주석에 설명되어 있습니다.

Public Sub ListPrimes()
    ' The sb variable can be accessed only
    ' within the ListPrimes procedure.
    Dim sb As New System.Text.StringBuilder()

    ' The number variable can be accessed only
    ' within the For...Next block.  A different
    ' variable with the same name could be declared
    ' outside of the For...Next block.
    For number As Integer = 1 To 30
        If CheckIfPrime(number) = True Then
            sb.Append(number.ToString & " ")
        End If
    Next

    Debug.WriteLine(sb.ToString)
    ' Output: 2 3 5 7 11 13 17 19 23 29
End Sub


Private Function CheckIfPrime(ByVal number As Integer) As Boolean
    If number < 2 Then
        Return False
    Else
        ' The root and highCheck variables can be accessed
        ' only within the Else block.  Different variables
        ' with the same names could be declared outside of
        ' the Else block.
        Dim root As Double = Math.Sqrt(number)
        Dim highCheck As Integer = Convert.ToInt32(Math.Truncate(root))

        ' The div variable can be accessed only within
        ' the For...Next block.
        For div As Integer = 2 To highCheck
            If number Mod div = 0 Then
                Return False
            End If
        Next

        Return True
    End If
End Function

예제 3

다음 예제에서는 변수가 speedValue 클래스 수준에서 선언됩니다. Private 키워드는 변수를 선언하는 데 사용됩니다. 변수는 클래스의 모든 프로시저에서 Car 액세스할 수 있습니다.

' Create a new instance of a Car.
Dim theCar As New Car()
theCar.Accelerate(30)
theCar.Accelerate(20)
theCar.Accelerate(-5)

Debug.WriteLine(theCar.Speed.ToString)
' Output: 45
Public Class Car
    ' The speedValue variable can be accessed by
    ' any procedure in the Car class.
    Private speedValue As Integer = 0

    Public ReadOnly Property Speed() As Integer
        Get
            Return speedValue
        End Get
    End Property

    Public Sub Accelerate(ByVal speedIncrease As Integer)
        speedValue += speedIncrease
    End Sub
End Class

추가 정보