선언된 요소 참조(Visual Basic)

코드에서 선언된 요소를 참조하는 경우 Visual Basic 컴파일러에서는 참조 이름을 그에 해당하는 선언과 일치시킵니다. 둘 이상의 요소가 같은 이름으로 선언된 경우 요소 이름을 한정하여 참조할 요소를 제어할 수 있습니다.

컴파일러에서는 가장 좁은 범위에서 이름 참조와 일치하는 이름 선언을 찾습니다. 즉, 참조하는 코드에서부터 바깥쪽으로 진행하여 해당 코드를 포함하는 요소의 다음 수준을 차례로 찾습니다.

다음 예제에서는 이름이 같은 두 변수에 대한 참조를 보여 줍니다. 위 예제에서는 container 모듈의 서로 다른 범위 수준에 totalCount라는 변수를 두 개 선언합니다. showCount 프로시저가 한정되지 않은 totalCount를 표시할 때 Visual Basic 컴파일러에서는 해당 참조를 가장 좁은 범위의 선언, 즉 showCount 내의 지역 선언으로 확인합니다. 포함하는 모듈인 container로 totalCount를 한정하면 컴파일러에서는 해당 참조를 더 넓은 범위의 선언으로 확인합니다.

' Assume these two modules are both in the same assembly.
Module container
    Public totalCount As Integer = 1
    Public Sub showCount()
        Dim totalCount As Integer = 6000
        ' The following statement displays the local totalCount (6000).
        MsgBox("Unqualified totalCount is " & CStr(totalCount))
        ' The following statement displays the module's totalCount (1).
        MsgBox("container.totalCount is " & CStr(container.totalCount))
    End Sub
End Module
Module callingModule
    Public Sub displayCount()
        container.showCount()
        ' The following statement displays the containing module's totalCount (1).
        MsgBox("container.totalCount is " & CStr(container.totalCount))
    End Sub
End Module

요소 이름 한정

이 검색 프로세스를 재정의하고 더 넓은 범위에 선언된 이름을 지정하려면 더 넓은 범위의 포함하는 요소로 이름을 한정해야 합니다. 경우에 따라 포함하는 요소를 한정해야 할 수도 있습니다.

소스 문의 이름 앞에 대상 요소가 정의된 위치에 대한 식별 정보를 추가하면 이름이 한정됩니다. 이 정보를 한정 문자열이라고 합니다. 한정 문자열에는 하나 이상의 네임스페이스와 모듈, 클래스 또는 구조체 이름이 포함될 수 있습니다.

한정 문자열은 대상 요소가 들어 있는 모듈, 클래스 또는 구조체를 명확하게 지정해야 합니다. 또한 이 컨테이너는 다른 포함 요소(일반적으로 네임스페이스)에 포함되어 있을 수 있습니다. 따라서 한정 문자열에 여러 개의 포함 요소를 추가해야 할 수 있습니다.

이름을 한정하여 선언된 요소에 액세스하려면

  1. 요소가 정의된 위치를 확인합니다. 여기에는 네임스페이스 또는 네임스페이스의 계층 구조가 포함될 수 있습니다. 요소는 최하위 수준 네임스페이스 내에서 모듈, 클래스 또는 구조체에 포함되어야 합니다.

    ' Assume the following hierarchy exists outside your code.
    Namespace outerSpace
        Namespace innerSpace
            Module holdsTotals
                Public Structure totals
                    Public thisTotal As Integer
                    Public Shared grandTotal As Long
                End Structure
            End Module
        End Namespace
    End Namespace
  2. 대상 요소의 위치를 기준으로 한정 경로를 확인합니다. 최상위 수준 네임스페이스에서 시작하여 최하위 수준 네임스페이스로 진행하고 대상 요소가 들어 있는 모듈, 클래스 또는 구조체로 끝냅니다. 경로의 각 요소에는 그 다음에 나오는 요소가 포함되어 있어야 합니다.

    outerSpace → innerSpace → holdsTotals → totals

  3. 대상 요소에 대한 한정 문자열을 준비합니다. 경로의 모든 요소 뒤에 마침표(.)를 추가합니다. 응용 프로그램에서 한정 문자열의 모든 요소에 액세스할 수 있어야 합니다.

    outerSpace.innerSpace.holdsTotals.totals.
  4. 대상 요소를 참조하는 식 또는 대입문을 일반적인 방식으로 작성합니다.

    grandTotal = 9000
  5. 대상 요소 이름 앞에 한정 문자열을 추가합니다. 이 이름은 요소가 들어 있는 모듈, 클래스 또는 구조체 뒤의 마침표(.) 바로 뒤에 와야 합니다.

    ' Assume the following module is part of your code.
    Module accessGrandTotal
        Public Sub setGrandTotal()
            outerSpace.innerSpace.holdsTotals.totals.grandTotal = 9000
        End Sub
    End Module
  6. 컴파일러에서는 한정 문자열을 사용하여 대상 요소 참조와 일치시킬 수 있는 명확하고 모호하지 않은 선언을 찾습니다.

