패링 게임 - 5 (프로퍼티)

Labin·2025년 4월 11일

패링 게임

목록 보기
7/14

프로퍼티

유니티(Unity)의 프로퍼티에 대해 상세히 설명해드리겠습니다.

유니티의 프로퍼티

유니티 C#에서 프로퍼티는 클래스의 멤버 변수(필드)에 접근하는 방법을 제공합니다. 프로퍼티를 사용하면 데이터 은닉화와 캡슐화를 통해 코드를 더 안전하고 유지보수하기 쉽게 만들 수 있습니다.

기본 프로퍼티 구문

public class Player : MonoBehaviour
{
    // 기본 필드
    private int health;
    
    // 프로퍼티
    public int Health
    {
        get { return health; }
        set { health = value; }
    }
}

=> 연산자와 자동 구현 프로퍼티의 차이점

1. 자동 구현 프로퍼티 (Auto-implemented Property)

public int Health { get; set; }
  • 컴파일러가 자동으로 백킹 필드를 생성
  • 간결한 코드 작성 가능
  • 단순한 getter/setter가 필요할 때 유용
  • 초기값 설정 가능: public int Health { get; set; } = 100;

2. 람다 식을 사용한 프로퍼티 (=>)

public int Health => _health;
  • 읽기 전용 프로퍼티를 간결하게 표현
  • get { return _health; }와 같은 의미
  • 계산된 값을 반환할 때 유용
  • 다른 필드나 메서드를 기반으로 값을 계산할 수 있음

차이점 상세 비교

  1. 가변성:

    • { get; set; }: 읽기/쓰기 모두 가능
    • =>: 읽기만 가능 (읽기 전용)
  2. 백킹 필드:

    • { get; set; }: 컴파일러가 자동으로 생성
    • =>: 다른 필드나 계산된 값 참조 (별도 백킹 필드 필요)
  3. 사용 사례:

    • { get; set; }: 간단한 데이터 저장/접근
    • =>: 계산된 속성이나 읽기 전용 데이터
  4. 코드 예시:

public class Character : MonoBehaviour
{
    // 백킹 필드
    private int _baseHealth = 100;
    private int _armorBonus = 20;
    
    // 자동 구현 프로퍼티
    public string Name { get; set; } = "Player";
    
    // 읽기 전용 자동 구현 프로퍼티
    public string Id { get; private set; } = System.Guid.NewGuid().ToString();
    
    // 람다 식 프로퍼티 (계산된 값)
    public int TotalHealth => _baseHealth + _armorBonus;
    
    // 람다 식 프로퍼티 (다른 메서드 호출)
    public bool IsAlive => CheckIfAlive();
    
    private bool CheckIfAlive()
    {
        return _baseHealth > 0;
    }
}

유니티에서 프로퍼티를 적절히 사용하면 인스펙터에서 값을 조정하기 쉽고, 코드의 가독성과 유지보수성을 높일 수 있습니다.

백킹 필드(Backing Field)

백킹 필드는 프로퍼티의 값을 실제로 저장하는 private 필드를 말합니다. 프로퍼티가 데이터에 접근하고 조작하는 인터페이스를 제공한다면, 백킹 필드는 그 데이터가 실제로 저장되는 곳입니다.

기본 개념

// 백킹 필드와 프로퍼티의 기본 패턴
private int m_health;         // 백킹 필드
public int Health             // 프로퍼티
{
    get { return m_health; }  // 백킹 필드에서 값을 읽음
    set { m_health = value; } // 백킹 필드에 값을 저장
}

백킹 필드의 주요 특징

  1. 캡슐화: 백킹 필드는 일반적으로 private으로 선언되어 외부에서 직접 접근할 수 없습니다. 프로퍼티를 통해서만 접근 가능합니다.

  2. 명명 규칙: 보통 백킹 필드는 프로퍼티 이름과 연관되게 명명됩니다.

    • m_propertyName
    • _propertyName
    • propertyNameField
  3. 데이터 검증: 프로퍼티 setter에서 백킹 필드에 값을 저장하기 전에 유효성 검사를 수행할 수 있습니다.

    set 
    { 
        if (value >= 0) 
            m_health = value; 
    }

자동 구현 프로퍼티와의 관계

C# 3.0부터 도입된 자동 구현 프로퍼티(Auto-implemented Property)는 백킹 필드를 명시적으로 선언하지 않아도 됩니다:

public int Health { get; set; } // 컴파일러가 자동으로 백킹 필드 생성

이 경우, 컴파일러가 자동으로 숨겨진 백킹 필드를 생성합니다. 개발자는 이 필드에 직접 접근할 수 없고, 오직 프로퍼티를 통해서만 접근이 가능합니다.

유니티에서의 백킹 필드 사용 예시

public class Player : MonoBehaviour
{
    // 명시적 백킹 필드
    [SerializeField] private int m_maxHealth = 100;
    public int MaxHealth 
    {
        get { return m_maxHealth; }
        private set { m_maxHealth = Mathf.Max(1, value); } // 값 검증
    }
    
    // 자동 구현 프로퍼티 (숨겨진 백킹 필드)
    public string PlayerName { get; set; } = "Player";
    
    // 읽기 전용 프로퍼티
    public bool IsDead => CurrentHealth <= 0;
    
    private int m_currentHealth;
    public int CurrentHealth
    {
        get { return m_currentHealth; }
        set 
        { 
            m_currentHealth = Mathf.Clamp(value, 0, MaxHealth);
            // 값이 변경될 때 추가 로직 실행 가능
            if (m_currentHealth <= 0)
                OnPlayerDeath();
        }
    }
    
    private void OnPlayerDeath()
    {
        Debug.Log($"{PlayerName} has died!");
    }
}

백킹 필드의 장점

  1. 데이터 검증: 값 설정 시 유효성 검사 가능
  2. 부수 효과 관리: 값 변경 시 이벤트 발생 또는 다른 작업 수행 가능
  3. 디버깅: 명시적 필드가 존재하므로 디버깅이 더 쉬움
  4. 세밀한 접근 제어: 필드는 private, 프로퍼티는 public으로 설정 가능

백킹 필드는 객체 지향 프로그래밍의 중요한 캡슐화 기법이며, 데이터와 그 데이터를 조작하는 방법을 함께 묶어 안전하고 유지보수하기 쉬운 코드를 작성하는 데 도움을 줍니다.

프로퍼티와 Public 표시 차이

프로퍼티와 public 필드는 유니티 Inspector 창에서 다르게 처리됩니다:
public 필드 vs 프로퍼티 (Inspector 표시)

public 필드:
csharppublic bool isGuarding;

Inspector에 자동으로 표시됨
Editor에서 직접 값 변경 가능

public 프로퍼티:
csharppublic bool isGuarding { get; set; }

기본적으로 Inspector에 표시되지 않음
자동 구현 프로퍼티는 Inspector에서 수정 불가

유니티 Inspector는 기본적으로 필드만 인식하고 프로퍼티는 인식하지 않습니다. 이는 유니티의 직렬화 시스템이 필드 기반으로 작동하기 때문입니다.
프로퍼티를 Inspector에 표시하는 방법
프로퍼티를 Inspector에 표시하고 싶다면 백킹 필드를 만들고 [SerializeField] 속성을 사용해야 합니다:

profile
공부를 기록하는 공간

0개의 댓글