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] + 프로퍼티 |
'Dev > Unity(C#)' 카테고리의 다른 글
[Unity] 민감한 내용을 포함한 프로젝트의 깃허브 업로드 '.env' (0) | 2025.04.03 |
---|---|
유니티 VFX Mesh 의 인스펙터에서 Surface Options가 보이지 않는 문제 (0) | 2024.11.11 |
유니티 vfx graph 에서 셰이더 그래프를 사용할 수 없는 문제 (1) | 2024.11.11 |
[UI Toolkit] 일반적으로 런타임 중 UXML(VisualTreeAsset)의 동적 생성은 불가능 (0) | 2024.08.17 |
UI Toolkit, Height 사이즈 조정이 안되는 문제 (0) | 2024.07.20 |