부모 클래스가 가지는 기능을 자식 클래스에서 사용, 수정, 확장할 수 있다. 이것을 자식 클래스가 부모 클래스를 상속 받았다고 한다.
using UnityEngine;
public class ParentScript : MonoBehaviour
{
}
public class ChildScript : ParentScript
{
}
상속 사용 방법
접근 지정자
어떤 접근 지정자를 사용하여 변수와 메서드를 선언하였는지에 따라서 자식 클래스에서와 외부 클래스에서의 접근이 달라진다.
- private : 변수와 메서드를 선언한 클래스에서만 접근 가능하다.
- protected : 변수와 메서드를 선언한 클래스와 자식 클래스 내에서만 접근 가능하다.
- public : 상속을 받지 않은 외부에서도 접근 가능하다.
가상 메서드와 추상 메서드
- Virtual(가상)
- 부모 클래스에서 구현할 수 있다.
- 재정의, 확장 가능하다.
using UnityEngine; public class ParentScript : MonoBehaviour { protected virtual void Start() { Debug.Log("Parent"); } }
public class ChildScript : ParentScript { protected override void Start() { base.Start(); Debug.Log("Child"); } }//실행 결과 : Parent라는 log가 출력된 이후 Child라는 log가 출력된다.
- Abstarct(추상)
- 부모 클래스에서 구현해 놓을 수 없다.
- 상속을 받은 자식 클래스에서 무조건 재정의해 주어야 한다.
- 추상 메서드를 사용하기 위해서는 추상 클래스로 만들어 주어야 한다.
using UnityEngine; public abstract class ParentScript : MonoBehaviour { protected abstract void Start(); }
public class ChildScript : ParentScript { protected override void Start() { Debug.Log("override"); } }
public class ChildScript : ParentScript { }//추상 메서드 Start를 구현하지 않아서 오류가 발생한다.
재정의
- override : 가상과 추상 메서드를 재정의 할 수 있다.
- 가상 메서드는 재정의 하지 않으면 기존 부모 클래스에서 구현한 기능을 수행한다.
base
- 부모 클래스를 참조하여서 사용할 수 있다. 참조를 통해서 부모 클래스에서 구현된 기능을 사용할 수 있다.
- private로 선언되지 않은 변수와 메서드만을 사용할 수 있다.
장점
- 같거나 비슷한 기능을 가지는 클래스를 하나로 묶어서 관리할 수 있다.
- 반복적인 코드의 사용을 줄일 수 있다.
- 새로운 자식 클래스를 만드는데 걸리는 시간을 단축할 수 있다.
단점
- 다중 상속이 가능한 interface와 다르게 다중 상속이 되지 않는다.
- 필요하지 않은 변수와 메서드까지 상속 받게 된다.
- 부모 클래스의 수정 사항이 자식 클래스의 오류로 이어질 수 있다.
주의할 점
- 부모 클래스에서는 모든 자식 클래스가 공통적으로 가져야 하는 변수나 메서드만 가져야 한다.
예시 상황
모든 몬스터는 각자 능력, 특성, 공격 방식이 다 다르다.
하지만 공통적으로 플레이어를 대상으로 움직이는 기능을 가지고 있다.
위의 상황에서 상속 없이 모든 몬스터를 구현하게 된다면, 각 몬스터 클래스 전부에 플레이어를 대상으로 움직이는 스크립트가 생긴다.
이런 상황에서 누구는 이렇게 말할 수 있다.
"한번 구현하면 복사/붙여넣기 하면 되지 않나?"
하지만 만약에 모든 몬스터의 움직이는 기능을 수정해야 하는 상황이 온다면, 모든 몬스터 클래스에 찾아가서 일일이 수정해 주어야 하는 문제가 발생한다. 우리는 기계가 아니기 때문에 몇 개의 클래스는 잘못 수정하거나, 수정을 하지 않고 넘겨버릴 수 있다.
위의 상황에서 상속을 사용하면 똑같은 움직이는 기능을 부모 클래스를 통해서 한번에 수정하고, 반복적인 코드가 생기지 않게 할 수 있다.
"저는 몇몇 몬스터의 움직이는 기능을 특별하게 하고 싶어요."
위의 경우에는 재정의를 통하여서 원하는 기능을 구현할 수 있다.
'유니티 > 개념 정리' 카테고리의 다른 글
ScriptableObject (0) | 2024.09.30 |
---|---|
관찰자 패턴(Observer Pattern) (0) | 2024.09.26 |
StopWatch와 Time.deltaTime (0) | 2024.09.12 |
This (0) | 2024.09.09 |
IInputActionCollection (0) | 2024.09.02 |