본문 바로가기

내배켐 Unity TIL

Unity 57일차 TIL - Unity (C# Class 상속)

FSM을 구현하면서 Class 상속에 관련해서 잘못 알고 있었던 부분을 정리해보려고 한다.

 

Public Class A : Monobehavior
{
	public int a = 0;
    public int b = 0;
    protected int c = 0;
    protected int d = 0;
}

public Class B : A
{
	private void Awake()
    {
    	a = 1;
        c = 1;
    }
}

public Class C : A
{
	private void Start()
    {
    	Debug.Log("a : " + a);
        Debug.Log("b : " + b);
        Debug.Log("c : " + c);
        Debug.Log("d : " + d);
    }
}

 

이렇게하면 Class C에서 Debug는 어떻게 나오게 될까? 0 0 0 0 이 나오게 된다.

왼쪽처럼 상속을 받게되면 원본인 A에서 가져다 사용하는 줄 알았었는데, 그것이 아니라 A의 복사본을 B와 C가 가지고 있게 되는 것이였다. 그래서 protected가 상속받은 자식한테 접근을 허용해주는 접근제한자로 알고 있어서 B와 C가 같은 A를 상속 받았으니까 B와 C에서 사용하는 A의 protected 변수가 같은 것인줄 알았는데 그것이 아니였다는 것을 알았다.

 

튜터님께서 이해하기 쉽게 설명해주신 예시로 삼성전자라는 제조사에서 여러가지 모델의 핸드폰을 출시하게 되는데 이때 제조사가 상속받는 Class, 여러가지 모델이 그 Class 안에서 사용하는 변수라고 하셨다.

 

처음에는 잘못된 생각이 박혀있어 쉽게 이해가 되지 않았었는데, 튜터님과 팀원분들의 도움으로 이해가 돼버렸다.

 

추가적으로 만약 상속받은 자식 Class에서 부모 Class의 변수를 공용으로 사용하고 싶다면 Static으로 선언된 변수를 사용해주면 된다.

 

Static이란 정적 변수로 프로그램이 시작되고 끝날 때까지 메모리를 할당 받은 곳에서 사용해서 그 cs파일 내의 모든 함수에서 사용이 가능하다.

 

Public Class A : Monobehavior
{
	public static int a = 0;
    public int b = 0;
    protected static int c = 0;
    protected int d = 0;
}

public Class B : A
{
	private void Awake()
    {
    	a = 1;
        c = 1;
    }
}

public Class C : A
{
	private void Start()
    {
    	Debug.Log("a : " + a);
        Debug.Log("b : " + b);
        Debug.Log("c : " + c);
        Debug.Log("d : " + d);
    }
}

이렇게하면 Class C에서 Debug는 어떻게 나오게 될까? 1 0 1 0 이 나오게 된다.

 

즉 Static 변수로 선언하면 상속받은 B와 C 클래스에서 같은 변수를 사용할 수 있게 된다.