Game Development, 게임개발/개발

Overriding, 덮어쓰기, 오버라이딩 [Unity]

게임이 더 좋아 2021. 3. 27. 23:16
반응형
728x170

 

OOP의 큰 특징 중 하나인 오버라이딩에서 알아보자

얘 덕분에 할 일이 많이 줄어들 수 있었다.

 

알아보자


 

정의부터하자

간단하게 말하면 부모클래스에서 정의된 메서드를 자식클래스에서 재정의 하는 것이다.

 

즉, 부모클래스에서 받은 메서드 중 

자식 클래스에서 더 자세하게 기능을 구현하고 싶다면

overriding을 통해서 구현할 수 있다.

하지만 그렇다고 부모클래스의 정보까지 잃어버리는 것은 아니다.

 

기본적으로 Overriding을 하기 위해서

부모클래스의 메서드는 virtual로 선언이 되어야 하고

자식클래스의 메서드는 override로 선언되어 있어야 한다.

또한 위에서 말했다시피 부모클래스의 정보를 잃어버리는 것은 아닌데

이 또한 base 키워드로 다시 오버라이딩 된 메서드가 아닌 상속 받은 메서드를 불러낼 수 있다.

 

 

예시를 보면서 이해해보자

 

Fruit

using UnityEngine;
using System.Collections;

public class Fruit 
{
    public Fruit ()
    {
        Debug.Log("1st Fruit Constructor Called");
    }

    //Virtual로 선언이 되어서 자식클래스에서 Overriding을 할 수 있게 되었다.
    public virtual void Chop ()
    {
        Debug.Log("The fruit has been chopped.");        
    }

    public virtual void SayHello ()
    {
        Debug.Log("Hello, I am a fruit.");
    }
}

 

Apple

using UnityEngine;
using System.Collections;

public class Apple : Fruit 
{
    public Apple ()
    {
        Debug.Log("1st Apple Constructor Called");
    }

    //부모클래스에서 virtual로 선언이 되었기에 overriding이 가능하다.
    public override void Chop ()
    {
        base.Chop(); // 하지만 base 키워드를 사용하여 기존 부모클래스의 메서드도 사용가능하다.
        Debug.Log("The apple has been chopped.");        
    }

    public override void SayHello ()
    {
        base.SayHello();
        Debug.Log("Hello, I am an apple.");
    }
}

 

Fruit Salad

using UnityEngine;
using System.Collections;

public class FruitSalad : MonoBehaviour 
{    
    void Start () 
    {
        Apple myApple = new Apple();// 자식 타입의 자식 객체

        // 오버라이딩 된 메서드가 실행된다.
        myApple.SayHello(); 
        myApple.Chop();    

        //오버라이딩이 역시나 다형성에 유용하게 쓰이는데
        Fruit myFruit = new Apple(); // 부모 타입의 자식객체지만 (업캐스팅)
        myFruit.SayHello(); // 오버라이딩된 메서드가 실행된다.
        myFruit.Chop();
    }
}

 


참고링크

learn.unity.com/tutorial/overriding

 

728x90
반응형
그리드형