포스트

Property (프로퍼티)

Property (프로퍼티)

머리말


Property (프로퍼티)


  • 클래스 속성
    • 흔히 get, set을 정의 해주는 간편한 예약어이다.
  • 프로퍼티는 근본적으로 메서드 ?

get/set


public 필드 쓰지 않고, get/set 메서드 쓰는 이유 -> OOP 정보 은닉 지키기 위함.
데이터를 외부로부터 보호, 클래스가 허용한 안전한 방식으로만 상호작용하도록 제어.

  • 이점
    • 데이터 무결성
    • 유지보수
    • 구현의 자유

1. 데이터 무결성

public 필드는 외부에서 아무 제약 없이 값 수정 가능
객체의 상태를 논리적으로 허용되지 않는 값으로 설정할 수 있음. (예: 체력 음수)

반면, set에서 유효성 검사하면 데이터의 무결성 보장 가능.

1
2
3
4
public void SetHealth(int value)
{
    this.health = Mathf.Max(0, value);
}

2. 유지보수

값이 변경될 때마다 추가 작업이 필요해진다면 (예: UI 업데이트, 로그)
public 필드는 값 설정하는 모든 코드 찾아 수정해야 함.

반면, set은 내부만 수정하면 돼서 쉽고 안전함.

1
2
3
4
5
6
public void SetHealth(int value)
{
    this.health = value;
    UpdateHealthUI(); // UI 업데이트 추가
    Log.Write($"Health changed to {this.health}"); // 로그 추가
}

3. 구현의 자유

get, 단순히 필드 값을 반환하는 것 이상의 작업 가능.

  • 여러 필드를 조합해 계산된 값을 반환
  • 지연 초기화, 필요할 때만 데이터 생성

왜 프로퍼티


get/set 이쁘게 만들 수 있음.
또한, 객체의 상태, 접근 제어된다는 의도를 명확히 드러냄.

당장 get, set 필요없어도, 프로퍼티로 먼저 만들어둔다면..
나중에 요구 사항 바뀔 때, API 외관 그대로 유지하고 내부 구현만 수정 가능.

1
2
// 처음엔 자동 구현 프로퍼티
public int Health { get; set; }
1
2
3
4
5
6
7
8
9
10
11
// 이후 기능 추가
private int _health;
public int Health
{
    get => _health;
    set
    {
        _health = Math.Max(0, value); // 유효성 검사
        OnHealthChanged();            // 이벤트 호출
    }
}

또, 소소한 이점.
IDE 기능을 통해 해당 변수가 어디에서 어떻게 사용되고 있는지 알고 싶을 때에도 유용.
get, set 분리되어 있어서, 어디서 ‘참조’하고 있는지, 어디서 ‘설정’하고 있는지 별개로 확인할 수가 있다.
public 필드는 값 접근/설정이 한 번에 보여서, 큰 프로젝트에서는 원하는 것 찾기 힘듦.

응용


1
2
3
public int SomeValue0 { get; set; }
public int SomeValue1 { get; private set; }
[field: SerializeField] public int SomeValue2 { get; private set; }

get, set 마다 접근제한자를 따로 지정해줄 수 있다.

위처럼 getpublic, setprivate로 만들어게 되면, 해당 property는 선언된 클래스 안에서는 set이 가능하지만, 외부에서는 get만 가능하도록 만들어줄 수 있다.

Unity에서는 [field: SerializeField]를 통해 인스펙터에서는 값 설정이 가능하도록 만들 수 있다. 물론 외부 클래스에서는 여전히 set이 불가능하다.

메모


  • 키워드
    • Property (프로퍼티)
  • TODO: 꼬리질문
    • How SerializeField works
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.