가져오기 선언: open
키워드
가져오기 선언은 정규화된 이름을 사용하지 않고 참조할 수 있는 요소의 모듈 또는 네임스페이스를 지정합니다.
구문
open module-or-namespace-name
open type type-name
설명
매번 정규화된 네임스페이스 또는 모듈 경로를 사용하여 코드를 참조하면 작성, 읽기 및 유지 관리가 어려운 코드가 만들어질 수 있습니다. 대신, 자주 사용되는 모듈과 네임스페이스에 대해 open
키워드를 사용하면 해당 모듈이나 네임스페이스의 멤버를 참조할 때 정규화된 이름 대신 짧은 형식의 이름을 사용할 수 있습니다. 이 키워드는 C#의 using
키워드, Visual C++의 using namespace
및 Visual Basic의 Imports
키워드와 유사합니다.
제공된 모듈 또는 네임스페이스는 동일한 프로젝트나 참조된 프로젝트 또는 어셈블리에 있어야 합니다. 그렇지 않은 경우 프로젝트에 대한 참조를 추가하거나 -reference
명령줄 옵션(또는 약어인 -r
)을 사용할 수 있습니다. 자세한 내용은 컴파일러 옵션을 참조하세요.
가져오기 선언을 사용하면 선언 뒤의 코드에서 바깥쪽 네임스페이스, 모듈 또는 파일의 끝까지 이름을 사용할 수 있습니다.
여러 가져오기 선언을 사용하는 경우 별도의 줄에 표시되어야 합니다.
다음 코드는 코드를 간소화하기 위해 open
키워드를 사용하는 방법을 보여 줍니다.
// Without the import declaration, you must include the full
// path to .NET Framework namespaces such as System.IO.
let writeToFile1 filename (text: string) =
let stream1 = new System.IO.FileStream(filename, System.IO.FileMode.Create)
let writer = new System.IO.StreamWriter(stream1)
writer.WriteLine(text)
// Open a .NET Framework namespace.
open System.IO
// Now you do not have to include the full paths.
let writeToFile2 filename (text: string) =
let stream1 = new FileStream(filename, FileMode.Create)
let writer = new StreamWriter(stream1)
writer.WriteLine(text)
writeToFile2 "file1.txt" "Testing..."
F# 컴파일러는 둘 이상의 열린 모듈 또는 네임스페이스에 동일한 이름이 나타날 때 모호성이 발생할 때 발생하는 오류나 경고를 내보내지 않습니다. 모호성이 발생하면 F#에서는 가장 최근에 열린 모듈이나 네임스페이스를 우선적으로 사용합니다. 예를 들어, 다음 코드에서 empty
은 empty
이 List
및 Seq
모듈 모두에 있더라도 Seq.empty
를 의미합니다.
open List
open Seq
printfn %"{empty}"
따라서 동일한 이름을 가진 멤버가 포함된 List
또는 Seq
와 같은 모듈이나 네임스페이스를 열 때 주의해야 합니다. 대신 정규화된 이름을 사용하는 것이 좋습니다. 코드가 가져오기 선언의 순서에 종속되는 상황을 피해야 합니다.
개방형 형식 선언
F#은 다음과 같은 형식에 대해 open
을 지원합니다.
open type System.Math
PI
그러면 해당 형식에서 액세스 가능한 모든 정적 필드와 멤버가 노출됩니다.
또한 open
F#으로 정의된 레코드 및 차별화된 공용체 형식을 사용하여 정적 멤버를 노출할 수 있습니다. 구분된 공용 구조체의 경우 공용 구조체 사례를 표시할 수도 있습니다. 이는 다음과 같이 열고 싶지 않은 모듈 내부에 선언된 형식의 공용 구조체 사례에 액세스하는 데 도움이 될 수 있습니다.
module M =
type DU = A | B | C
let someOtherFunction x = x + 1
// Open only the type inside the module
open type M.DU
printfn "%A" A
global
지정자를 사용하여 루트 경로에서만 열기
다음과 같은 중첩 모듈은
module A =
module B =
...
다음을 통해 열 수 있습니다.
open A // opens A
open B // opens A.B
정규화된 모듈 또는 global
지정자를 접두어로 붙인 네임스페이스만 열려면:
open global.A // works
open global.B // this now fails
open global.A.B // works
기본적으로 열려 있는 네임스페이스
일부 네임스페이스는 F# 코드에서 자주 사용되므로 명시적인 가져오기 선언이 필요 없이 암시적으로 열립니다. 다음 표에는 기본적으로 열려 있는 네임스페이스가 나와 있습니다.
네임스페이스 | 설명 |
---|---|
FSharp.Core |
int 및 float 와 같은 기본 제공 형식에 대한 기본 F# 형식 정의가 포함되어 있습니다. |
FSharp.Core.Operators |
+ 및 * 와 같은 기본 산술 연산을 포함합니다. |
FSharp.Collections |
List 및 Array 와 같은 변경이 불가능한 컬렉션 클래스를 포함합니다. |
FSharp.Control |
지연 계산 및 비동기 식과 같은 컨트롤 구문에 대한 형식을 포함합니다. |
FSharp.Text |
printf 함수와 같은 형식화된 IO에 대한 함수를 포함합니다. |
AutoOpen 특성
어셈블리가 참조될 때 네임스페이스나 모듈을 자동으로 열려면 어셈블리에 AutoOpen
특성을 적용할 수 있습니다. 부모 모듈이나 네임스페이스가 열릴 때 해당 모듈을 자동으로 열도록 모듈에 AutoOpen
특성을 적용할 수도 있습니다. 자세한 내용은 AutoOpenAttribute를 참조하세요.
RequireQualifiedAccess 특성
일부 모듈, 레코드 또는 공용체 형식은 RequireQualifiedAccess
특성을 지정할 수 있습니다. 해당 모듈, 레코드 또는 공용체의 요소를 참조하는 경우 가져오기 선언 포함 여부에 관계없이 정규화된 이름을 사용해야 합니다. 일반적으로 사용되는 이름을 정의하는 형식에서 이 특성을 전략적으로 사용하면 이름 충돌을 방지하고 라이브러리 변경에 대한 코드 복원력을 높일 수 있습니다. 자세한 내용은 RequireQualifiedAccessAttribute를 참조하세요.
참고 항목
.NET