내가 필드(멤버 변수)를 관리하는 방법

Unity3D 팁

2018. 10. 23. 17:37

1. 접근 범위는 최대한 좁게

외부에서 접근할 일 없는 건 private, 자식 클래스가 사용할 거면 protected, 아니면 public.

가능한 한 접근 제한은 빡빡하게 해 준다. 이거는 OOP의 기본이므로 특별할 건 없다.


2. public 필드는 되도록이면 Property로

외부에서 접근 가능한 필드는 항상 값이 변경될 가능성이 열려있으므로 이것을 통제할 수단이 필요하다.

그래서 되도록이면 Property로 선언해서 setter의 접근 범위를 지정해 준다.

// 외부에서 접근 가능하지만 수정은 불가능.
public Health { get; private set; }


3. 유니티 인스펙터에 노출시키고 싶을 경우 [SerializeField]

인스펙터에 노출시키고 싶은데 외부에서 접근할 필요는 없어서 굳이 public으로 선언하고 싶지 않을 때가 많다.

그럴 땐 private으로 하고 [SerializeField] 어트리뷰트를 붙여준다.

이러면 인스펙터에 노출되는 것과 그렇지 않은 것들을 명확하게 구분할 수 있는 장점도 있다.

[SerializeField]
private GameObject _prefab;
[SerializeField]
private float _speed;


4. 값이 변하지 않을 경우 readonly

readonly 키워드는 해당 필드를 '선언시, 또는 생성자에서 한 번 초기화된 후에는 수정이 불가능' 하게 만든다.

그렇기 때문에 값이 변하지 않는 필드마다 readonly를 붙여주면 문법적으로도 신뢰성이 높아지고

값이 변하지 않는다는 것을 명시할 수 있어서 좋다.

// 리스트의 내용물들은 변하지만 리스트 인스턴스 자체는 변하지 않는다.
public readonly List mobs = new List();


5. 예시

전에 작성했던 코드들 중에서 아무거나 짚이는대로 가져와 보았다.

위에 나열한 습관이 모든 경우를 다 커버하지는 않지만 대체로 이렇게 보기좋게 정리되는 편.

[SerializeField]
private YukaNetView _view;
[SerializeField]
private NetworkPlayerManager _playerManager;
[SerializeField]
private TextAsset _configFile;
private readonly Queue _operationQueue = new Queue();

public ServerConfig config { get; private set; }
public NetworkPlayerManager playerManager { get { return _playerManager; } }
public List playerList { get { return playerManager.playerList; } }
public int playerCount { get { return playerList.Count; } }
public NetworkPlayer myPlayerInstance { get { return playerManager.myPlayerInstance; } }
public string ip { get; private set; }
public int port { get; private set; }