다음을 통해 공유


가져오기 선언: 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#에서는 가장 최근에 열린 모듈이나 네임스페이스를 우선적으로 사용합니다. 예를 들어, 다음 코드에서 emptyemptyListSeq 모듈 모두에 있더라도 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 intfloat와 같은 기본 제공 형식에 대한 기본 F# 형식 정의가 포함되어 있습니다.
FSharp.Core.Operators +*와 같은 기본 산술 연산을 포함합니다.
FSharp.Collections ListArray와 같은 변경이 불가능한 컬렉션 클래스를 포함합니다.
FSharp.Control 지연 계산 및 비동기 식과 같은 컨트롤 구문에 대한 형식을 포함합니다.
FSharp.Text printf 함수와 같은 형식화된 IO에 대한 함수를 포함합니다.

AutoOpen 특성

어셈블리가 참조될 때 네임스페이스나 모듈을 자동으로 열려면 어셈블리에 AutoOpen 특성을 적용할 수 있습니다. 부모 모듈이나 네임스페이스가 열릴 때 해당 모듈을 자동으로 열도록 모듈에 AutoOpen 특성을 적용할 수도 있습니다. 자세한 내용은 AutoOpenAttribute를 참조하세요.

RequireQualifiedAccess 특성

일부 모듈, 레코드 또는 공용체 형식은 RequireQualifiedAccess 특성을 지정할 수 있습니다. 해당 모듈, 레코드 또는 공용체의 요소를 참조하는 경우 가져오기 선언 포함 여부에 관계없이 정규화된 이름을 사용해야 합니다. 일반적으로 사용되는 이름을 정의하는 형식에서 이 특성을 전략적으로 사용하면 이름 충돌을 방지하고 라이브러리 변경에 대한 코드 복원력을 높일 수 있습니다. 자세한 내용은 RequireQualifiedAccessAttribute를 참조하세요.

참고 항목