네임스페이스는 어셈블리에 정의된 개체를 구성합니다. 어셈블리는 여러 네임스페이스를 포함할 수 있으며, 다른 네임스페이스를 포함할 수 있습니다. 네임스페이스는 클래스 라이브러리와 같은 큰 개체 그룹을 사용할 때 모호성을 방지하고 참조를 간소화합니다.
예를 들어, .NET Framework는 ListBox 네임스페이스에 System.Windows.Forms 클래스를 정의합니다. 다음 코드 조각에서는 이 클래스의 정규화된 이름을 사용하여 변수를 선언하는 방법을 보여 있습니다.
Dim LBox As System.Windows.Forms.ListBox
이름 충돌 방지
.NET Framework 네임스페이스는 클래스 라이브러리의 개발자가 다른 라이브러리에서 유사한 이름을 사용하는 데 방해가 되는 네임스페이스 오염이라고도 하는 문제를 해결합니다. 기존 구성 요소와의 이러한 충돌을 이름 충돌이라고도 합니다.
예를 들어 이름이 새 ListBox
클래스를 만드는 경우 자격 없이 프로젝트 내에서 사용할 수 있습니다. 그러나 동일한 프로젝트에서 .NET Framework ListBox 클래스를 사용하려면 정규화된 참조를 사용하여 참조를 고유하게 만들어야 합니다. 참조가 고유하지 않은 경우 Visual Basic은 이름이 모호하다는 오류를 생성합니다. 다음 코드 예제에서는 이러한 개체를 선언하는 방법을 보여 줍니다.
' Define a new object based on your ListBox class.
Dim LBC As New ListBox
' Define a new Windows.Forms ListBox control.
Dim MyLB As New System.Windows.Forms.ListBox
다음 그림에서는 두 개의 네임스페이스 계층을 보여 줍니다. 둘 다 이름이 지정된 ListBox
개체를 포함합니다.
기본적으로 Visual Basic으로 만드는 모든 실행 파일에는 프로젝트와 이름이 같은 네임스페이스가 포함됩니다. 예를 들어 프로젝트 ListBoxProject
내에서 개체를 정의하는 경우 실행 파일 ListBoxProject.exe 라는 ListBoxProject
네임스페이스가 포함됩니다.
여러 어셈블리는 동일한 네임스페이스를 사용할 수 있습니다. Visual Basic은 이를 단일 이름 집합으로 처리합니다. 예를 들어, SomeNameSpace
이라는 네임스페이스를 포함하는 어셈블리 Assemb1
에서 클래스를 정의하고, 어셈블리 Assemb2
에서 동일한 네임스페이스에 대한 추가 클래스를 정의할 수 있습니다.
정규화된 이름
정규화된 이름은 개체가 정의된 네임스페이스의 이름을 접두사로 사용하는 개체 참조입니다. 프로젝트 메뉴에서 참조 추가 를 선택하여 클래스에 대한 참조를 만든 다음 코드에서 개체의 정규화된 이름을 사용하는 경우 다른 프로젝트에 정의된 개체를 사용할 수 있습니다. 다음 코드 조각에서는 다른 프로젝트의 네임스페이스에서 개체에 대해 정규화된 이름을 사용하는 방법을 보여 있습니다.
Dim LBC As New ListBoxProject.Form1.ListBox
정규화된 이름은 컴파일러가 사용 중인 개체를 확인할 수 있도록 하기 때문에 명명 충돌을 방지합니다. 그러나 이름 자체는 길고 번거로울 수 있습니다. 이를 해결하려면 Imports
구문을 사용하여 전체 식별자 대신 사용할 수 있는 약어 이름인 별칭을 정의할 수 있습니다. 예를 들어 다음 코드 예제에서는 정규화된 두 이름에 대한 별칭을 만들고 이러한 별칭을 사용하여 두 개체를 정의합니다.
Imports LBControl = System.Windows.Forms.ListBox
Imports MyListBox = ListBoxProject.Form1.ListBox
Dim LBC As LBControl
Dim MyLB As MyListBox
별칭 없이 문을 사용하는 Imports
경우 프로젝트에 고유한 경우 정규화 없이 해당 네임스페이스의 모든 이름을 사용할 수 있습니다. 프로젝트에 동일한 이름이 포함된 항목을 가진 네임스페이스에 대한 Imports
문이 있는 경우, 해당 이름을 사용할 때 반드시 이름을 완전히 명시해야 합니다. 예를 들어 프로젝트에 다음 두 Imports
문이 포함되어 있다고 가정합니다.
' This namespace contains a class called Class1.
Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2
정규화하지 않고 Class1
를 사용하려고 하면 Visual Basic에서 이름 Class1
이(가) 모호하다는 오류 메시지가 표시됩니다.
네임스페이스 수준 문장
네임스페이스 내에서 모듈, 인터페이스, 클래스, 대리자, 열거형, 구조체 및 기타 네임스페이스와 같은 항목을 정의할 수 있습니다. 네임스페이스 수준에서 속성, 프로시저, 변수 및 이벤트와 같은 항목을 정의할 수 없습니다. 이러한 항목은 모듈, 구조체 또는 클래스와 같은 컨테이너 내에서 선언되어야 합니다.
정규 명칭 내의 글로벌 키워드
네임스페이스의 중첩 계층 구조를 정의한 경우 해당 계층 내의 코드가 .NET Framework의 네임스페이스에 액세스하지 System 못하도록 차단될 수 있습니다. 다음 예제는 SpecialSpace.System
네임스페이스가 System에 대한 액세스를 차단하는 계층 구조를 보여줍니다.
Namespace SpecialSpace
Namespace System
Class abc
Function getValue() As System.Int32
Dim n As System.Int32
Return n
End Function
End Class
End Namespace
End Namespace
따라서 System.Int32가 SpecialSpace.System
를 정의하지 않으므로 Visual Basic 컴파일러는 Int32
에 대한 참조를 성공적으로 확인할 수 없습니다. 키워드를 Global
사용하여 .NET Framework 클래스 라이브러리의 가장 바깥쪽 수준에서 정규화 체인을 시작할 수 있습니다. 이렇게 하면 클래스 라이브러리에서 System 네임스페이스 또는 다른 네임스페이스를 지정할 수 있습니다. 다음 예제에서는 이를 보여 줍니다.
Namespace SpecialSpace
Namespace System
Class abc
Function getValue() As Global.System.Int32
Dim n As Global.System.Int32
Return n
End Function
End Class
End Namespace
End Namespace
프로젝트에 연결된 네임스페이스뿐만 아니라 Global
과 같은 다른 루트 수준 네임스페이스에 액세스하기 위해 Microsoft.VisualBasic을 사용할 수 있습니다.
네임스페이스 선언에서 전역 키워드
Global
에서 키워드를 사용할 수도 있습니다. 이렇게 하면 프로젝트의 루트 네임스페이스에서 네임스페이스를 정의할 수 있습니다.
프로젝트의 모든 네임스페이스는 프로젝트의 루트 네임스페이스를 기반으로 합니다. Visual Studio는 프로젝트의 모든 코드에 대한 기본 루트 네임스페이스로 프로젝트 이름을 할당합니다. 예를 들어 프로젝트의 이름이 지정 ConsoleApplication1
되면 해당 프로그래밍 요소가 네임스페이스에 ConsoleApplication1
속합니다.
Namespace Magnetosphere
를 선언하면 프로젝트 내에서의 참조가 Magnetosphere
에 엑세스하게 됩니다.
다음 예제에서는 키워드 Global
를 사용하여 프로젝트의 루트 네임스페이스 밖에서 네임스페이스를 선언합니다.
Namespace Global.Magnetosphere
End Namespace
Namespace Global
Namespace Magnetosphere
End Namespace
End Namespace
네임스페이스 선언에서 Global
는 다른 네임스페이스 안에 위치할 수 없습니다.
애플리케이션 페이지, 프로젝트 디자이너(Visual Basic)를 사용하여 프로젝트의 루트 네임스페이스를 보고 수정할 수 있습니다. 새 프로젝트의 경우 루트 네임스페이스는 기본적으로 프로젝트 이름으로 설정됩니다.
Global
최상위 네임스페이스가 되도록 상자가 비어 있도록 루트 네임스페이스 항목을 지울 수 있습니다.
Namespace
문이 .NET Framework의 네임스페이스이기도 한 이름을 선언하는 경우 Global
키워드를 정규화된 이름에 사용하지 않으면 .NET Framework 네임스페이스를 사용할 수 없게 됩니다. 키워드 Global
를 사용하지 않고 해당 .NET Framework 네임스페이스에 쉽게 액세스하려면 문 Global
에서 키워드 Namespace
를 포함하면 됩니다.
다음 예제에서는 Global
네임스페이스 선언에 System.Text
키워드가 있습니다.
네임스페이스 선언에 Global
키워드가 없으면, StringBuilder를 지정하지 않고는 Global.System.Text.StringBuilder
에 접근할 수 없습니다.
ConsoleApplication1
라는 이름이 지정된 프로젝트에서 System.Text
키워드가 사용되지 않을 경우 ConsoleApplication1.System.Text
에 대한 액세스는 Global
을 참조합니다.
Module Module1
Sub Main()
Dim encoding As New System.Text.TitanEncoding
' If the namespace defined below is System.Text
' instead of Global.System.Text, then this statement
' causes a compile-time error.
Dim sb As New System.Text.StringBuilder
End Sub
End Module
Namespace Global.System.Text
Class TitanEncoding
End Class
End Namespace
참고하십시오
.NET