선언된 요소 참조(Visual Basic)

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

컴파일러는 가장 좁은 범위를 사용하여 이름 선언에 대한 이름 참조를 일치시키려고 시도합니다. 즉, 참조를 만드는 코드로 시작하여 포함하는 요소의 연속적인 수준을 통해 바깥쪽으로 작업합니다.

다음 예에서는 이름이 같은 두 변수에 대한 참조를 보여 줍니다. 이 예에서는 모듈 container의 서로 다른 범위 수준에서 각각 이름이 totalCount인 두 개의 변수를 선언합니다. showCount 프로시저가 한정 없이 totalCount를 표시하면 Visual Basic 컴파일러는 범위가 가장 좁은 선언, 즉 showCount 내부의 로컬 선언에 대한 참조를 확인합니다. 포함 모듈 containertotalCount를 한정하면 컴파일러는 더 넓은 범위로 선언에 대한 참조를 확인합니다.

' 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. 대상 요소의 위치를 기반으로 한정 경로를 결정합니다. 가장 높은 수준의 네임스페이스에서 시작하여 가장 낮은 수준의 네임스페이스로 진행하고 대상 요소가 포함된 모듈, 클래스 또는 구조체로 끝납니다. 경로의 각 요소는 그 뒤에 오는 요소를 포함해야 합니다.

    outerSpaceinnerSpaceholdsTotalstotals

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

기타 포함하는 요소의 멤버

다른 클래스나 구조체의 비공유 멤버를 사용하는 경우 먼저 클래스나 구조체의 인스턴스를 가리키는 변수나 식을 사용하여 멤버 이름을 한정해야 합니다. 다음 예에서 demoClassclass1이라는 클래스의 인스턴스입니다.

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

클래스 이름 자체를 사용하여 공유되지 않은 멤버를 한정할 수는 없습니다. 먼저 개체 변수(이 경우 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 요소를 사용하려면 먼저 해당 프로젝트의 어셈블리 또는 형식 라이브러리에 대한 참조를 설정해야 합니다. 참조를 설정하려면 프로젝트 메뉴에서 참조 추가를 클릭하거나 -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 문은 가져온 각 네임스페이스에 대해 가져오기 별칭을 정의할 수 있습니다. 이렇게 하면 소스 코드가 더 짧아지고 읽기 쉬워집니다. 다음 예에서는 xDSystem.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의 섀도잉을 참조하세요.

참고 항목