The `get` 키워드 — 속성 접근자

The get 키워드 — 속성 접근자

속성을 만들 때 값을 꺼내는 쪽과 넣는 쪽을 각각 get, set 접근자라고 불러요. 그중 get 키워드는 속성이나 인덱서에서 속성 값·인덱서 요소를 돌려주는 접근자 메서드를 정의해요. 좀 더 자세한 내용은 Properties, Automatically implemented Properties, Indexers 문서를 함께 보면 도움이 돼요.

출처: C# The get keyword

본문

속성의 getset이 그냥 private 백업 필드에 값을 넣고 빼는 일만 한다면, 일일이 코드를 쓸 필요가 없어요. C# 컴파일러가 자동 구현 속성(automatically implemented properties)을 지원하거든요. 아래 예시는 Hours를 자동 구현 속성으로 작성한 모습이에요.

class TimePeriod3
{
    public double Hours { get; set; }
}

[!IMPORTANT] 인터페이스 속성 선언이나 partial 속성의 구현 선언에는 자동 구현 속성을 쓸 수 없어요. 컴파일러는 자동 구현 속성 형태의 문법을 '선언하는 선언'으로 해석하지 '구현하는 선언'으로는 해석하지 않아요.

대부분 get 접근자는 값을 하나 돌려주는 단일 문장으로 끝나요. 앞에서 본 예시처럼요. 이럴 땐 접근자를 식 본문 멤버(expression-bodied member)로도 구현할 수 있어요. 아래 예시는 getset 둘 다 식 본문 멤버로 만든 건데요.

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라는 속성에 getset 접근자를 모두 정의한 예시를 볼게요. 속성 값을 받쳐 주는 용도로 _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;
        }
    }
}

더 알아보기