유니티(Unity)의 프로퍼티에 대해 상세히 설명해드리겠습니다.
유니티 C#에서 프로퍼티는 클래스의 멤버 변수(필드)에 접근하는 방법을 제공합니다. 프로퍼티를 사용하면 데이터 은닉화와 캡슐화를 통해 코드를 더 안전하고 유지보수하기 쉽게 만들 수 있습니다.
public class Player : MonoBehaviour
{
// 기본 필드
private int health;
// 프로퍼티
public int Health
{
get { return health; }
set { health = value; }
}
}
public int Health { get; set; }
public int Health { get; set; } = 100;public int Health => _health;
get { return _health; }와 같은 의미가변성:
{ get; set; }: 읽기/쓰기 모두 가능=>: 읽기만 가능 (읽기 전용)백킹 필드:
{ get; set; }: 컴파일러가 자동으로 생성=>: 다른 필드나 계산된 값 참조 (별도 백킹 필드 필요)사용 사례:
{ get; set; }: 간단한 데이터 저장/접근=>: 계산된 속성이나 읽기 전용 데이터코드 예시:
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;
}
}
유니티에서 프로퍼티를 적절히 사용하면 인스펙터에서 값을 조정하기 쉽고, 코드의 가독성과 유지보수성을 높일 수 있습니다.
백킹 필드는 프로퍼티의 값을 실제로 저장하는 private 필드를 말합니다. 프로퍼티가 데이터에 접근하고 조작하는 인터페이스를 제공한다면, 백킹 필드는 그 데이터가 실제로 저장되는 곳입니다.
// 백킹 필드와 프로퍼티의 기본 패턴
private int m_health; // 백킹 필드
public int Health // 프로퍼티
{
get { return m_health; } // 백킹 필드에서 값을 읽음
set { m_health = value; } // 백킹 필드에 값을 저장
}
캡슐화: 백킹 필드는 일반적으로 private으로 선언되어 외부에서 직접 접근할 수 없습니다. 프로퍼티를 통해서만 접근 가능합니다.
명명 규칙: 보통 백킹 필드는 프로퍼티 이름과 연관되게 명명됩니다.
m_propertyName_propertyNamepropertyNameField데이터 검증: 프로퍼티 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!");
}
}
백킹 필드는 객체 지향 프로그래밍의 중요한 캡슐화 기법이며, 데이터와 그 데이터를 조작하는 방법을 함께 묶어 안전하고 유지보수하기 쉬운 코드를 작성하는 데 도움을 줍니다.
프로퍼티와 public 필드는 유니티 Inspector 창에서 다르게 처리됩니다:
public 필드 vs 프로퍼티 (Inspector 표시)
public 필드:
csharppublic bool isGuarding;
Inspector에 자동으로 표시됨
Editor에서 직접 값 변경 가능
public 프로퍼티:
csharppublic bool isGuarding { get; set; }
기본적으로 Inspector에 표시되지 않음
자동 구현 프로퍼티는 Inspector에서 수정 불가
유니티 Inspector는 기본적으로 필드만 인식하고 프로퍼티는 인식하지 않습니다. 이는 유니티의 직렬화 시스템이 필드 기반으로 작동하기 때문입니다.
프로퍼티를 Inspector에 표시하는 방법
프로퍼티를 Inspector에 표시하고 싶다면 백킹 필드를 만들고 [SerializeField] 속성을 사용해야 합니다: