The `get` 키워드 — 속성 접근자
The get 키워드 — 속성 접근자
속성을 만들 때 값을 꺼내는 쪽과 넣는 쪽을 각각 get, set 접근자라고 불러요. 그중 get 키워드는 속성이나 인덱서에서 속성 값·인덱서 요소를 돌려주는 접근자 메서드를 정의해요. 좀 더 자세한 내용은 Properties, Automatically implemented Properties, Indexers 문서를 함께 보면 도움이 돼요.
본문
속성의 get과 set이 그냥 private 백업 필드에 값을 넣고 빼는 일만 한다면, 일일이 코드를 쓸 필요가 없어요. C# 컴파일러가 자동 구현 속성(automatically implemented properties)을 지원하거든요. 아래 예시는 Hours를 자동 구현 속성으로 작성한 모습이에요.
class TimePeriod3
{
public double Hours { get; set; }
}
[!IMPORTANT] 인터페이스 속성 선언이나 partial 속성의 구현 선언에는 자동 구현 속성을 쓸 수 없어요. 컴파일러는 자동 구현 속성 형태의 문법을 '선언하는 선언'으로 해석하지 '구현하는 선언'으로는 해석하지 않아요.
대부분 get 접근자는 값을 하나 돌려주는 단일 문장으로 끝나요. 앞에서 본 예시처럼요. 이럴 땐 접근자를 식 본문 멤버(expression-bodied member)로도 구현할 수 있어요. 아래 예시는 get과 set 둘 다 식 본문 멤버로 만든 건데요.
class TimePeriod2
{
private double _seconds;
public double Seconds
{
get => _seconds;
set => _seconds = value;
}
}
두 접근자 중 하나만 직접 구현해야 할 때도 있어요. 이때는 필드 지원 속성(field backed property)을 써서, 한쪽은 컴파일러가 만들어 주고 다른 한쪽은 손으로 작성할 수 있어요. C# 14에서 추가된 field 키워드로 컴파일러가 합성한 백업 필드에 접근해요.
class TimePeriod4
{
public double Hours {
get;
set => field = (value >= 0)
? value
: throw new ArgumentOutOfRangeException(nameof(value), "The value must not be negative");
}
}
마지막으로, Seconds라는 속성에 get과 set 접근자를 모두 정의한 예시를 볼게요. 속성 값을 받쳐 주는 용도로 _seconds라는 private 필드를 썼어요.
class TimePeriod
{
private double _seconds;
public double Seconds
{
get { return _seconds; }
set
{
if (value < 0)
{
throw new ArgumentOutOfRangeException(nameof(value), "The value of the time period must be non-negative.");
}
_seconds = value;
}
}
}