여러 변수의 이름이 같은 경우의 참조 확인
업데이트: 2007년 11월
컴파일러에서는 이름 참조와 일치하는 이름 선언을 찾을 때 가장 좁은 범위에서 일치하는 선언을 찾습니다. 즉, 참조하는 코드에서부터 바깥쪽으로 진행하여 해당 코드를 포함하는 요소의 다음 수준을 차례로 찾습니다.
이 검색 프로세스를 재정의하고 더 넓은 범위에 선언된 이름을 지정하려면 더 넓은 범위의 포함하는 요소로 이름을 한정해야 합니다. 경우에 따라 포함하는 요소를 한정해야 할 수도 있습니다. 이름 한정에 대한 자세한 내용은 방법: 선언된 요소 이름 한정을 참조하십시오.
응용 프로그램에서 이름이 같은 둘 이상의 프로그래밍 요소에 액세스할 경우에는 이름 참조를 한정해야 할 수도 있습니다. 이 작업에 대한 예제를 보려면 이 도움말 페이지의 "이름이 같은 클래스"와 방법: 이름이 같은 두 요소 구별을 참조하십시오.
가장 좁은 범위
다음 예제에서는 이름이 같은 두 변수에 대한 참조를 보여 줍니다.
' 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
위 예제에서는 container 모듈의 서로 다른 범위 수준에 totalCount라는 변수를 두 개 선언합니다. showCount 프로시저가 한정되지 않은 totalCount를 표시할 때 Visual Basic 컴파일러에서는 해당 참조를 가장 좁은 범위의 선언, 즉 showCount 내의 지역 선언으로 확인합니다. 포함하는 모듈인 container로 totalCount를 한정하면 컴파일러에서는 해당 참조를 더 넓은 범위의 선언으로 확인합니다.
다른 포함하는 요소의 멤버
다른 클래스나 구조체의 비공유 멤버를 사용하려면 먼저 이 클래스 또는 구조체의 인스턴스를 가리키는 변수나 식으로 멤버 이름을 한정해야 합니다. 다음 예제에서 demoClass는 class1이라는 클래스의 인스턴스입니다.
Dim demoClass As class1 = New class1()
demoClass.someSub[(argumentlist)]
클래스 이름 자체를 사용하여 Shared(Visual Basic)가 아닌 멤버를 한정할 수는 없습니다. 먼저 개체 변수(이 경우 demoClass)에 인스턴스를 만든 다음 해당 인스턴스를 변수 이름으로 참조해야 합니다.
클래스 또는 구조체에 Shared 멤버가 있는 경우, 클래스 또는 구조체 이름이나 인스턴스를 가리키는 변수 또는 식으로 해당 멤버를 한정할 수 있습니다.
모듈에는 별도의 인스턴스가 없으며 모든 모듈 멤버가 기본적으로 Shared가 됩니다. 따라서 모듈 멤버는 모듈 이름으로 한정합니다.
한정된 참조 예제
다음 예제에서는 모듈 멤버 프로시저에 대한 한정된 참조를 보여 줍니다.
' 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
위 예제에서는 프로젝트의 서로 다른 모듈에 perform이라는 Sub 프로시저를 각각 선언합니다. 각 프로시저가 속한 모듈 내에서는 프로시저를 한정자 없이 지정할 수 있지만 다른 위치에서 참조할 경우에는 한정해야 합니다. module3의 마지막 참조에서는 perform을 한정하지 않았으므로 컴파일러에서 해당 참조를 확인할 수 없습니다.
프로젝트에 대한 참조
다른 프로젝트에서 정의된 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 문을 사용하면 모듈, 클래스, 구조체 및 열거형을 가져와서 가져온 요소의 멤버를 한정자 없이 사용할 수 있습니다. 그러나 클래스와 구조체의 비공유 멤버는 반드시 해당 클래스 또는 구조체의 인스턴스를 가리키는 변수나 식을 사용하여 한정해야 합니다.
이름이 같은 클래스
개체의 새 인스턴스를 만드는 경우 클래스가 속한 네임스페이스 또는 형식 라이브러리를 통해 클래스를 한정해야 합니다. 예를 들어, System.Windows.Forms 및 System.Web.UI.WebControls 네임스페이스에는 모두 Label 클래스(System.Windows.Forms.Label과 System.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()
명명 지침
둘 이상의 프로그래밍 요소를 같은 이름으로 정의하는 경우 컴파일러에서 이 이름에 대한 참조를 확인하려 할 때 이름 모호성이 발생할 수 있습니다. 범위에 둘 이상의 정의가 있거나 정의가 없는 경우에는 참조를 확인할 수 없습니다. 이 작업에 대한 예제를 보려면 이 도움말 페이지의 "한정된 참조 예제"를 참조하십시오.
모든 요소에 고유의 이름을 부여하여 이름 모호성을 방지할 수 있습니다. 이렇게 하면 네임스페이스, 모듈 또는 클래스를 사용하여 요소 이름을 한정하지 않고도 모든 요소를 참조할 수 있습니다. 또한 실수로 잘못된 요소를 참조할 가능성도 줄일 수 있습니다.