모듈(F#)
F# 언어의 컨텍스트에서 모듈은 F# 프로그램에 사용되는 값, 형식, 함수 값 같은 F# 코드의 그룹입니다. 코드를 모듈로 그룹화하면 관련 코드를 함께 묶어 관리할 수 있고 프로그램에서 이름이 서로 충돌하지 않도록 방지할 수 있습니다.
// Top-level module declaration.
module [accessibility-modifier] [qualified-namespace.]module-name
declarations
// Local module declaration.
module [accessibility-modifier] module-name =
declarations
설명
F# 모듈은 형식, 값, 함수 값 및 do 바인딩의 코드 같은 F# 코드 구문의 그룹입니다. 모듈은 정적 멤버만 있는 CLR(공용 언어 런타임) 클래스로 구현됩니다. 모듈 선언에는 전체 파일이 모듈에 포함되는지 여부에 따라 최상위 모듈 선언과 로컬 모듈 선언이라는 두 가지 형식이 있습니다. 최상위 모듈 선언의 경우 전체 파일을 모듈에 포함합니다. 최상위 모듈 선언은 파일에서 맨 처음 선언으로만 나타날 수 있습니다.
최상위 모듈 선언의 구문에서 선택적 요소인 qualified-namespace는 모듈을 포함하는 중첩된 네임스페이스 이름의 시퀀스입니다. 한정된 네임스페이스는 미리 선언할 필요가 없습니다.
최상위 모듈에서는 선언을 들여쓸 필요가 없습니다. 그러나 로컬 모듈에서는 모든 선언에 대해 들여쓰기를 해야 합니다. 로컬 모듈 선언의 경우 해당 모듈 선언 아래 들여쓴 선언만 모듈에 포함됩니다.
코드 파일이 최상위 모듈 선언이나 네임스페이스 선언으로 시작하지 않는 경우 모든 로컬 모듈을 비롯하여 파일에 있는 내용 전체가 암시적으로 작성된 최상위 모듈의 일부가 됩니다. 암시적으로 작성된 최상위 모듈은 그 이름이 파일과 같지만 확장명이 없으며 맨 첫 글자가 대문자로 변환됩니다. 예를 들어 다음과 같은 파일을 생각해 볼 수 있습니다.
// In the file program.fs.
let x = 40
이 파일은 마치 다음과 같은 방식으로 작성한 것처럼 컴파일됩니다.
module Program
let x = 40
파일 하나에 여러 개의 모듈이 있는 경우 각 모듈에 대해 로컬 모듈 선언을 사용해야 합니다. 바깥쪽 네임스페이스를 선언한 경우 이들 모듈은 바깥쪽 네임스페이스의 일부가 됩니다. 바깥쪽 네임스페이스를 선언하지 않은 경우 모듈들은 암시적으로 작성된 최상위 모듈의 일부가 됩니다. 다음 코드 예제에서는 여러 개의 모듈이 포함된 코드 파일을 보여 줍니다. 컴파일러는 암시적으로 Multiplemodules라는 최상위 모듈을 만듭니다. MyModule1 및 MyModule2는 해당 최상위 모듈에 중첩됩니다.
// In the file multiplemodules.fs.
// MyModule1
module MyModule1 =
// Indent all program elements within modules that are declared with an equal sign.
let module1Value = 100
let module1Function x =
x + 10
// MyModule2
module MyModule2 =
let module2Value = 121
// Use a qualified name to access the function.
// from MyModule1.
let module2Function x =
x * (MyModule1.module1Function module2Value)
프로젝트 또는 단일 컴파일의 파일이 여러 개이거나 라이브러리를 작성하는 경우에는 네임스페이스 선언이나 모듈 선언을 파일 맨 위에 포함해야 합니다. 프로젝트 또는 컴파일 명령줄에 파일이 한 개만 있고 응용 프로그램을 만드는 경우에는 F# 컴파일러에서 모듈 이름만 암시적으로 확인합니다.
accessibility-modifier는 public, private, internal 중 하나가 될 수 있습니다. 자세한 내용은 액세스 제어(F#)를 참조하십시오. 기본값은 public입니다.
모듈의 코드 참조
다른 모듈의 함수, 형식 및 값을 참조하는 경우 한정된 이름을 사용하거나 모듈을 열어야 합니다. 한정된 이름을 사용하는 경우 필요한 프로그램 요소에 대한 네임스페이스, 모듈 및 한정자를 지정해야 합니다. 한정된 경로의 각 부분은 다음과 같이 점(.)으로 구분합니다.
Namespace1.Namespace2.ModuleName.Identifier
모듈을 열거나 한 개 이상의 네임스페이스를 열어 코드를 간소화할 수 있습니다. 네임스페이스와 모듈을 여는 데 대한 자세한 내용은 가져오기 선언: open 키워드(F#)를 참조하십시오.
다음 코드 예제에서는 파일 마지막까지 모든 코드를 포함하는 최상위 모듈을 보여 줍니다.
module Arithmetic
let add x y =
x + y
let sub x y =
x - y
동일한 프로젝트의 다른 파일에서 이 코드를 사용하려면 다음 예제에서와 같이 함수를 사용하기 전에 모듈을 열거나 한정된 이름을 사용해야 합니다.
// Fully qualify the function name.
let result1 = Arithmetic.add 5 9
// Open the module.
open Arithmetic
let result2 = add 5 9
중첩된 모듈
모듈은 중첩될 수 있습니다. 내부 모듈은 새 모듈이 아니라 내부 모듈이라는 사실을 표시하기 위해 외부 모듈 선언만큼 들여써야 합니다. 예를 들어 다음 두 예제를 비교해 볼 수 있습니다. 다음 코드에서 모듈 Z는 내부 모듈입니다.
module Y =
let x = 1
module Z =
let z = 5
그러나 다음 코드에서 모듈 Z는 모듈 Y의 형제 모듈입니다.
module Y =
let x = 1
module Z =
let z = 5
다음 코드에서도 모듈 Z는 형제 모듈입니다. 이 모듈을 모듈 Y의 다른 선언만큼 들여쓰지 않았기 때문입니다.
module Y =
let x = 1
module Z =
let z = 5
외부 모듈에 선언이 없고 다른 모듈 선언이 곧바로 뒤이어 나오는 경우 새 모듈 선언은 내부 모듈로 간주되지만 둘째 모듈 정의를 첫째 모듈 정의보다 더 들여쓰지 않은 경우 컴파일러에서 경고가 발생합니다.
// This code produces a warning, but treats Z as a inner module.
module Y =
module Z =
let z = 5
경고가 발생하지 않도록 하려면 내부 모듈을 들여써야 합니다.
module Y =
module Z =
let z = 5
파일의 모든 코드를 외부 모듈 하나에 포함한 상태에서 내부 모듈을 사용하려는 경우 외부 모듈에는 등호를 사용할 필요가 없습니다. 또한 모든 내부 모듈 선언을 포함하여 외부 모듈에 작성하는 모듈은 들여쓸 필요가 없습니다. 내부 모듈 선언 내에 포함하는 선언은 들여쓸 필요가 없습니다. 다음 코드에서는 이와 같은 경우를 보여 줍니다.
// The top-level module declaration can be omitted if the file is named
// TopLevel.fs or topLevel.fs, and the file is the only file in an
// application.
module TopLevel
let topLevelX = 5
module Inner1 =
let inner1X = 1
module Inner2 =
let inner2X = 5