네임스페이스(F#)

네임스페이스를 사용하면 F# 프로그램 요소 그룹화에 이름을 연결할 수 있도록 하여 코드를 관련 기능 영역으로 구성할 수 있습니다. 네임스페이스는 일반적으로 F# 파일의 최상위 요소입니다.

구문

namespace [rec] [parent-namespaces.]identifier

설명

네임스페이스에 코드를 넣으려면 파일의 첫 번째 선언에서 네임스페이스를 선언해야 합니다. 파일에 다른 네임스페이스 선언이 더 이상 존재하지 않는 경우 전체 파일의 내용이 네임스페이스의 일부가 됩니다. 이 경우 다음 네임스페이스 선언까지 모든 코드가 첫 번째 네임스페이스 내에 있는 것으로 간주됩니다.

네임스페이스는 값과 함수를 직접 포함할 수 없습니다. 대신 값과 함수를 모듈에 포함해야 하며 모듈은 네임스페이스에 포함됩니다. 네임스페이스에는 형식 및 모듈이 포함될 수 있습니다.

XML 문서 주석은 네임스페이스 위에 선언할 수 있지만 무시됩니다. 컴파일러 지시문은 네임스페이스 위에 선언할 수도 있습니다.

네임스페이스는 네임스페이스 키워드(keyword) 명시적으로 선언하거나 모듈을 선언할 때 암시적으로 선언할 수 있습니다. 네임스페이스를 명시적으로 선언하려면 네임스페이스 키워드(keyword) 뒤에 네임스페이스 이름을 사용합니다. 다음 예제에서는 해당 네임스페이스에 포함된 형식 및 모듈을 사용하여 네임스페 Widgets 이스를 선언하는 코드 파일을 보여 줍니다.

namespace Widgets

type MyWidget1 =
    member this.WidgetName = "Widget1"

module WidgetsModule =
    let widgetName = "Widget2"

파일의 전체 내용이 하나의 모듈에 있는 경우 키워드(keyword) 사용하여 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

자세한 내용은 모듈을 참조 하세요.

중첩된 네임스페이스

중첩된 네임스페이스를 만들 때는 네임스페이스를 정규화해야 합니다. 그렇지 않으면 새 최상위 네임스페이스를 만듭니다. 들여쓰기는 네임스페이스 선언에서 무시됩니다.

다음 예제에서는 중첩된 네임스페이스를 선언하는 방법을 보여줍니다.

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를 포함합니다.

전역 네임스페이스

미리 정의된 네임스페이스를 사용하여 .NET 최상위 네임 global 스페이스에 이름을 배치합니다.

namespace global

type SomeType() =
    member this.SomeMember = 0

전역을 사용하여 최상위 .NET 네임스페이스를 참조할 수도 있습니다(예: 다른 네임스페이스와 이름 충돌 해결).

global.System.Console.WriteLine("Hello World!")

재귀 네임스페이스

포함된 모든 코드가 상호 재귀적일 수 있도록 네임스페이스를 재귀로 선언할 수도 있습니다. 이 작업은 .를 통해 namespace rec수행됩니다. namespace rec 형식과 모듈 간에 상호 참조 코드를 작성할 수 없는 경우의 문제가 완화될 수 있습니다. 다음은 이 예제입니다.

namespace rec MutualReferences

type Orientation = Up | Down
type PeelState = Peeled | Unpeeled

// This exception depends on the type below.
exception DontSqueezeTheBananaException of Banana

type Banana(orientation : Orientation) =
    member val IsPeeled = false with get, set
    member val Orientation = orientation with get, set
    member val Sides: PeelState list = [ Unpeeled; Unpeeled; Unpeeled; Unpeeled] with get, set

    member self.Peel() = BananaHelpers.peel self // Note the dependency on the BananaHelpers module.
    member self.SqueezeJuiceOut() = raise (DontSqueezeTheBananaException self) // This member depends on the exception above.

module BananaHelpers =
    let peel (b: Banana) =
        let flip (banana: Banana) =
            match banana.Orientation with
            | Up ->
                banana.Orientation <- Down
                banana
            | Down -> banana

        let peelSides (banana: Banana) =
            banana.Sides
            |> List.map (function
                         | Unpeeled -> Peeled
                         | Peeled -> Peeled)

        match b.Orientation with
        | Up ->   b |> flip |> peelSides
        | Down -> b |> peelSides

예외 DontSqueezeTheBananaException 와 클래스 Banana 는 모두 서로를 참조합니다. 또한 모듈 BananaHelpers 과 클래스 Banana 는 서로를 참조합니다. 네임스페이스에서 키워드(keyword) 제거한 rec 경우 F#으로 MutualReferences 표현할 수 없습니다.

이 기능은 최상위 모듈에서도 사용할 수 있습니다.

참고 항목