목표

  • 오버라이딩(Overriding) 대해 알아보자.

무식한데 무조건 하라고 하는 상사들이 있다.

오버라이딩

  • 오버라이딩은 클래스간 상속 관계에서 메서드를 재정의 하는 기법이다.

오버라이딩의 예시

  • 부모 클래스는 virtual로 메서드를 선언할 수 있다.
  • 자식 클래스는 override 키워드로 메서드를 재정의 할 수 있다.
  • 반드시 재정의해야 하는 것은 아니고, 재정의 하지 않는다면 부모의 메서드를 호출하게 된다.

Vehicle

  • 가장 기본이 되는 탈것에 대한 클래스를 정의해 보았다.
  • 이때 이상한 점은 모든 탈것에 Attack 기능이 있다는 것이다.
    • 이 경우, 전투(combat vehicle)와 화물(freight vehicle)로 vehicle을 세분화 할 수 있다.
    • 또 시동만 거는 기능만으로는 불충분 하기 때문에, Start Engine, Stop Engine 등의 기능으로 세분화 될 필요가 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Vehicle
{
    public virtual void Start()
    {
        Debug.Log("Vehicle Start");
    }

    public virtual void Attack()
    {
        Debug.Log("Vehicle Attack?");
    }
}

Helicopter

  • 헬리콥터의 경우 시동 상승, 하강, 공격 기능이 있다.
  • 이때 base 키워드를 사용하여 부모 클래스를 실행 시킬 수 있다.
  • Start와 Attack의 경우, 부모 클래스에서 virtual로 선언된 함수이기 때문에 override 키워드를 사용하여 재정의 하였다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Helicopter : Vehicle
{
    public override void Start()
    {
        base.Start(); // Vehicle Start
        Debug.Log("Helicopter Start");
    }

    public override void Attack()
    {
        base.Start(); // Vehicle Attack
        Debug.Log("Helicopter Attack");
    }

    public void Upward()
    {
        Debug.Log("Helicopter Upward");
    }

    public void Downward()
    {
        Debug.Log("Helicopter Downward");
    }
}

Tank

  • 탱크의 경우 시동, 공격, 가속, 정지 기능을 구현하였다.
  • 헬리콥터와 마찬가지로 시동과 공격은 부모 클래스의 함수를 재정의 하였다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Tank : Vehicle
{
    public override void Start()
    { 
        Debug.Log("Tank Start");
    }

    public override void Attack()
    {
        Debug.Log("Tank Attack");
    }

    public void GasPadal()
    {
        Debug.Log("Tank Attack");
    }

    public void Break()
    {
        Debug.Log("Tank Break");
    }
}

Truck

  • 트럭의 경우 시동만 재정의하였다.
  • Truck은 Vehicle을 상속받았기 때문에 Attack이라는 함수를 가지고 있다.
  • Attack을 재정의 하지 않았기 때문에 공격을 수행하면 Vehicle의 Attack이 호출된다.
  • 여기서 알아야 하는 점은, 부모 클래스에서 virtual 키워드로 선언한 함수는 자식 클래스에서 반드시 재정의 하지 않아도 된다는 것이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Truck : Vehicle
{
    public override void Start()
    { 
        Debug.Log("Truck Start");
    } 

    public void GasPadal()
    {
        Debug.Log("Truck GasPadal");
    }

    public void Break()
    {
        Debug.Log("Truck Break");
    }
}

샘플

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

public class VehicleSample : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Helicopter helicopter = new Helicopter(); 
        helicopter.Start(); // Helicopter Start
        helicopter.Upward(); // Helicopter Start
        helicopter.Downward(); // Helicopter Start
        helicopter.Attack(); // Helicopter Start

        Tank tank = new Tank();
        tank.Start(); // Tank Start
        tank.GasPadal(); // Tank GasPadal
        tank.Break(); // Tank Break
        tank.Attack(); // Tank Attack

        Truck truck = new Truck();
        truck.Start(); // Truck Start
        truck.GasPadal(); // Truck GasPadal
        truck.Break(); // Truck Break
        truck.Attack(); // Vehicle Attack
    }

    // Update is called once per frame
    void Update()
    {

    }
}

참고

+ Recent posts