부모 클래스의 기능을 자식에서 덮어써서 자신만의 기능으로 만드는 것
키워드
부모 : virtual
자식 : override
에디터 : 객체 생성
코드 생성
public class BaseRotator : MonoBehaviour
{
public float speed = 60f;
// Update is called once per frame
void Update()
{
Rotate();
}
protected void Rotate()
{
transform.Rotate(speed * Time.deltaTime, 0, 0);
}
}
이후 Cube 객체에 위 스크립트 추가.
실행 결과
큐브가 X축을 기준으로 회전하는 모습이 나타난다.
여기서 x축이 아니라 다른 각도로 회전을 하게 하고 싶다면 어떡할까?
Y축으로 회전하게 해서 YRotator, Z축으로 회전하게 해서 ZRotator 라고 스크립트를 새로 쓸 수도 있지만
비효율적이고 번거롭다.
우리는 같은 코드를 반복해서 작성하는 것을 싫어한다.
따라서, 기존에 작성한 BaseRotator 에 '회전한다' 라는 코드가 들어있으니 '회전 방식' 만 바꾸어 코드를 만들면 어떨까?
회전한다 : Update() 내부의 Rotate() 함수 호출 부분
회전 방식 : Rotate() 함수의 내부 코드
코드 수정
protected virtual void Rotate() { ~ }
함수의 타입 앞에 "virtual" 이라는 키워드를 추가한다.
Virtual?
단어 그대로 '가상의' 라는 의미.
해당 함수를 가상의 함수로 만들어 자식들이 원하는 만큼 덮어 씌울 수 있게 한다.
: override
만약 덮어 씌우지 않는다면? 기존 함수의 기능을 그대로 사용한다.
코드 추가 : 클래스마다 별도의 스크립트 작성
public class YRotator : BaseRotator
{
protected override void Rotate()
{
transform.Rotate(0, speed * Time.deltaTime, 0);
}
}
public class ZRotator : BaseRotator
{
protected override void Rotate()
{
transform.Rotate(0, 0, speed * Time.deltaTime);
}
}
실행 결과
모두 정상적으로 동작한다.
코드 해석
1. override
부모의 가상함수(virtual 함수) 를 자신의 기능으로 덮어씌우는 키워드.
override 라는 키워드를 제외하고 범위 지정자 혹은 반환값 등 나머지 코드는 동일하다.
부모의 기능을 덮어씌우면서 자신의 기능을 새로 정의하는 것을 '재정의' 라고 부른다.
2. void Update()
ZRotator 와 YRotator 에는 Update() 함수가 포함되어 있지 않은데도 함수가 정상적으로 시행된다. 왜그럴까?
위에서 언급한 '회전한다' 와 '회전방식' 의 키워드로 이 현상을 이해할 수 있다.
두 클래스 모두 부모 클래스인 BaseRotator 를 상속받는데, BaseRotator 에 이미 Update() 함수가 있고, 이 내부에 Rotate() 함수가 호출되고 있으므로, 이를 상속받는 자식 클래스 또한 동일한 Update() 함수를 사용하는 것이다.
+ 그럼 예제에서 본 ZRotator 나 YRotator 클래스에서 부모 클래스의 기능을 사용한다고 할 때,
코드를 아예 안써버려고 되나?
public class ZRotator : BaseRotator
{
}
된다. 문제없이 부모 클래스의 기능을 따라서 동작한다.
다만 이러한 동작은 추후 코드를 추가로 작성하는 것이 아니라 단순히 기능만을 그대로 사용하는 거라면 불필요한 스크립트가 늘어나는 것이므로 비추.
3. base.Rotate()
처음 override 함수를 만들고 나면 자동 완성 기능으로 함수 내부에 "base.Rotate();" 라는 코드가 작성된다.
이 코드는 부모(base) 의 Roate() 함수를 그대로 사용한다는 뜻으로,
부모 클래스의 기능을 그대로 사용할 때, 혹은 이 기능에 이어서 추가로 코드를 작성할 때 사용할 수 있다.
예시 코드
public class ZRotator : BaseRotator
{
protected override void Rotate()
{
base.Rotate();
transform.Rotate(0, 0, speed * Time.deltaTime);
}
}
ZRotator 클래스의 추가 코드 작성으로 X축으로 회전하는 것(부모 클래스의 기능)과 더불어
Z축 회전도 같이 동작한다.
=> 부모 클래스의 기능과 자식 클래스의 기능을 모두 사용하는 것.
하나의 부모 클래스에서 파생되었지만, 모두 각자만의 코드를 가질 수 있다.
부모 클래스 : 'virtual'
자식 클래스 : 'override'
=> 부모 클래스를 가상 함수로 만들어, 자식 클래스에서 덮어 씌울 수 있게 한다.
#16. 추상 클래스(Abstract Class) (0) | 2024.08.05 |
---|---|
#15. 인터페이스(Interface) (0) | 2024.08.05 |
#13. 다형성 (0) | 2024.08.03 |
#12. 상속 심화 (0) | 2024.08.02 |
#11. 레이캐스트(RayCast) (0) | 2024.08.01 |