자동 구현 프로퍼티의 'set' 단계 한계와 대안

1. 개요

C#의 프로퍼티는 일반 필드처럼 값을 읽고 쓸 수 있지만, set 블록에서 추가 연산을 한 뒤 그 결과를 저장하려고 하면 구현 방식에 따라 제약이 생긴다. 자동 구현 프로퍼티의 경우 내부 백킹 필드에 직접 접근할 수 없기 때문에, hp = editedValue와 같은 대입이 불가능하다.


2. 예시: 일반 필드와의 차이

// 일반 필드 + 프로퍼티
private int hp;
public int Hp
{
    get => hp;
    set
    {
        int editedValue = Math.Max(0, value);
        hp = editedValue; // 가능
    }
}

// 자동 구현 프로퍼티
public int Hp { get; set; } = 100;

set
{
    int editedValue = Math.Max(0, value);
    hp = editedValue; // hp라는 이름의 필드가 없음. 컴파일 에러.
}

자동 구현 프로퍼티는 컴파일러가 내부 백킹 필드를 자동 생성하지만, 이름이 숨겨져 있어 코드에서 직접 접근할 수 없다.


3. 설계 이유

자동 구현 프로퍼티는 간결한 문법으로 단순 저장 기능을 제공하기 위한 것이다. set 내부에서 로직이 필요하다면 자동성은 포기하고 명시적 백킹 필드를 사용해야 한다.


4. 대안

① 명시적 백킹 필드 작성

private int _hp = 100;
public int Hp
{
    get => _hp;
    set => _hp = Math.Max(0, value);
}

② 자동 프로퍼티 + private set + 메서드

public int Hp { get; private set; } = 100;
public void SetHp(int value)
{
    Hp = Math.Max(0, value);
}

③ C# 13 이상: field 키워드

public int Hp
{
    get;
    set => field = Math.Max(0, value);
} = 100;

④ 유니티: [SerializeField] + 프로퍼티

[SerializeField] private int hp = 100;
public int Hp
{
    get => hp;
    set => hp = Mathf.Max(0, value);
}

5. 요약

상황 추천 방식
단순 저장 자동 구현 프로퍼티
set 로직 필요 명시적 백킹 필드
최신 C# 버전 사용 field 키워드
유니티 + 인스펙터 노출 [SerializeField] + 프로퍼티