다음을 통해 공유


구조체(F#)

구조체는 간결하게 압축된 개체 형식입니다. 데이터의 양이 많지 않고 동작이 단순한 형식에 대해서는 클래스보다 구조체를 사용하는 편이 더 효율적일 수 있습니다.

[ attributes ]
type [accessibility-modifier] type-name =
   struct
      type-definition-elements
   end
// or
[ attributes ]
[<StructAttribute>]
type [accessibility-modifier] type-name =
   type-definition-elements

설명

구조체는 값 형식입니다. 즉, 구조체는 스택에 직접 저장되거나 이를 필드 또는 배열 요소로 사용하는 경우 부모 형식에 인라인으로 포함됩니다. 클래스나 레코드와 달리 구조체에는 값으로 전달하는 의미 체계가 있습니다. 즉, 구조체는 주로 액세스 및 복사 빈도가 잦은 데이터의 소규모 집계에 유용하게 사용됩니다.

위 구문에는 두 가지 형식이 나와 있습니다. 첫째 형식은 간단한 구문이 아니지만 struct 및 end 키워드를 사용할 때 둘째 형식에서와 달리 StructAttribute 특성을 생략할 수 있으므로 자주 사용되는 구문입니다. StructAttribute를 단순히 Struct로 줄여 표현할 수 있습니다.

위 구문에서 type-definition-elements는 멤버 선언 및 정의를 나타냅니다. 구조체는 생성자와 변경 가능한 필드 및 변경 불가능한 필드를 가질 수 있으며, 멤버 및 인터페이스 구현을 선언할 수 있습니다. 자세한 내용은 멤버(F#)를 참조하십시오.

구조체는 상속에 참여할 수 없으며 let 또는 do 바인딩을 포함할 수 없고 자신과 같은 형식의 필드를 재귀적으로 포함할 수 없습니다. 그러나 자신과 같은 형식을 참조하는 참조 셀은 포함할 수 있습니다.

구조체에는 let 바인딩이 허용되지 않으므로 구조체에 필드를 선언하려면 val 키워드를 사용해야 합니다. val 키워드는 필드와 해당 형식을 정의하지만 초기화는 허용하지 않습니다. 대신 val 선언이 0 또는 null로 초기화됩니다. 따라서 암시적 생성자, 즉 선언에서 구조체 이름 바로 뒤에 주어지는 매개 변수가 있는 구조체의 경우 DefaultValue 특성을 사용하여 val 선언을 주석 처리해야 합니다. 생성자가 명시적으로 정의되는 구조체도 0 초기화를 지원합니다. 따라서 DefaultValue 특성은 그와 같은 0 값이 필드에 유효함을 나타내는 선언입니다. 구조체의 암시적 생성자는 어떠한 작업도 수행하지 않습니다. 해당 형식에 대해 let 및 do 바인딩이 허용되더라도 전달된 암시적 생성자 매개 변수 값은 전용 필드로 사용되기 때문입니다.

명시적 생성자를 사용하면 필드 값이 초기화될 수 있습니다. 명시적 생성자가 있는 구조체의 경우에도 0 초기화를 지원합니다. 그러나 val 선언에 DefaultValue 특성을 사용하면 명시적 생성자와 충돌을 일으킬 수 있으므로 이 특성을 사용하지 말아야 합니다. val 선언에 대한 자세한 내용은 명시적 필드: val 키워드(F#)를 참조하십시오.

특성 및 액세스 가능성 한정자는 구조체에 사용할 수 있으며 다른 형식에 적용되는 것과 같은 규칙을 따릅니다. 자세한 내용은 특성(F#)액세스 제어(F#)를 참조하십시오.

다음 코드 예제에서는 구조체 정의를 보여 줍니다.

// In Point3D, three immutable values are defined.
// x, y, and z will be initialized to 0.0.
type Point3D =
   struct
      val x: float
      val y: float
      val z: float
   end

// In Point2D, two immutable values are defined.
// Point2D has an explicit constructor.
// You can create zero-initialized instances of Point2D, or you can
// pass in arguments to initialize the values.
type Point2D =
   struct
      val X: float
      val Y: float
      new(x: float, y: float) = { X = x; Y = y }
   end

참고 항목

참조

클래스(F#)

레코드(F#)

개념

멤버(F#)

기타 리소스

F# 언어 참조