본문 바로가기
유니티 최고/유니티 기초

유니티(Unity) 상속에 대해서 + 사용법

by Lee_story_.. 2024. 4. 5.
728x90

 

상속이란 


부모역할을 하는 클래스에서 특정 부분을 자식 클래스에서도 사용할 수 있도록 기능을 공유, 수정하는 기능으로 

 

부모가 자식에게 상속하였다고 표현합니다. 

 

 

 

 

C#에서의 상속은 다음과 같은 기본 구조를 가집니다. 

 

using System;

// 베이스 클래스
class Animal
{
    public string Name = "";
    protected int Age = 0;
}

// 파생클래스
class Dog : Animal
{
    public void WalWal()
    {
        Name = "강아지";
        Console.WriteLine("왈왈" +Name);
    }
}

class Bird : Animal
{
    public void jack()
    {
        this.Name = "새";
        Console.WriteLine("짹짹" + this.Name);
    }
}


    class Program
{

    static void Main(string[] args)
    {
        Bird bird = new Bird();
        Dog dog = new Dog();

        bird.jack();
        dog.WalWal();
        
        Console.WriteLine(bird.Name);
        Console.WriteLine(dog.Name);
    }
}

 

 

유니티도 c#을 사용하기에 사용법은 동일합니다 .

 

그래서 이번엔 좀 더 자세히 다뤄보기로 합시다!

 

 

... 라지만 그렇게 많은 내용이 있진 않습니다!

 

 

 

상속이 어떤식으로 이루어 지는지, 그리고 접근 지정자만 신경 써 주면 될 것 같습니다!

 

 

 

 

 

그럼 시작!

 


가장 먼저 접근 지정자!

 

 

유니티(Unity) 접근 제한자와 프로퍼티에 대해서

이번엔 유니티에서 볼 수 있는 Public Private Protected 등 변수의 제일 앞쪽에 선언되는 키워드들인 접근 제한자에 대해 알아봅시다. 접근제한자란? 스크립트의 변수나 함수, 클래스등의 접근 정도를

ljhyunstory.tistory.com

 

이전 글에서 정리하기도 했지만 다시 한번 상속의 관점에서 바라보면

 

 

 

Public 

자식과 외부 클래스에서 모두 접근가능!

 

Private 

모든 클래스에서 접근 불가능.... 자식도 접근 불가!

 

Protected

외부에서의 접근을 막고, 자식클래스만 사용할 수 있도록 해주는 접근 지정자!

 

 

 

상속을 하는 이유에 대해서 생각해보면.....

외부에서의 접근을 허용하지 않고, 자식에게만 기능과 변수등을 상속하는 Protected를 자주 사용하게 될 것 같습니다!

 

 

++ Protected에서 주의할점!

자식클래스에서 새로 부모클래스를 생성하여 접근하는것은 불가능....

 

자식클래스에서 아래처럼 새로 부모를 생성하여 접근하는건 불가능하다고 합니다..

        ActorMove actormove = new ActorMove();
        actormove.printLog();

  

(저 부모는 현재 자식에 상속해준 부모와 완전 다른 부모라서

안되는게 당연한 것 같기도 하네요!)

 

 

 

 

 

 

그럼 이제 유니티에서 사용해 보겠습니다.


 

 

먼저 부모가 되어줄 스크립을 하나 만들어준 후 기본 구성을 해줍시다. 

 

 

저는 아래와 같이 구성해 주었습니다. 

public class ActorMove : MonoBehaviour
{

    protected float DestroyTime=5.0f;
    protected float speed=1f;
    Coroutine TempCorutine;


    protected void printLog(string text)
    {
        print(text +"  :  "+ gameObject.name);
    }

 

간단하게 이름에 대해서 출력하는 부모 클래스 생성! 

 

 

 

그리고 새로운 스크립에서 다음과 같이 ActorMove를 상속 받는 클래스를 생성해주었습니다.

public class UpdownActor : ActorMove
{
    // Start is called before the first frame update
    void Start()
    {
        printLog("나는!");

 

 

 

이 상태로 실행하면

 

아래처럼 각각의 큐브가 부모에게서 printLog함수를 상속받아 사용하는 것을 볼 수 있습니다 .

 

 

 

여기서 좀 더 나아가 보겠습니다

 

virtual 과 override !

두 요소는 함수를 구성할때 사용하는 요소들로 

override의 경우 중복 정의를 위해 많이들 사용하는 기능입니다!

 

C#에서도 동일한 기능으로 사용되는데,

 

상속에서는 어떤 경우에 사용될까.....

물론 부모와 자식간의 동일한 이름의 함수가 발생할 수 도 있지만 이경우를 피해주면 되지않을까..?

 

 

 

그렇긴 하지만 부모와 자식함수에서 동일한 함수를 사용할 수 밖에 없는 경우가 있습니다. 

바로 Start, awake, update와 같은 기본 함수들입니다.

 

부모는 상속을 하게되면 부름만 받게되고 실상은 실행되지 않습니다. 

그래서 이것들을 만약 실행하고 싶다면, 자식에서 불러와 실행해야하는데....

이미 Start함수가 있기에 곤란합니다... 그래서! Virual, Override를 사용하는것!

 

 

 

 

 

 

그럼 다시 코드 시작!


이전에 사용한 코드에서 각각 Start함수를 구성해줍시다 .

 

부모에서는 아래처럼

자식에서접근가능하도록  protected로 지정해주고 virtual로 설정하여 가상함수로 만들어 줍시다.

    protected virtual void Start()
    {
        print("부모");
    }

 

 

 

다음 자식에서는 

Start함수를 override 처리해주고 

base.Start를 통해 부모의 Start함수를 실행 시켜 줍시다.

    protected override void Start()
    {
        base.Start();

 

 

 

 

 

실행결과는 아래와 같습니다!

 

 

 

 

 

 

여기까지가 끝! 

 

이때까지 무심코 사용중에 있었는데 이참에 정리하게 되서 좀 더 알아가는 부분이 있었던 것 같습니다. 

상속을 좀 더 효율적으로 사용할 수 있다면 코드 자체도 정리되고 약간 체계적으로 구성 할 수 있을 것 같습니다!

(자주 사용해봐야겠다... ㅎ)

 

 

 

 

 

 

 

 

 

틀린 점이 있다면 댓 달아주세요!

 

 

 

 

댓글