개체 변수 선언(Visual Basic)

개체 변수를 선언하는 데는 일반 선언문을 사용합니다. 데이터 형식에는 Object(Object 데이터 형식) 또는 개체를 만들 특정 클래스를 지정합니다.

변수를 Object로 선언하는 것은 변수를 System.Object로 선언하는 것과 같습니다.

특정 개체 클래스를 사용하여 변수를 선언하면 이 변수는 해당 클래스와 해당 클래스가 상속하는 클래스에서 노출하는 모든 메서드와 속성에 액세스할 수 있습니다. Object를 사용하여 변수를 선언할 경우 런타임에 바인딩할 수 있도록 Option Strict Off로 설정하지 않으면 이 변수는 Object 클래스의 멤버에만 액세스할 수 있습니다.

선언 구문

다음 구문을 사용하여 개체 변수를 선언합니다.

Dim variablename As [New] { objectclass | Object }

선언에 Public(Visual Basic), Protected(Visual Basic), Friend(Visual Basic), Protected Friend, Private(Visual Basic), Shared(Visual Basic) 또는 Static(Visual Basic)을 지정할 수도 있습니다. 다음은 유효한 선언의 예입니다.

Private objA As Object
Static objB As System.Windows.Forms.Label
Dim objC As System.OperatingSystem

런타임에 바인딩 및 초기 바인딩

코드가 실행되기 전까지 클래스를 구체적으로 알 수 없는 경우가 있습니다. 이런 경우에는 Object 데이터 형식을 사용하여 개체 변수를 선언해야 합니다. 이렇게 하면 모든 개체 형식에 대한 일반적인 참조가 만들어지고 런타임에 특정 클래스가 할당됩니다. 이러한 방식을 런타임에 바인딩이라고 합니다. 런타임에 바인딩을 수행하려면 추가 실행 시간이 필요합니다. 또한 코드에서 액세스할 수 있는 항목은 가장 최근에 할당된 클래스의 메서드 및 속성으로 제한됩니다. 따라서 코드에서 다른 클래스의 멤버에 액세스하려고 하면 런타임 오류가 발생할 수 있습니다.

컴파일 타임에 클래스를 구체적으로 알고 있으면 해당 클래스로 개체 변수를 선언해야 합니다. 이러한 방식을 초기 바인딩이라고 합니다. 초기 바인딩을 사용하면 성능이 향상되고 코드에서 특정 클래스의 모든 메서드 및 속성에 액세스할 수 있습니다. 앞의 예제 선언에 있는 objA 변수가 System.Windows.Forms.Label 클래스의 개체만 사용할 경우에는 선언에 As System.Windows.Forms.Label을 지정해야 합니다.

초기 바인딩의 장점

개체 변수를 특정 클래스로 선언하면 다음과 같은 장점이 있습니다.

  • 자동 형식 검사

  • 특정 클래스의 모든 멤버에 대한 액세스 보장

  • 코드 편집기에서 Microsoft IntelliSense 지원

  • 코드의 가독성 향상

  • 코드 오류 감소

  • 런타임 대신 컴파일 타임에 오류 catch

  • 빠른 코드 실행

개체 변수 멤버에 대한 액세스

Option Strict가 On으로 설정된 경우 개체 변수는 해당 변수가 선언된 클래스의 메서드 및 속성에만 액세스할 수 있습니다. 다음은 이에 대한 예입니다.

' Option statements must precede all other source file lines.
Option Strict On
' Imports statement must precede all declarations in the source file.
Imports System.Windows.Forms
Public Sub accessMembers()
    Dim p As Object
    Dim q As System.Windows.Forms.Label
    p = New System.Windows.Forms.Label
    q = New System.Windows.Forms.Label
    Dim j, k As Integer
    ' The following statement generates a compiler ERROR.
    j = p.Left
    ' The following statement retrieves the left edge of the label in pixels.
    k = q.Left
End Sub

이 예제에서 p는 Object 클래스 자체의 멤버만 사용할 수 있으므로 Left 속성을 포함하지 않습니다. 반면 q는 Label 형식으로 선언되었으므로 System.Windows.Forms 네임스페이스에 있는 Label 클래스의 모든 메서드 및 속성을 사용할 수 있습니다.

개체 변수의 융통성

상속 계층 구조에서 개체를 사용하는 경우 개체 변수를 선언하는 데 사용할 클래스를 선택할 수 있습니다. 클래스를 선택하는 경우 개체를 할당할 때의 융통성과 클래스 멤버에 대한 액세스를 모두 고려해야 합니다. 예를 들어, System.Windows.Forms.Form 클래스까지 이어지는 상속 계층 구조를 고려해 봅니다.

Object

    Component

      Control

        ScrollableControl

          ContainerControl

            Form

응용 프로그램이 Form 클래스에서 상속하는 specialForm이라는 폼 클래스를 정의할 경우 다음 예제와 같이 참조 대상을 specialForm으로 지정하여 개체 변수를 선언할 수 있습니다.

Public Class specialForm
    Inherits System.Windows.Forms.Form
    ' Insert code defining methods and properties of specialForm.
End Class
Dim nextForm As New specialForm

위 예제의 선언에서는 변수 nextForm을 specialForm 클래스의 개체로 제한하지만, specialForm의 모든 메서드 및 속성뿐 아니라 specialForm이 상속하는 모든 클래스의 모든 멤버도 nextForm에서 사용할 수 있도록 합니다.

다음 예제와 같이 개체 변수를 Form 형식으로 선언하면 보다 일반적인 개체 변수를 만들 수 있습니다.

Dim anyForm As System.Windows.Forms.Form

이 예제와 같이 선언하면 응용 프로그램의 폼을 anyForm에 할당할 수 있습니다. 그러나 anyForm은 Form 클래스의 모든 멤버에 액세스할 수 있지만 specialForm과 같은 특정 폼에 정의된 추가 메서드나 속성은 사용할 수 있습니다.

파생 클래스에서는 기본 클래스의 모든 멤버를 사용할 수 있지만 기본 클래스에서는 파생 클래스의 추가 멤버를 사용할 수 없습니다.

참고 항목

작업

방법: Visual Basic에서 개체 변수 선언 및 개체 변수에 개체 할당

방법: 개체의 멤버에 액세스(Visual Basic)

참조

New 연산자(Visual Basic)

Option Strict 문

개념

Visual Basic의 개체 변수

개체 변수 할당(Visual Basic)

개체 변수 값(Visual Basic)

Visual Basic의 형식 없는 프로그래밍

지역 형식 유추(Visual Basic)