Dim 문(Visual Basic)

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

구문

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

부분

  • attributelist

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

  • accessmodifier

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

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

  • Shared

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

  • Shadows

    선택 사항. Shadows를 참조하세요.

  • Static

    선택 사항. 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

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

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

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

Dim 키워드는 선택 사항이며 Public, Protected, Friend, Protected Friend, Private, Shared, Shadows, Static, ReadOnly 또는 WithEvents 한정자를 지정할 경우 일반적으로 생략됩니다.

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 절을 사용하여 다양한 변수에 대해 다양한 데이터 형식을 지정할 수 있습니다. 각 변수는 해당 variablename 부분 다음에 발생한 첫 번째 As 절에 지정된 데이터 형식을 사용합니다.

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차원 배열을 선언합니다. 배열에는 4개 행(3+1)과 6개 열(5+ 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가 off(기본값)이면 변수는 Nothing으로 설정됩니다.

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

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
모든 참조 형식(Object, String 및 모든 배열 포함) Nothing
Boolean False
Date 1년 1월 1일 오전 12:00(01/01/0001 오전 12:00:00)

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

정적 지역 변수 수명

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

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

특성 및 한정자

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

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

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 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

참고 항목