Unity Chapter 7-4. C# 프로그래밍 [중급] (2/2) : 오버라이드
카테고리: Unity Lesson 1
태그: C Sharp Unity Game Engine
인프런에 있는 이제민님의 레트로의 유니티 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방향으로 회전할 것.
- transform.Rotate(speed * Time.deltaTime, 0, 0);
- 📜BaseRotator 클래스를 상속받는 자식 함수들에서 이 함수를 오버라이딩 하면 자식클래스의 함수가 재정의한 Rotate()가 실행된다.
📜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 축 방향
으로 회전하도록
- void Update() (📜BaseRotator 로부터 물려 받음)
📜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
와 함께 재정의하면 부모의 원래 내용을 섞어서 재정의할 수 있다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기