상속, Virtual , Abstract, Interface

김재섭·2022년 12월 5일
0

클래스의 상속

클래스는 상속을 할 수 있다.
상위 클래스는 부모, 하위 클래스는 자식(child)클래스 라고 부른다.

클래스의 상속은 병렬로는 여러개가 이뤄질 수 없고, 직렬로는 차곡차곡 상속이 가능하다.
자식클래스는 부모클래스의 기능을 모두 사용한다.

//이 클래스는 씬에 놓여있지 않음.
public class ParentTest : MonoBehaviour
{

    private void Awake()
    {
        Debug.Log("부모");
    }
}
//이 클래스는 씬에 놓여짐.
public class playerTest : ParentTest
{
    //아무것도 구현하지않음.
}

Log:
부모

Virtual (가상 키워드)

가상 메소드는 한마디로 자식에게 물려줄 수 있는 메소드다.

위의 상속 부분에 적혀있듯 자식은 부모의 메소드를 자동으로 사용하게 되지만,
때에따라 부모의 메소드를 변형해서 사용하거나, 추가해서 사용하고 싶을 수 있다.

이때 해당 부모 메소드에 Virtual키워드를 적어준다.
그리고 자식에 는 override키워드 같은이름의 메소드를 구현해주면 새롭게 덮어쓰기 해서 구현할 수 있다.

말 그대로 덮어쓰기 이므로, 부모에게 구현되어있던 기능들은 사용할 수 없는데,
base.메소드(); 를 사용하면 부모에 구현되어있던 기능들도 사용할 수 있다.

Virtual 메소드를 덮어쓰기 할지말지는 자식 클래스의 마음이다.
강제성이 없다.

//이 클래스는 씬에 놓여있지 않음.
public class ParentTest : MonoBehaviour
{

    protected virtual void Awake()
    {
        Debug.Log("부모");
    }
}
//이 클래스는 씬에 놓여짐.
public class playerTest : ParentTest
{
    protected override void Awake()
    {
        base.Awake();
        Debug.Log("자식");
    }
}

Log:
부모
자식

Abstract(추상 키워드)

추상은 가상 메소드와 비슷하다.
부모의 Abstract 메소드에는 구현부가 없다. 말그대로 추상적으로 존재만 한다.

대신 자식이 override 해서 구현을 해줘야한다.
부모에게 추상 메서드가 있다면 자식은 강제로 구현해야한다.

활용
아래처럼 자식 클래스들에게 공통적인 정의를 내려주고, 자식들은 각각 다르게 부모가 내려준 정의를 다르게 구현한다.

//이 클래스는 씬에 놓여있지 않음.
public abstract class ParentTest : MonoBehaviour
{

    protected virtual void Awake()
    {
        Debug.Log("부모");
        Habit();
    }

    protected abstract void Habit();
}
//이 클래스는 씬에 놓여짐.
public class playerTest : ParentTest
{
    protected override void Awake()
    {
        base.Awake();
        Debug.Log("자식");
    }

    protected override void Habit()
    {
        Debug.Log("다리떨기");
    }
}

Log:
부모
다리떨기
자식

Interface

언뜻보면 상속과 비슷하다. 변수를 사용할 수 없고, 메서드에대한 정의나 프로퍼티만 가질 수 있다.
클래스상속과 다르게 인터페이스는 병렬로 여러개 상속받을 수 있다.

abstract와 마찬가지로 인터페이스에 정의된 메소드는 무조건 상속받은 클래스에서 구현해줘야한다.

//인터페이스는 파일이름 맨 앞에 I 붙임
public interface ITest
{    
    public void SaChoonGi();
}
//이 클래스는 씬에 놓여짐.
public class playerTest : ParentTest , ITest
{   
    protected override void Awake()
    {
        base.Awake();
        Debug.Log("자식");
        SaChoonGi();
    }

    protected override void Habit()
    {
        Debug.Log("다리떨기");
    }

    public void SaChoonGi()
    {
        Debug.Log("반항");
    }


}

Log:
부모
다리떨기
자식
반항

정리

-Vritual은 하나의 기능을 하는 완전한 클래스이며, 자식클래스에서 상속해서 추가적인 기능추가 및 virtual 한정자가 달린 것을 재정의해서 사용가능하다.

-Abstract는 여러개의 자식 클래스에서 공유할 기본 클래스의 공통적인 정의만 하고 ,자식클래스에서 abstract 한정자가 달린 것을 모두 재정의(필수)해야 한다.

-Interface에서도 abstract와 비슷하지만 멤버변수를 사용할 수 없다.

  • 보통 abstract는 개념적으로 계층적인 구조에서 사용이 된다.
    ex)동물(움직이기)/포유류(새끼 낳기)/강아지
  • Interface는 서로다른 계층이나 타입이라도 같은기능을 추가하고 싶을때 사용합니다.
    로봇(말하기) , 사람(말하기) , 지나가는 비둘기(말하기)
    참조 https://hongjinhyeon.tistory.com/93
profile
Unity C#

0개의 댓글