상속(Inheritance)

부모클래스로부터 데이터와 기능을 물려받는것.

C#은 다중상속을 지원하지 않는다.(C++은 지원)

부모클래스는 자식 클래스에게 물려주고 싶은 것만 줄 수 있다! → 상속의 내용은 부모가 결정. (접근한정자 public, protected에 한함)

class 파생클래스 : 기반클래스{ 
}

 

< 상속관계에서 생성자와 소멸자 호출 순서 >

- 자식클래스를 생성하면 부모클래스의 생성자가 먼저 호출되고 자식클래스의 생성자가 호출된다.

- 소멸 순서는 자식클래스가 먼저 소멸되고 부모클래스가 나중에 소멸된다.

* 유니티기반에서는 생성자와 소멸자 기능을 이용하는것보다는 유니티 이벤트함수의 호출순서를 고려해 프로그램을 작성한다.

 

생성자 : 클래스의 인스턴스가 생성될 때(new 로 할당될때) 한번 호출됨. 클래스 이름과 동일한 함수 모양임.

소멸자 : 클래스의 인스턴스가 메모리에서 소멸될때 한번 호출됨. ~클래스이름

생성자와 소멸자는 생략할 수 있다.


1. 접근한정자(public, protected)에 따른 접근 권한

임의의 TestClass를 만들었다. 각 멤버변수들은 public, protected, private 한정자를 가진다.

TestClass를 상속받은 A클래스에서 각 변수에 접근하고 있다. 

그러나 data변수는 private이므로 상속되지 않아 접근할 수 없다.

 

2. 상속관계에서 생성자와 소멸자 호출 순서

2-1. 생성자와 소멸자 호출

2-2. A클래스는 TestClass를 상속받는 상태일때 부모의 생성자가 먼저 호출되고 자식의 생성자가 나중에 호출됨을 볼 수 있음

A는 TestClass를 상속받는 클래스임

 

+추가)

MonoBehaviour를 상속받아야 컴포넌트 클래스가 된다. → 유니티상에 게임오브젝트로 추가될 수 있다는 뜻

MonoBehaviour는 컴포넌트 기능을 하는 클래스. 자식클래스는 이 기능을 물려받아 컴포넌트로 작동할 수 있다!

MonoBehaviour를 상속받지 않은 일반 클래스를 게임오브젝트에 컴포넌트로 추가하려고 할때 나오는 경고문

 

 


예제 )

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class A
{
    public virtual void ReadData(string name)
    {
        Debug.Log("A : " + name);
    }

    public void LoadData(string str)
    {
        ReadData(str);
    }
}

public class B : A
{
    public override void ReadData(string name)
    {
        Debug.Log("B : " + name);
    }
}

public class C : A
{
    public override void ReadData(string name)
    {
        Debug.Log("C : " + name);
    }
}

public class InheritExample : MonoBehaviour
{
    void Start()
    {
        B b = new B();
        b.LoadData("test1.txt");

        C c = new C();
        c.LoadData("test2.csv");

        // 다형성 적용한 방식으로 표현하면
        A b1 = new B();
        b1.LoadData("test3.csv");

        A c1 = new C();
        c1.LoadData("test4.csv");
    }

 
}

b.LoadData()를 호출하면 A클래스의 LoadData()로 들어가 ReadData()를 실행한다.

B와 C클래스는 각각 ReadData()를 재정의 했기 때문에 부모의 함수가 아닌 재정의 한 함수를 호출하게 된다. 

 

데이터 타입은 A이지만 b1과 c1은 실제 메모리 할당은 B와 C로 받았다.

 → 동일한 자료구조에 넣을 수 있기 때문에 이러한 형식을 사용한다. Ex) 리스트, 배열 ...

https://bang2019.tistory.com/30

 

클래스의 다형성

Polymorphism public class Base{ } public class Child : Base{ } public class Child2 : Base{ } // 사용시 // 일반적으로 클래스를 사용할때 Base tmp = new Base(); // 다형성을 적용하면 Base tmp = new Chil..

bang2019.tistory.com

https://bang2019.tistory.com/46

 

상속 예제

public class CharacterChild_Idle { Player player = null; public void Init() { player = GameObject.Find("Player").GetComponent (); } } public class CharacterChild_Walk { Player player = null; public..

bang2019.tistory.com

 

'Unity' 카테고리의 다른 글

마우스 입력한 곳으로 움직이기  (0) 2021.05.21
마우스 클릭  (0) 2021.05.21
스택메모리 힙메모리  (0) 2021.04.16
LocalPosition VS WorldPosition  (0) 2021.04.16
Transform? transform?  (0) 2021.04.16

+ Recent posts