[유니티 / C#] 프로퍼티 (Property)

프로퍼티 (Property)

클래스의 내부에 있는 변수에 참조하거나 값을 할당하기 위해 따로 함수를 만들 필요없이 get / set 메서드를 사용하여 접근하도록 하는 클래스 멤버입니다.

 

프로프티를 사용하면 변수마다 값을 받아오거나 할당하는 함수를 작성할 필요가 없으며

값을 할당할 때 set 문법에서 조건을 만들거나 다른 명령을 동시에 실행할 수 있습니다.

객체지향언어의 특징인 캡슐화를 쉽게 구현할 수 있는 수단입니다.

 

 

프로퍼티 형식

 

프로퍼티는 변수를 선언하는 곳에 중괄호를 이용하여 get, set을 이용하여 작성합니다.

 

●   get : 외부에서 해당 프로퍼티에 접근하여 읽어야 하는 상황에서 호출됩니다.

●   set : 외부에서 해당 프로퍼티에 접근하여 값을 할당하는 상황에서 호출됩니다.

 

Hp 프로퍼티는 get을 통해 hp의 값을 반환하고, set을 통해 전해받은 value 값을 hp 변수에 할당합니다.

아래의 기본 형식을 바탕으로 조건을 통해 value값의 제한을 두거나, hp의 값을 바꾸는 타이밍에 hp UI도 변화를 주는 등의 추가 동작을 쉽게 제어할 수 있습니다.

//프로퍼티 기본 형식
private int hp;
public int Hp
{
    get { return hp; }
    set { hp = value; }
}

//위의 형식을 간략화 한 것
public int Hp { get; set; }

 

 

아래와 같이 Hp의 set 구문에 value의 값이 0 ~ 100 사이만 들어갈 수 있도록 조건을 걸거나

hp에 값이 할당되는 타이밍에 hp UI도 함께 변화를 주는 등의 코드를 작성할 수 있습니다.

private int hp;
public int Hp
{
    get { return hp; }
    set
    {
        if (value < 0)
            value = 0;
        if (value > 100)
            value = 100;

        hp = value;
        
        //hp UI 변화 코드인 것
    }
}

 

이렇게 set 앞에 private를 붙이는 경우엔 외부 클래스에서 변수를 참조할 수는 있지만 변경할 수는 없도록 만들 수도 있습니다.

만약 값을 변경하고 싶은 경우엔 프로퍼티를 선언한 클래스 내부에서 변경하여야 합니다.

private int hp;
public int Hp{ get; private set; }

 

아래와 같이 get; 또는 set;만 사용하여 해당 프로퍼티를 읽기 전용이나 쓰기 전용으로 선언할 수도 있습니다.

//읽기 전용
public int Hp { get; }

//쓰기 전용
public int Hp { set; }

 

 

인터페이스, 추상 클래스의 프로퍼티

인터페이스와 추상 클래스도 프로퍼티 구현이 가능합니다.

 

인터페이스 프로퍼티

 

상속받은 인터페이스에 구현된 모든 프로퍼티를 구현해야합니다.

public interface Action
{
    string ActionName
    {
        get;
        set;
    }
}

public class ActionWalk : Action
{
    private string actionName;
    public string ActionName
    {
        get { return actionName; }
        set { actionName = value; }
    }
}

 

 

추상 클래스 프로퍼티

 

추상클래스 내에서도 프로퍼티를 구현할 수 있으며, 그 프로퍼티가 abstract 키워드 여부에 따라 규칙이 달라집니다.

 

먼저 부모 클래스에서 이미 프로퍼티를 구현한 경우 자식 클래스에서 바로 사용이 가능합니다.

public class Action
{
    //이미 프로퍼티 구현 -> 자식 클래스에서 바로 사용 가능
    private string actionName;
    public string ActionName
    {
        get { return actionName; }
        set { actionName = value; }
    }
}

public class ActionWalk : Action
{
    void GetName()
    {
        string name = base.ActionName;  //부모 클래스 프로퍼티 사용
    }
}

 

 

부모 클래스에서 구현되지 않은 프로퍼티를 가질 경우 자식 클래스는 반드시 해당 프로퍼티를 override 해야합니다.

이를 추상 프로퍼티라고 합니다.

public abstract class Action
{
    //추상 프로퍼티 -> 자식 클래스에서 프로퍼티 구현해줘야 됨
    public abstract string ActionName { get; set; }
}

public class ActionWalk : Action
{
    private string actionName;
    
    //프로퍼티 구현
    public override string ActionName
    {
        get { return actionName; }
        set { actionName = value; }
    }
}