다음을 통해 공유


서명

서명 파일에는 형식, 네임스페이스 및 모듈과 같은 F# 프로그램 요소 집합의 공개 서명에 대한 정보가 포함되어 있습니다. 이러한 프로그램 요소의 접근성을 지정하는 데 사용할 수 있습니다.

비고

각 F# 코드 파일에 대해 서명 파일이 있을 수 있습니다. 이 파일은 코드 파일과 이름이 같지만 .fs 대신 확장명이 .fsi인 파일입니다. 명령줄을 직접 사용하는 경우 서명 파일을 컴파일 명령줄에 추가할 수도 있습니다. 코드 파일과 서명 파일을 구분하기 위해 코드 파일을 구현 파일이라고도 합니다. 프로젝트에서 서명 파일은 연결된 코드 파일 앞에 있어야 합니다.

서명 파일은 해당 구현 파일의 네임스페이스, 모듈, 형식 및 멤버를 설명합니다. 서명 파일의 정보를 사용하여 구현 파일 외부의 코드에서 해당 구현 파일의 코드에 액세스할 수 있는 부분과 구현 파일의 내부 부분을 지정합니다. 서명 파일에 포함된 네임스페이스, 모듈 및 형식은 구현 파일에 포함된 네임스페이스, 모듈 및 형식의 하위 집합이어야 합니다. 이 항목의 뒷부분에서 설명한 몇 가지 예외를 제외하고 서명 파일에 나열되지 않은 언어 요소는 구현 파일에 대한 비공개로 간주됩니다. 프로젝트 또는 명령줄에 서명 파일이 없으면 기본 접근성이 사용됩니다.

기본 접근성에 대한 자세한 내용은 Access Control을 참조하세요.

서명 파일에서는 각 메서드 또는 함수의 형식 정의와 구현을 반복하지 않습니다. 대신 모듈 또는 네임스페이스 조각에 의해 구현되는 기능의 완전한 사양으로 작동하는 각 메서드 및 함수에 대한 서명을 사용합니다. 형식 서명의 구문은 인터페이스 및 추상 클래스의 추상 메서드 선언에 사용되는 구문과 동일하며, 올바르게 컴파일된 입력을 표시할 때 IntelliSense 및 F# 인터프리터 fsi.exe 표시됩니다.

형식 서명에 형식이 봉인되어 있는지 또는 인터페이스 형식인지 여부를 나타내는 정보가 충분하지 않은 경우 형식의 특성을 나타내는 특성을 컴파일러에 추가해야 합니다. 이 용도로 사용하는 특성은 다음 표에 설명되어 있습니다.

특성 설명
[<Sealed>] 추상 멤버가 없거나 확장해서는 안 되는 형식의 경우
[<Interface>] 인터페이스인 형식의 경우

특성이 구현 파일의 서명과 선언 간에 일치하지 않으면 컴파일러가 오류를 생성합니다.

키워드 val 를 사용하여 값 또는 함수 값에 대한 서명을 만듭니다. 키워드 type 는 형식 서명을 소개합니다.

컴파일러 옵션을 사용하여 서명 파일을 생성할 --sig 수 있습니다. 일반적으로 .fsi 파일은 수동으로 작성하지 않습니다. 대신 컴파일러를 사용하여 .fsi 파일을 생성하고, 프로젝트에 추가한 파일(있는 경우)을 추가하고, 액세스하지 않으려는 메서드와 함수를 제거하여 편집합니다.

형식 서명에 대한 몇 가지 규칙이 있습니다.

  • 구현 파일의 형식 약어는 서명 파일의 약어가 없는 형식과 일치해서는 안 됩니다.

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

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

  • 인터페이스 형식은 모든 메서드와 인터페이스를 표시해야 합니다.

값 서명에 대한 규칙은 다음과 같습니다.

  • 접근성(publicinternal)에 대한 한정자 및 서명의 inlinemutable 한정자는 구현의 한정자와 일치해야 합니다.

  • 암시적으로 유추되거나 명시적으로 선언된 제네릭 형식 매개 변수의 수는 일치해야 하며 제네릭 형식 매개 변수의 형식 및 형식 제약 조건은 일치해야 합니다.

  • Literal 특성을 사용하는 경우 서명과 구현 모두에 표시되어야 하며 두 가지 모두에 동일한 리터럴 값을 사용해야 합니다.

  • 서명 및 구현의 매개 변수 패턴( arity라고도 함)은 일치해야 합니다.

  • 서명 파일의 매개 변수 이름이 해당 구현 파일과 다른 경우 서명 파일의 이름이 대신 사용되므로 디버깅 또는 프로파일링 시 문제가 발생할 수 있습니다. 이러한 불일치에 대한 알림을 받으려면 프로젝트 파일에서 또는 컴파일러를 호출할 때 경고 3218을 사용하도록 설정합니다(컴파일러 옵션 참조--warnon).

다음 코드 예제에서는 네임스페이스, 모듈, 함수 값 및 형식 시그니처가 적절한 특성과 함께 있는 서명 파일의 예를 보여 줍니다. 또한 해당 구현 파일도 표시합니다.

// 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 "type1.method1"
        member type1.method2() =
            printfn "type1.method2"


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

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

참고하십시오