본문 바로가기
UNITY/PROJECT

프로퍼티와 public 필드의 차이점

by 램플릿 2024. 10. 29.

예시) 값에 따라 NavMeshAgent의 이동속도를 조절하기 위한 프로퍼티 정의

private bool _isPatrolling;
public bool isPatrolling
    {
        get { return _isPatrolling; }
        set
        {
            _isPatrolling = value;
            if (_isPatrolling)
            {
                agent.speed = patrollSpeed;
                MoveWayPoint();
            }
        }
    }

get

  • 의미: get 접근자는 프로퍼티의 값을 읽을 때 사용됩니다.
  • 작동 방식: get 블록 안의 코드는 프로퍼티를 호출할 때 실행되며, _isPatrolling의 현재 값을 반환합니다.
  • 예시: bool currentPatrolling = myObject.isPatrolling;와 같이 사용하여 _isPatrolling의 값을 얻을 수 있습니다.

set

  • 의미: set 접근자는 프로퍼티의 값을 설정할 때 사용됩니다.
  • 작동 방식: set 블록 안의 코드는 프로퍼티에 값을 할당할 때 실행됩니다. 이 블록에서는 _isPatrolling 변수에 value (새로 할당된 값)를 저장합니다. 추가적으로, _isPatrolling이 true일 경우, 에이전트의 속도와 행동을 설정하는 추가 작업이 수행됩니다.
  • 예시: myObject.isPatrolling = true;와 같이 사용하여 _isPatrolling 값을 설정하고, 이에 따라 에이전트의 속도와 경로 이동을 조정합니다.

요약

  • get은 값을 읽기 위한 것이고, set은 값을 변경할 때의 로직을 정의하는 것입니다. 이를 통해 프로퍼티를 통해 캡슐화를 유지하면서 변수에 대한 제어를 더 세밀하게 할 수 있습니다.

_isPatrolling을 public으로 사용하는 것과 isPatrolling 프로퍼티를 사용하는 것 사이에는 몇 가지 중요한 차이가 있습니다:

1. 캡슐화

  • 프로퍼티 사용: isPatrolling 프로퍼티를 통해 _isPatrolling의 값을 읽고 쓸 수 있습니다. 이 방식은 내부 데이터에 대한 접근을 제어할 수 있게 해줍니다. 예를 들어, set에서 추가적인 로직(예: 속도 설정 및 경로 이동)을 실행할 수 있습니다.
  • public 필드 사용: _isPatrolling을 public으로 만들면, 해당 변수에 직접 접근할 수 있게 됩니다. 이 경우, 외부에서 직접 값을 변경할 수 있기 때문에, 값이 변경될 때 추가 로직을 실행할 수 없습니다.

2. 유효성 검사

  • 프로퍼티 사용: set 내에서 특정 조건을 검사하여 유효한 값만 할당하도록 제어할 수 있습니다. 예를 들어, _isPatrolling이 true일 때만 특정 작업을 실행하게 할 수 있습니다.
  • public 필드 사용: 직접 필드에 접근하면 이러한 유효성 검사를 할 수 없습니다. 외부 코드에서 직접 값을 변경할 경우 예기치 않은 상태가 발생할 수 있습니다.

3. 유지보수

  • 프로퍼티 사용: 코드의 유지보수가 용이해집니다. 나중에 내부 로직을 변경하더라도 외부 인터페이스는 동일하게 유지할 수 있습니다.
  • public 필드 사용: 필드의 구현이 변경되면, 이를 사용하는 모든 코드에서 영향을 받을 수 있습니다.

요약

프로퍼티를 사용하면 데이터의 접근과 수정을 더 안전하고 유연하게 관리할 수 있으며, 내부 구현을 변경하더라도 외부 코드에 미치는 영향을 최소화할 수 있습니다. 반면, public 필드를 사용하면 데이터에 대한 직접적인 접근이 가능하지만, 이로 인해 예기치 않은 동작이나 유지보수의 어려움이 발생할 수 있습니다.

'UNITY > PROJECT' 카테고리의 다른 글

magnitude와 sqrMagnitude  (0) 2024.10.29
Time.deltaTime  (2) 2024.10.22
캐릭터 이동 방식의 장단점  (0) 2024.10.18
Input.GetAxis와 Input.GetAxisRaw  (1) 2024.10.07
파티클에 collider 설정하기  (0) 2024.08.22