다음을 통해 공유


서명(F#)

시그니처 파일에는 형식, 네임스페이스, 모듈 등의 F# 프로그램 요소 집합에 대한 공개 시그니처 관련 정보가 포함됩니다.해당 프로그램 요소에 대한 액세스 가능 여부를 지정하는 데 이를 사용할 수 있습니다.

설명

각 F# 코드 파일에 대해 시그니처 파일을 하나씩 만들 수 있습니다. 시그니처 파일은 코드 파일과 이름이 같지만 확장명이 .fs가 아니라 .fsi입니다.명령줄에서 직접 작업하는 경우 컴파일 명령줄에 시그니처 파일을 추가할 수도 있습니다.코드 파일과 시그니처 파일을 구분하기 위해 코드 파일을 구현 파일이라고 부르기도 합니다.프로젝트에서 시그니처 파일은 관련 코드 파일보다 앞에 와야 합니다.

시그니처 파일에서는 상응하는 구현 파일의 네임스페이스, 모듈, 형식 및 멤버를 설명합니다.시그니처 파일의 정보를 사용하면 상응하는 구현 파일의 코드 중 어떤 부분을 구현 파일 외부의 코드에서 액세스 가능한 부분으로 두고 어떤 부분을 구현 파일의 내부 코드로 둘지 지정할 수 있습니다.시그니처 파일에 포함되어 있는 네임스페이스, 모듈 및 형식은 구현 파일에 포함되어 있는 네임스페이스, 모듈 및 형식의 하위 집합이어야 합니다.이 항목의 뒷부분에서 설명하는 몇 가지 예외를 제외하고 시그니처 파일에 나열되지 않은 언어 요소는 구현 파일 전용인 것으로 간주됩니다.프로젝트나 명령줄에서 시그니처 파일을 찾지 못하면 기본 액세스 가능성이 사용됩니다.

기본 액세스 가능성에 대한 자세한 내용은 액세스 제어(F#)를 참조하십시오.

시그니처 파일에서 각 메서드 또는 함수의 형식과 구현에 대한 정의를 되풀이하지 말아야 합니다.대신 모듈 또는 네임스페이스 조각에 의해 구현되는 기능의 완벽한 사양 역할을 하는 시그니처를 각 메서드와 함수에 대해 사용해야 합니다.형식 시그니처의 구문은 인터페이스 및 추상 클래스의 추상 메서드 선언에 사용되는 구문과 같습니다. 이 구문은 올바르게 컴파일된 입력을 표시할 때 IntelliSense 및 F# 해석기(fsi.exe)를 통해서도 표시됩니다.

봉인된 형식인지 여부나 인터페이스 형식인지 여부를 나타내는 정보가 형식 시그니처에 충분히 포함되어 있지 않으면 형식의 성격을 나타내는 특성을 컴파일러에 추가로 제공해야 합니다.다음 표에는 이와 같은 목적으로 사용할 수 있는 특성에 대한 설명이 나와 있습니다.

특성

설명

[<Sealed>]

추상 멤버가 없거나 확장해야 할 형식에 대해 사용합니다.

[<Interface>]

인터페이스인 형식에 대해 사용합니다.

구현 파일의 선언과 시그니처 사이에 특성이 일관되지 않으면 컴파일러에서 오류가 발생합니다.

값 또는 함수 값의 시그니처를 만들려면 val 키워드를 사용합니다.형식 시그니처에는 type 키워드를 사용합니다.

--sig 컴파일러 옵션을 사용하여 시그니처 파일을 생성할 수 있습니다.대부분의 경우 .fsi 파일은 수동으로 작성하지 않습니다.대신 컴파일러를 사용하여 .fsi 파일을 생성한 다음 프로젝트가 있으면 해당 프로젝트에 파일을 추가하고 액세스할 수 없도록 하려는 메서드와 함수를 제거하여 파일을 편집합니다.

형식 시그니처에는 여러 가지 규칙이 적용됩니다.

  • 구현 파일의 형식 약어는 시그니처 파일에 약어가 포함되지 않은 형식과 달라야 합니다.

  • 레코드 및 구별된 공용 구조체는 해당 필드와 생성자를 모두 노출하거나 하나도 노출하지 말아야 하며, 시그니처에서의 순서는 구현 파일에서의 순서와 일치해야 합니다.클래스는 시그니처에서 해당 필드와 메서드를 전부 또는 일부만 노출하거나 전혀 노출하지 않을 수 있습니다.

  • 생성자가 있는 클래스와 구조체는 해당 기본 클래스의 선언(inherits 선언)을 노출해야 합니다.또한 생성자가 있는 클래스와 구조체는 추상 메서드와 인터페이스 선언을 모두 노출해야 합니다.

  • 인터페이스 형식은 해당 메서드와 인터페이스를 모두 노출해야 합니다.

값 시그니처에는 다음과 같은 규칙이 적용됩니다.

  • 시그니처에 있는 액세스 가능성 한정자(public, internal 등)와 inline 및 mutable 한정자가 구현에 있는 해당 항목과 일치해야 합니다.

  • 암시적으로 유추한 것이든 명시적으로 선언한 것이든 제네릭 형식 매개 변수의 수가 일치해야 하고 제네릭 형식 매개 변수의 형식 및 형식 제약 조건이 일치해야 합니다.

  • Literal 특성을 사용하는 경우 시그니처와 구현에 모두 해당 특성을 표시해야 하며 둘 다 동일한 리터럴 값을 사용해야 합니다.

  • 시그니처와 구현의 매개 변수 패턴에 일관성이 있어야 합니다. 이 매개 변수 패턴을 인자라고도 합니다.

다음 코드 예제에서는 네임스페이스, 모듈, 함수 값 및 형식 시그니처와 함께 적절한 특성을 사용하는 시그니처 파일의 예를 보여 줍니다.여기서는 그에 상응하는 구현 파일도 보여 줍니다.

// Module1.fsi

namespace Library1
  module Module1 = 
    val function1 : int -> int
    type Type1 =
        new : unit -> Type1
        member method1 : unit -> unit
        member method2 : unit -> unit

    [<Sealed>]
    type Type2 = 
        new : unit -> Type2
        member method1 : unit -> unit
        member method2 : unit -> unit

    [<Interface>]
    type InterfaceType1 =  
        abstract member method1 : int -> int
        abstract member method2 : string -> unit

다음 코드에서는 구현 파일을 보여 줍니다.

namespace Library1

module Module1 =

    let function1 x = x + 1


    type Type1() =
        member type1.method1() =
            printfn "test1.method1"
        member type1.method2() =
            printfn "test1.method2"


    [<Sealed>]
    type Type2() =
        member type2.method1() =
            printfn "test1.method1"
        member type1.method2() =
            printfn "test1.method2"

    [<Interface>]
    type InterfaceType1 =
        abstract member method1 : int -> int
        abstract member method2 : string -> unit

참고 항목

개념

액세스 제어(F#)

기타 리소스

F# 언어 참조

컴파일러 옵션(F#)