[유니티/C#] Get/Set 프로퍼티와 객체지향 캡슐화

728x90

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은 가져오고 사용할 수도 있는 것을 의미한다고 보면 된다.

728x90