응용 프로그램에서 이름이 같은 둘 이상의 프로그래밍 요소에 액세스할 경우에는 이름 참조를 한정해야 할 수도 있습니다. 예를 들어, System.Windows.FormsSystem.Web.UI.WebControls 네임스페이스에는 모두 Label 클래스(System.Windows.Forms.LabelSystem.Web.UI.WebControls.Label)가 포함되어 있습니다. 응용 프로그램이 두 네임스페이스를 모두 사용하거나 고유의 Label 클래스를 정의하는 경우 각 Label 개체를 구별해야 합니다. 이 경우 변수 선언에 네임스페이스나 가져오기 별칭을 포함합니다. 다음 예제에서는 가져오기 별칭을 사용합니다.

' The following statement must precede all your declarations.
Imports win = System.Windows.Forms, web = System.Web.UI.WebControls
' The following statement references the Windows.Forms.Label class.
Dim winLabel As New win.Label()

다른 포함하는 요소의 멤버

다른 클래스나 구조체의 비공유 멤버를 사용하려면 먼저 이 클래스 또는 구조체의 인스턴스를 가리키는 변수나 식으로 멤버 이름을 한정해야 합니다. 다음 예제에서 demoClass는 class1이라는 클래스의 인스턴스입니다.

Dim demoClass As class1 = New class1()
demoClass.someSub[(argumentlist)]

클래스 이름 자체를 사용하여 Shared(Visual Basic)가 아닌 멤버를 한정할 수는 없습니다. 먼저 개체 변수(이 경우 demoClass)에 인스턴스를 만든 다음 해당 인스턴스를 변수 이름으로 참조해야 합니다.

클래스 또는 구조체에 Shared 멤버가 있는 경우, 클래스 또는 구조체 이름이나 인스턴스를 가리키는 변수 또는 식으로 해당 멤버를 한정할 수 있습니다.

모듈에는 별도의 인스턴스가 없으며 모든 모듈 멤버가 기본적으로 Shared가 됩니다. 따라서 모듈 멤버는 모듈 이름으로 한정합니다.

다음 예제에서는 모듈 멤버 프로시저에 대한 한정된 참조를 보여 줍니다. 앞의 예제에서는 프로젝트의 서로 다른 모듈에 perform이라는 Sub 프로시저를 각각 선언합니다. 각 프로시저가 속한 모듈 내에서는 프로시저를 한정자 없이 지정할 수 있지만 다른 위치에서 참조할 경우에는 한정해야 합니다. module3의 마지막 참조에서는 perform을 한정하지 않았으므로 컴파일러에서 해당 참조를 확인할 수 없습니다.

' Assume these three modules are all in the same assembly.
Module module1
    Public Sub perform()
        MsgBox("module1.perform() now returning")
    End Sub
End Module
Module module2
    Public Sub perform()
        MsgBox("module2.perform() now returning")
    End Sub
    Public Sub doSomething()
        ' The following statement calls perform in module2, the active module.
        perform()
        ' The following statement calls perform in module1.
        module1.perform()
    End Sub
End Module
Module module3
    Public Sub callPerform()
        ' The following statement calls perform in module1.
        module1.perform()
        ' The following statement makes an unresolvable name reference
        ' and therefore generates a COMPILER ERROR.
        perform() ' INVALID statement
    End Sub
End Module

프로젝트에 대한 참조

