속성(Property)
겉으로 보기에는 필드 같으나 내부적으로는 메서드처럼 논리 코드를 가진 멤버
아래 코드만 봐서는 필드인지 속성인지 구별이 불가능함
Stock msft = new Stock(); msft.CurrentPrice=30; msft.CurrentPrice-=3; Console.WriteLine(msft.CurrentPrice);
만일 여기서 CurrentPrice가 속성일 때 구현 예시는 아래와 같다.
public class Stock { decimal currentPrice; // 전용 필드 public decimal CurrentPrice // 공용 속성 { get { return currentPrice; } set { currentPrice=value; } } }
속성도 필드처럼 그 형식과 이름을 지정해 선언하나,
그 다음에 get/set 블록(속성의 접근자)가 붙음.
get은 속성을 읽을 때 실행하며, 속성 형식과 같은 형식의 값을 반환해야 함.
set은 속성에 값을 배정할 때 실행하며, 암묵적으로 접근자는 속성과 같은 형식의 value라는 매개변수가 있음.
접근 방식이 필드와 유사하나, 속성은 그 값의 설정과 조회 방식을 완전히 제어할 수 있음.
이런 제어 능력을 프로그래머는 내부적인 세부사항을 속성의 사용자에게 노출하지 않고도
속성의 내부 표현 방식을 마음대로 결정 가능.
- 수정자
static
public internal private protected
new virtual abstract override sealed
unsafe extern
- 읽기 전용 속성과 계산된 속성
get 접근자만 지정하면 읽기 전용 속성
set만 지정하는 경우 쓰기 전용 속성
일반적으로 속성에는 바탕 자료의 저장에만 쓰이는 backing 필드가 존재
속성 당 하나씩 사용하는 경우가 많으나 여러 필드로 계산한 값을 사용하는 것도 가능
- 식 본문 속성 : C# 6
C# 6에서부터는 앞에 나온 것과 같은 읽기 전용 속성 간결한 정의가 가능
이를 식 본문 속성(expression-bodied property)라고 부름
중괄호와 get, return을 '=>'로 대체
public decimal Worth { get { return currentPrice * sharesOwned; } }
public decimal Worth => currentPrice * sharesOwned;
- 자동 속성(automatic property) : C# 3.0
컴파일러가 자동으로 생성하게 하는 것이 가능
컴파일러는 속성 값을 담을 private backing field를 자동으로 생성
컴파일러가 내부적으로 일므을 결정해 코드에서 지칭 불능
다른 타입들이 읽기 전용으로 사용할 속성을 만들기 위해서는,
set 접근자에 private, protected를 지정하면 됨
- 속성 초기치(property initializer) : C# 6
자동 속성에도 필드에 하는 것처럼 초기치를 지정하여 붙일 수 있음
읽기 전용인 자동 속성에도 초기치를 붙일 수 있음
읽기 전용 필드와 마찬 가지로, 읽기 전용 자동 속성의 값을 형식의 생성자에서 배정하는 것도 가능하며,
immutable 형식(read-only 형식)을 만들 때 유용
public decimal CurrentPrice { get; set; } = 123;
해당 코드는 CurrentPrice를 123으로 초기화
- get/set 접근자의 접근성
get/set 접근 수준을 다르게 설정하는 것도 가능
흔히 public 속성의 set만 internal이나 private 접근 수정자를 지정하는 방식 사용
- CLR 속성 구현
C# 속성 접근자들은 내부적으로 이름이 get_XXX, set_XXX 형태의 메서드로 컴파일
비가상(nonvirtual) 속성 접근자들은 JIT(Just-In-Time) 컴파일러가 인라인화(inlining)
인라인화는 메서드 호출을 그 메서드의 본문으로 대체하는 최적화 기법으로,
속성 접근과 필드 접근의 성능상의 차이가 사라지게 함
WinRT 속성의 경우 컴파일러는 set_XXX 대신 put_XXX 형태의 이름을 정의해 사용
'정리가 필요한 카테고리(추후 정리) > C#,Unity' 카테고리의 다른 글
C#] 상수(Constant) (0) | 2017.01.15 |
---|---|
C#] 인덱서(Indexer) (0) | 2017.01.14 |
C#] 인스턴스 생성자 (0) | 2017.01.12 |
C#] namespace 규칙 (0) | 2017.01.09 |
C#] using static 지시자 (0) | 2017.01.08 |