본문 바로가기
유니티/개념 정리

상속

by fore4022 2024. 9. 23.

부모 클래스가 가지는 기능을 자식 클래스에서 사용, 수정, 확장할 수 있다. 이것을 자식 클래스가 부모 클래스를 상속 받았다고 한다.

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