속성(F#)
속성은 개체와 관련된 값을 나타내는 멤버입니다.
// Property that has both get and set defined.
[ attributes ]
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName
with [accessibility-modifier] get() =
get-function-body
and [accessibility-modifier] set parameter =
set-function-body
// Alternative syntax for a property that has get and set.
[ attributes-for-get ]
[ static ] member [accessibility-modifier-for-get] [self-identifier.]PropertyName =
get-function-body
[ attributes-for-set ]
[ static ] member [accessibility-modifier-for-set] [self-identifier.]PropertyName
with set parameter =
set-function-body
// Property that has get only.
[ attributes ]
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName =
get-function-body
// Alternative syntax for property that has get only.
[ attributes ]
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName
with get() =
get-function-body
// Property that has set only.
[ attributes ]
[ static ] member [accessibility-modifier] [self-identifier.]PropertyName
with set parameter =
set-function-body
설명
속성은 개체 지향 프로그래밍의 "포함" 관계를 나타냅니다. 이는 개체 인스턴스와 관련이 있는 데이터를 나타내거나 정적 속성인 경우 형식과 관련이 있는 데이터를 나타냅니다.
현재 인스턴스를 나타내는 자체 식별자 값인 member 키워드와 속성의 이름을 사용하여 속성을 선언할 수 있습니다. 이 선언 구문 뒤에는 get 및 set 메서드와 명명된 접근자를 지정하는 구문이 옵니다. 여기에는 읽기/쓰기, 읽기 전용 및 쓰기 전용 속성에 사용되는 다양한 형식의 구문이 나와 있습니다. 읽기 전용 속성에 대해서는 get 메서드만 정의하고, 쓰기 전용 속성에 대해서는 set 메서드만 정의합니다. 속성에 get 및 set 접근자가 둘 다 있는 경우 다음 코드에서와 같이 대체 구문을 사용하여 각 접근자별로 서로 다른 특성 및 액세스 가능성 한정자를 지정할 수 있습니다.
// A read-only property.
member this.MyReadOnlyProperty = myInternalValue
// A write-only property.
member this.MyWriteOnlyProperty with set (value) = myInternalValue <- value
// A read-write property.
member this.MyReadWriteProperty
with get () = myInternalValue
and set (value) = myInternalValue <- value
속성의 데이터가 저장되는 개인 값을 백업 저장소라고 합니다. 다른 언어와 달리 F#에는 속성에 대한 암시적 백업 저장소를 만드는 메커니즘이 없습니다. 따라서 백업 저장소를 명시적으로 정의해야 합니다. 백업 저장소를 정의할 때는 일반적으로 다음과 같이 변경 가능한 let 바인딩을 사용합니다.
type MyClass(x : string) =
let mutable myInternalValue = x
member this.MyProperty
with get() = myInternalValue
and set(value) = myInternalValue <- value
get 및 set 메서드가 모두 있는 읽기/쓰기 속성의 경우 get 및 set의 순서를 바꿔도 상관이 없습니다. 또는 조합된 구문을 사용하는 대신 get 전용으로 표시된 구문과 set 전용으로 표시된 구문을 따로따로 제공할 수도 있습니다. 이렇게 하면 필요한 경우 get 메서드나 set 메서드를 개별적으로 쉽게 주석 처리하여 제외할 수 있습니다. 다음 코드에서는 조합된 구문 대신 이 대체 방법을 사용하는 예를 보여 줍니다.
member this.MyReadWriteProperty with get () = myInternalValue
member this.MyReadWriteProperty with set (value) = myInternalValue <- value
속성은 클래스, 구조체, 구별된 공용 구조체, 레코드, 인터페이스 및 형식 확장명의 멤버일 수 있으며, 개체 식에서 속성을 정의할 수도 있습니다.
속성에 특성을 적용할 수 있습니다. 속성에 특성을 적용하려면 속성 앞에 별도의 줄을 사용하여 특성을 작성해야 합니다. 자세한 내용은 특성(F#)을 참조하십시오.
기본적으로 속성은 공용입니다. 속성에 액세스 가능성 한정자를 적용할 수도 있습니다. get 및 set 메서드 모두에 액세스 가능성 한정자를 적용하려면 속성 이름 바로 앞에 해당 한정자를 추가하고, 각 접근자별로 서로 다른 액세스 가능성을 지정하려면 get 및 set 키워드 앞에 해당 한정자를 추가합니다. accessibility-modifier는 public, private, internal 중 하나가 될 수 있습니다. 자세한 내용은 액세스 제어(F#)를 참조하십시오.
속성에 액세스할 때마다 속성 구현이 실행됩니다.
정적 속성과 인스턴스 속성
속성은 정적 속성이거나 인스턴스 속성일 수 있습니다. 정적 속성은 인스턴스 없이 호출할 수 있으며 개별 개체가 아니라 형식과 관련된 값에 사용됩니다. 정적 속성에는 자체 식별자를 사용하지 않습니다. 자체 식별자는 인스턴스 속성에 필요합니다.
다음 예제에 나와 있는 정적 속성 정의는 속성의 백업 저장소인 정적 필드 myStaticValue가 있는 시나리오를 기반으로 합니다.
static member MyStaticProperty
with get() = myStaticValue
and set(value) = myStaticValue <- value
속성은 배열 형식일 수도 있습니다. 이 경우 해당 속성을 인덱싱된 속성이라고 합니다. 자세한 내용은 인덱싱된 속성(F#)을 참조하십시오.
속성의 형식 주석
대부분의 경우 컴파일러에서 충분한 정보를 활용하여 백업 저장소의 형식으로부터 속성의 형식을 유추할 수 있지만, 형식 주석을 추가하여 형식을 명시적으로 설정할 수도 있습니다.
// To apply a type annotation to a property that does not have an explicit
// get or set, apply the type annotation directly to the property.
member this.MyProperty1 : int = myInternalValue
// If there is a get or set, apply the type annotation to the get or set method.
member this.MyProperty2 with get() : int = myInternalValue
속성 set 접근자 사용
<- 연산자를 사용하여 set 접근자를 제공하는 속성을 설정할 수 있습니다.
// Assume that the constructor argument sets the initial value of the
// internal backing store.
let mutable myObject = new MyType(10)
myObject.MyProperty <- 20
printfn "%d" (myObject.MyProperty)
출력은 20입니다.
추상 속성
속성은 추상일 수 있습니다. 메서드의 경우와 마찬가지로 여기서 추상은 속성과 관련된 가상 디스패치가 있다는 의미입니다. 물론 추상 속성은 동일한 클래스에 정의가 포함되어 있지 않은 진정한 의미에서의 추상일 수도 있습니다. 따라서 이러한 속성을 포함하는 클래스는 추상 클래스입니다. 또는 속성이 가상이라는 데 추상의 의미가 있을 수도 있습니다. 이 경우에는 동일한 클래스에 정의가 있어야 합니다. 추상 속성은 private이 아니어야 합니다. 접근자 중 하나가 추상이면 나머지 접근자도 모두 추상이어야 합니다. 추상 클래스에 대한 자세한 내용은 추상 클래스(F#)를 참조하십시오.
// Abstract property in abstract class.
// The property is an int type that has a get and
// set method
[<AbstractClass>]
type AbstractBase() =
abstract Property1 : int with get, set
// Implementation of the abstract property
type Derived1() =
inherit AbstractBase()
let mutable value = 10
override this.Property1 with get() = value and set(v : int) = value <- v
// A type with a "virtual" property.
type Base1() =
let mutable value = 10
abstract Property1 : int with get, set
default this.Property1 with get() = value and set(v : int) = value <- v
// A derived type that overrides the virtual property
type Derived2() =
inherit Base1()
let mutable value2 = 11
override this.Property1 with get() = value2 and set(v) = value2 <- v