다른 프로젝트에서 정의된 Public(Visual Basic) 문을 사용하려면 먼저 해당 프로젝트의 어셈블리 또는 형식 라이브러리에 대한 참조를 설정해야 합니다. 참조를 설정하려면 프로젝트 메뉴에서 참조 추가를 클릭하거나 /reference(Visual Basic) 명령줄 컴파일러 옵션을 사용합니다.

예를 들어, .NET Framework의 XML 개체 모델을 사용할 수 있습니다. System.Xml 네임스페이스에 대한 참조를 설정하면 이 네임스페이스의 XmlDocument를 비롯한 모든 클래스를 선언하고 사용할 수 있습니다. 다음 예제에서는 XmlDocument를 사용합니다.

' Assume this project has a reference to System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As System.Xml.XmlDocument

포함하는 요소 가져오기

Imports 문(.NET 네임스페이스 및 형식)을 사용하여 사용할 모듈이나 클래스를 포함하고 있는 네임스페이스를 가져올 수 있습니다. 이렇게 하면 이름을 정규화하지 않고도 가져온 네임스페이스에 정의된 요소를 참조할 수 있습니다. 위 예제를 다시 작성한 아래 예제에서는 System.Xml 네임스페이스를 가져옵니다.

' Assume this project has a reference to System.Xml
' The following statement must precede all your declarations.
Imports System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As XmlDocument

또한 Imports 문에서는 가져온 네임스페이스 각각에 대해 가져오기 별칭을 정의할 수 있습니다. 가져오기 별칭을 사용하면 소스 코드를 더욱 짧고 읽기 쉽게 만들 수 있습니다. 위 예제를 다시 작성한 아래 예제에서는 xD를 System.Xml 네임스페이스의 별칭으로 사용합니다.

' Assume this project has a reference to System.Xml
' The following statement must precede all your declarations.
Imports xD = System.Xml
' The following statement creates xDoc as an XML document object.
Dim xDoc As xD.XmlDocument

Imports 문으로 응용 프로그램에서 다른 프로젝트의 요소를 사용할 수 있게 만들 수는 없습니다. 즉 이 문을 참조 설정 대신 사용할 수 없습니다. 그러나 네임스페이스를 가져오면 해당 네임스페이스에서 정의된 이름을 한정할 필요는 없습니다.

Imports 문을 사용하면 모듈, 클래스, 구조체 및 열거형을 가져와서 가져온 요소의 멤버를 한정자 없이 사용할 수 있습니다. 그러나 클래스와 구조체의 비공유 멤버는 반드시 해당 클래스 또는 구조체의 인스턴스를 가리키는 변수나 식을 사용하여 한정해야 합니다.

명명 지침

둘 이상의 프로그래밍 요소를 같은 이름으로 정의하는 경우 컴파일러에서 이 이름에 대한 참조를 확인하려 할 때 이름 모호성이 발생할 수 있습니다. 범위에 둘 이상의 정의가 있거나 정의가 없는 경우에는 참조를 확인할 수 없습니다. 이 작업에 대한 예제를 보려면 이 도움말 페이지의 "한정된 참조 예제"를 참조하십시오.

모든 요소에 고유의 이름을 부여하여 이름 모호성을 방지할 수 있습니다. 이렇게 하면 네임스페이스, 모듈 또는 클래스를 사용하여 요소 이름을 한정하지 않고도 모든 요소를 참조할 수 있습니다. 또한 실수로 잘못된 요소를 참조할 가능성도 줄일 수 있습니다.

숨김

두 프로그래밍 요소가 같은 이름을 공유하는 경우 두 요소 중 하나가 나머지 요소를 숨길 수 있습니다. 숨겨진 요소는 참조할 수 없습니다. 대신, 코드에서 숨겨진 요소 이름을 사용할 경우 Visual Basic 컴파일러에서 해당 요소는 숨기는 요소로 확인됩니다. 자세한 내용 및 예제는 Visual Basic의 숨김 기능을 참조하십시오.

참고 항목

작업

방법: 프로젝트 속성 및 구성 설정 수정

참조

Imports 문(.NET 네임스페이스 및 형식)

New 연산자(Visual Basic)

Public(Visual Basic)

개념

선언된 요소 이름(Visual Basic)

선언된 요소 특성(Visual Basic)

Visual Basic의 변수