목표
- 오버라이딩(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()
{
}
}
참고
- 끝가지 공부하고 나면, 어차피 method hiding과 method overriding을 헷갈리게 된다.
- https://www.geeksforgeeks.org/difference-between-method-overriding-and-method-hiding-in-c-sharp/
- overrding과 overloading이 헷갈린다면 어.. 음..
'프로그래밍 > Unity C#' 카테고리의 다른 글
[Unity] Tutorial 06 - Intermediate Scripting (Virtual) (0) | 2020.01.17 |
---|---|
[Unity] Tutorial 06 - Intermediate Scripting (Abstraction) (0) | 2020.01.17 |
[Unity] Tutorial 06 - Intermediate Scripting (Inheritance) (0) | 2020.01.15 |
[Unity] Tutorial 06 - Intermediate Scripting (Generics) (0) | 2019.12.24 |
[Unity] Tutorial 06 - Intermediate Scripting (Overloading) (0) | 2019.12.23 |