Get/Set 프로퍼티와 객체지향 캡슐화
객체지향의 3요소는 캡슐화, 상속, 다형성이다.
상속
상속의 대표적인 예시는 C# 스크립트의 첫 장면에서 확인할 수 있다. 스크립트를 생성하면 Class AA : MonoBehaviour라고 상단에 표시된다. 이는 AA 라는 클래스가 MonoBehaviour라는 부모 클래스를 상속 받은 개념이다. MonoBehaviour에 마우스 커서를 대고 F12를 누르면 MonoBehaviour 클래스를 볼 수 있는데 MonoBehaviour 클래스 역시 Behaviour를 상속받은 것을 확인할 수 있다. 이 역시 들어가보면 Component 클래스를 상속 받고 있고, Component 클래스 역시 Object 클래스를 상속 받은 것을 확인할 수 있다. 즉, 객체 지향에서 사용되는 모든 것들은 '객체'이기 때문에 스크립트 역시 Component 객체처럼 사용할 수 있다. 우리가 GetComponent<>의 <> 안에 스크립트를 선언할 수 있는 것도 그 이유이다.
캡슐화
캡슐화는 내부적으로만 알아볼 수 있도록 은닉하는 기능고 가장 대표적인 예시는 Get/Set 프로퍼터이다. 이 프로퍼티는 외부적으로는 변수처럼 선언하지만 그 안 함수로 돌아가는 것으로 C#에서만 제공하는 기능이다.
예를 들어, 플레이어의 체력을 감소시키는 스크립트는 함수로만 구현했을 때 다음과 같다.
public void SetHP(int value)
{
hp = value;
// 만약 체력이 다 됐다면
if (hp <= 0)
{
// 갸도 죽고
Destroy(gameObject);
}
}
public int GetHP()
{
return hp;
}
PlayerHealth ph = collision.gameObject.GetComponent<PlayerHealth>();
if(ph)
{
// 체력을 감소시키고 싶다
// hp 값을 가져와서 -1 해서 hp에 적용해달라고 하고 싶다
ph.SetHP(ph.GetHP() - 1);
}
물론, 다음과 같이 코드를 작성해도 좋지만, Get/Set프로퍼티를 사용하면 훨씬 더 직관적으로 사용할 수 있다.
public int HP
{
get // 구현부
{
return hp;
}
set
{
hp = value;
// value는 get/set 프로퍼티 내부에서 사용하는 변수
// hp에 넣어준 값 사용
// 만약 체력이 다 됐다면
if (hp <= 0)
{
// 갸도 죽고
Destroy(gameObject);
}
}
}
PlayerHealth ph = collision.gameObject.GetComponent<PlayerHealth>();
if(ph)
{
ph.HP--;
}
정리하자면 Get/Set 프로퍼티는 보기에는 변수이지만 내부적으로는 함수로 돌아간다. 따라서 매우 직관적이고 함수이기 때문에 다른 스크립트나 UI에도 사용할 수 있는 등 재사용성이 좋다.
알고보면 Get/Set 프로퍼티는 다양한 곳에 사용되고 있다. bullet을 움직이기 위해 Update()문에서 transfom.position을 설정해 줄 때 transform에 마우스를 대보면 { get; }, position에 마우스를 대보면 { get; set; } 프로퍼티가 사용되고 있음을 확인할 수 있다. 즉, transform은 가져올 수 있고, position은 가져오고 사용할 수도 있는 것을 의미한다고 보면 된다.
'게임 프로그래밍 > 유니티 프로젝트' 카테고리의 다른 글
[Unity] 유니티 게임 개발 프로젝트 협업 방식과 MVC 패턴 이해 (0) | 2022.09.28 |
---|---|
[유니티/C#] 메모리 정적 & 동적 할당과 유니티 내 싱글톤(Singleton) 패턴의 활용 (0) | 2022.09.27 |
[Unity Error] 유니티 == 비교 연산자와 관련된 랜덤 버그 발생 원인과 방어코드 사용한 해결 방법 (0) | 2022.09.27 |
[유니티/C#] this 키워드와 이벤트 함수 (0) | 2022.09.26 |
[유니티/C#]배열과 리스트를 사용한 오브젝트 풀링, 가비지 콜렉팅을 통한 메모리 최적화 (0) | 2022.09.26 |