Unity Chapter 7-4. C# 프로그래밍 [중급] (2/2) : 오버라이드

Date:     Updated:

카테고리:

태그:

인프런에 있는 이제민님의 레트로의 유니티 C# 게임 프로그래밍 에센스 강의를 듣고 정리한 필기입니다. 😀
🌜 [레트로의 유니티 C# 게임 프로그래밍 에센스] 강의 들으러 가기!


Chapter 7. C# 프로그래밍 : 중급 (2/2)


🔔 오버라이드

오버라이드란?

부모클래스로부터 물려받은 함수를 자식 클래스에서 덮어 씌워서 자기만의 것으로 재정의 하는것


virtual

virtual : 이 키워드가 붙은 함수는 자식 클래스에서 이 함수를 재정의 할 수 있도록 허용한다.

  • 부모 클래스의 virtual 함수를 자식 클래스에서 꼭 재정의 해야하는 것은 아니다.
    • 자식 클래스에서 재정의(오버라이딩)를 하지 않는다면 부모 클래스의 virtual 함수가 그대로 실행되며
    • 자식 클래스에서 재정의(오버라이딩)를 했다면 자식 클래스가 재정의 한 함수가 실행된다.

📜BaseRotator.h

  • 부모 : 📜BaseRotator.h
    • 자식
      • 📜XRotator.h
      • 📜YRotator.h
      • 📜ZRotator.h
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BaseRotator : MonoBehaviour 
{
    public float speed = 60f;

    protected virtual void Rotate() 
    {
        transform.Rotate(speed * Time.deltaTime, 0, 0); 
    }

    void Update()
    {
        Rotate(); 
    }
}
  • protected virtual void Rotate()
    • 📜BaseRotator 클래스를 상속받는 자식 함수들에서 이 함수를 오버라이딩 하면 자식클래스의 함수가 재정의한 Rotate()가 실행된다.
      • 어떤 방향으로 회전할지 자식들이 각자 알아서 구현하도록 하는 것.
    • 자식 클래스가 오버라이딩 하지 않는다면
      • transform.Rotate(speed * Time.deltaTime, 0, 0);
        • 오버라이딩 안하면 기본으로 X방향으로 회전할 것.

📜BaseRotator.h 스크립트를 오브젝트에 붙이면 1초에 60도로 x 축 회전을 할 것이다.


override

override : 이 키워드가 붙은 함수는 부모클래스로 물려 받은 그 함수를 새롭게 자기만의 방식으로 재정의 했다는 것을 뜻한다.

  • 재정의 하려는 부모 클래스의 함수와 이름, 매개변수 개수와 타입이 동일해야 한다.

📜XRotator.h

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

public class XRotator : BaseRotator
{
    public float speed = 60f;

    void Update()
    {
        Rotate(); 
    }
    protected override void Rotate()
    {
        transform.Rotate(speed * Time.deltaTime, 0, 0);
    }
}
  • 멤버
    • public float speed = 60f; (📜BaseRotator 로부터 물려 받음)
  • 함수
    • void Update() (📜BaseRotator 로부터 물려 받음)
      • 부모 클래스에 Start(), Update()있으면 자식 클래스에선 굳이 Start(), Update() 새로 써주지 않아도 된다. 물려 받으니까!
      • update가 눈에 보이진 않아도 사실 아래나 마찬가지다.
      public class XRotator : BaseRotator
      {
          public float speed = 60f;
      
          void Update()
          {
              Rotate(); 
          }
          protected override void Rotate()
          {
              transform.Rotate(speed * Time.deltaTime, 0, 0);
          }
      }
      
    • protected override void Rotate()
      • 물려 받은 부모 클래스의 Rotate() 함수를 자신만의 방식으로 재 정의 한다.
      • x 축 방향으로 회전하도록

📜XRotator.h 스크립트를 오브젝트에 붙이면 1초에 60도로 x 축 회전을 할 것이다.

📜YRotator.h

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

public class YRotator : BaseRotator
{
    protected override void Rotate()
    {

        transform.Rotate(0, speed * Time.deltaTime, 0);
    }
}
  • 멤버
    • public float speed = 60f; (📜BaseRotator 로부터 물려 받음)
  • 함수
    • void Update() (📜BaseRotator 로부터 물려 받음)
    • protected override void Rotate()
      • 물려 받은 부모 클래스의 Rotate() 함수를 자신만의 방식으로 재 정의 한다.
      • y 축 방향으로 회전하도록

📜YRotator.h 스크립트를 오브젝트에 붙이면 1초에 60도로 y 축 회전을 할 것이다.

📜ZRotator.h

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

public class ZRotator : BaseRotator
{ 
    protected override void Rotate()
    {
        transform.Rotate(0, 0, speed * Time.deltaTime);
    }
}
  • 멤버
    • public float speed = 60f; (📜BaseRotator 로부터 물려 받음)
  • 함수
    • void Update() (📜BaseRotator 로부터 물려 받음)
    • protected override void Rotate()
      • 물려 받은 부모 클래스의 Rotate() 함수를 자신만의 방식으로 재 정의 한다.
      • z 축 방향으로 회전하도록

📜ZRotator.h 오브젝트에 붙이면 1초에 60도로 z 축 회전을 할 것이다.


base

base : 부모 타입의 멤버를 호출한다.

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

public class ZRotator : BaseRotator
{ 
    protected override void Rotate()
    {
        base.Rotate(); // ⭐ 부모의 원래 Rotate()
        transform.Rotate(0, 0, speed * Time.deltaTime);
    }
}
  • base.Rotate();
    • 부모의 원래 Rotate()를 호출한다.
    • 따라서 아래와 같은 모양으로 실행되는거나 마찬가지다.

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      
      public class ZRotator : BaseRotator
      { 
          protected override void Rotate()
          {
              transform.Rotate(speed * Time.deltaTime, 0, 0); // ⭐ 부모의 원래 Rotate()
              transform.Rotate(0, 0, speed * Time.deltaTime);
          }
      }
      

이처럼 오버라이딩시 base와 함께 재정의하면 부모의 원래 내용을 섞어서 재정의할 수 있다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기


Unity Lesson 1 카테고리 내 다른 글 보러가기

댓글 남기기