쫑가 과정

객체 지향 프로그래밍의 상속과 다형성 본문

Unity/이론

객체 지향 프로그래밍의 상속과 다형성

쫑가 2021. 12. 28. 09:51

https://learn.unity.com/tutorial/inheritance-and-polymorphism-in-object-oriented-programming?uv=2020.3&pathwayId=5f7e17e1edbc2a5ec21a20af&missionId=5f779f1eedbc2a00201f3e5e#60b33d23edbc2a54f13cedd0 

 

Inheritance and polymorphism in object-oriented programming - Unity Learn

In this tutorial, you’ll learn about inheritance and polymorphism, two closely related pillars of OOP. Explain how inheritance is used to share functionality between a parent and child class Define the relationship between a parent and child class, inclu

learn.unity.com

Inheritance and polymorphism in object-oriented programming

 

상속과 다형성은 깊이 얽혀 있다.

상속은 서로 다른 개체 간의 부모(Parent) - 자식(Child) 관계에 중점을 둔다.

다형성은 상속의 결과이며 부모 클래스에서 상속한 것을 자식 클래스가 수정하는 프로세스

 

상속과 다형성을 함께 사용하면 응용 프로그램에서 작성해야 하는 코드의 양을 줄일 수 있다.

 

상속

상속은 다른 클래스(자식 클래스)를 만들 수 있는 기본 클래스(부모 클래스)를 만드는 프로세스이다.

 

자식 클래스 : 자동으로 부모 클래스의 모든 기능을 사용하거나 상속.

 

예) 적 클래스를 상속받는 개별 클래스

상속을 사용하면 개별 적 클래스에 대한 체력 및 피해 기능을 작성할 필요가 없으므로

각 클래스에 고유한 기능을 작성하는 데 집중할 수 있다.

 

예) 모든 핵심 Unity 스크립팅 기능이 상속되는 MonoBehaviour 기본 클래스

public class SomeClass : MonoBehaviour { }

MonoBehaviour가 없으면 OnTriggerEnter나 Start, Update를 사용할 수 없다.

 

다형성

 

부모 클래스에서 핵심 기능을 상속하는 것이 도움이 될 수 있지만

 

예) MonoBehaviour을 상속하는 Enemy 클래스를 상속하는 Thief 클래스.

public class Enemy : MonoBehaviour 
{ 
    public void DealDamage () 
    {
        Player.Health -= 10;
    }
}
public class Thief : Enemy
{
    private void Update()
    {
        if (Player.isSeen)
        {
            DealDamage(); // method from parent class can be called
        }
    }
}

다형성은 자식 클래스가 부모 클래스와 정확히 동일한 작업을 수행하는 것을 원하지 않는 상황에 쓰인다.

 

다형성은 부모 클래스에서 상속하는 기능을 변경할 수 있다.

 

상위 클래스에서 재정의하려는 메서드는 우선 재정의 대상(overriding)으로 표시되어야 한다.

이것은 가상 메서드(virtual method)로 만들어 수행된다.

 

예) 기본 클래스(Enemy) 상속하는 메서드를 virtual method로 만든다.

public class Enemy : MonoBehaviour { 

    public virtual void DealDamage () { // virtual keyword allows overriding

        Player.Health -= 10;
    }
}

이러한 변경은 메서드 재정의(method overriding)라고 하는 프로세스를 통해 수행된다.

 

예) virtual method인 DealDamage를 상속해 override method로 재정의한다.

public class Thief : Enemy
{
    public override void DealDamage() // can override virtual methods from parent class
    {
        Player.Health -= 2;
        CommitPettyTheft();
    }
    private void Update()
    {
        if (Player.isSeen)
        {
            DealDamage();
        }
    }
}

이제 Update에서 Thief 개체에 의해 DealDamage가 호출되면

상위 메서드 대신 사용자 정의된 DealDamage 메서드가 호출된다.

 

메서드를 가상으로 식별하는 것은 재정의할 수 있지만 재정의할 필요는 없음을 나타낸다.

Thief 자식 클래스에서만 DealDamage 메서드를 수정하고 다른 자식 클래스는 변경되지 않아야 하기에 이상적이다.

 

상속과 다형성은 궁극적으로 작성해야 하는 코드의 총량을 줄이는 데 도움이 되는 클래스 간의 상호 관계를 생성하는 데 도움이 됩니다.

Comments