네임스페이스(F#)
네임스페이스를 사용하면 프로그램 요소의 그룹에 이름을 할당하여 코드를 관련 기능 영역으로 묶어 정리할 수 있습니다.
namespace [parent-namespaces.]identifier
설명
코드를 네임스페이스에 추가하려면 파일의 맨 처음 선언에서 네임스페이스를 선언해야 합니다. 이렇게 하면 전체 파일의 내용이 네임스페이스의 일부가 됩니다.
네임스페이스에는 값과 함수를 직접 포함할 수 없습니다. 대신 값과 함수를 모듈에 포함하고 해당 모듈을 네임스페이스에 포함해야 합니다. 네임스페이스에는 형식과 모듈이 포함될 수 있습니다.
네임스페이스는 namespace 키워드를 사용하여 명시적으로 선언하거나 모듈을 선언할 때 암시적으로 선언할 수 있습니다. 네임스페이스를 명시적으로 선언하려면 namespace 키워드를 사용하고 그 뒤에 네임스페이스 이름을 추가합니다. 다음 예제에서는 Widgets라는 네임스페이스를 선언하고 해당 네임스페이스에 형식과 모듈을 포함하는 코드 파일을 보여 줍니다.
namespace Widgets
type MyWidget1 =
member this.WidgetName = "Widget1"
module WidgetsModule =
let widgetName = "Widget2"
파일의 내용 전체가 모듈 하나에 포함되는 경우 module 키워드를 사용하고 새 네임스페이스 이름을 정규화된 모듈 이름에 제공하여 네임스페이스를 암시적으로 선언할 수도 있습니다. 다음 예제에서는 Widgets라는 네임스페이스와 WidgetsModule이라는 모듈을 선언하는 코드 파일을 보여 줍니다. 이 모듈에는 함수가 포함됩니다.
module Widgets.WidgetModule
let widgetFunction x y =
printfn "%A %A" x y
다음 코드는 위 코드와 내용이 같지만 모듈이 로컬 모듈 선언이라는 점에서 차이가 있습니다. 이 경우 네임스페이스를 별도의 줄에 작성해야 합니다.
namespace Widgets
module WidgetModule =
let widgetFunction x y =
printfn "%A %A" x y
하나 이상의 네임스페이스에서 동일한 파일에 여러 개의 모듈이 필요한 경우에는 로컬 모듈 선언을 사용해야 합니다. 로컬 모듈 선언을 사용할 때는 모듈 선언에 한정된 네임스페이스를 사용할 수 없습니다. 다음 코드에서는 네임스페이스 선언 하나와 로컬 모듈 선언 두 개가 포함된 파일을 보여 줍니다. 이 경우 모듈은 네임스페이스에 직접 포함됩니다. 여기서는 파일과 이름이 같은 모듈이 암시적으로 만들어지지 않습니다. 파일에 있는 do 바인딩 같은 다른 모든 코드가 네임스페이스에 포함되지만 내부 모듈에는 포함되지 않습니다. 따라서 모듈 이름을 사용하여 모듈 멤버 widgetFunction을 한정해야 합니다.
namespace Widgets
module WidgetModule1 =
let widgetFunction x y =
printfn "Module1 %A %A" x y
module WidgetModule2 =
let widgetFunction x y =
printfn "Module2 %A %A" x y
module useWidgets =
do
WidgetModule1.widgetFunction 10 20
WidgetModule2.widgetFunction 5 6
이 예제는 다음과 같이 출력됩니다.
Module1 10 20
Module2 5 6
자세한 내용은 모듈(F#)을 참조하십시오.
중첩된 네임스페이스
중첩된 네임스페이스를 만들려면 이를 정규화해야 합니다. 그렇지 않으면 최상위 네임스페이스가 새로 만들어집니다. 네임스페이스 선언에서 들여쓰기는 무시됩니다.
다음 예제에서는 중첩된 네임스페이스를 선언하는 방법을 보여 줍니다.
namespace Outer
// Full name: Outer.MyClass
type MyClass() =
member this.X(x) = x + 1
// Fully qualify any nested namespaces.
namespace Outer.Inner
// Full name: Outer.Inner.MyClass
type MyClass() =
member this.Prop1 = "X"
파일과 어셈블리의 네임스페이스
네임스페이스는 단일 프로젝트 또는 컴파일에서 여러 파일에 걸쳐 있을 수 있습니다. 그중 한 파일에 포함된 네임스페이스의 일부를 가리키는 데는 네임스페이스 조각이라는 용어를 사용합니다. 네임스페이스는 여러 어셈블리에 걸쳐 있을 수도 있습니다. 예를 들어 System 네임스페이스가 전체 .NET Framework를 포함하고, 이는 다시 여러 어셈블리에 걸쳐 있으면서 중첩된 네임스페이스 여러 개를 포함할 수 있습니다.
전역 네임스페이스
미리 정의된 네임스페이스 global을 사용하여 .NET 최상위 네임스페이스에 이름을 추가할 수 있습니다.
namespace global
type SomeType() =
member this.SomeMember = 0
예를 들어 global을 사용하여 최상위 .NET 네임스페이스를 참조하여 다른 네임스페이스와 이름이 충돌하는 문제를 해결할 수 있습니다.
global.System.Console.WriteLine("Hello World!")