Game Development, 게임개발/개발

상속, Inheritance, C# [Unity]

게임이 더 좋아 2021. 3. 25. 06:33
반응형
728x170

 

OOP의 특징 중 하나인 상속을 배워보기로 하자.

상속이란 것이 정말 코드 수를 많이 줄여준 공헌을 하지 않았나 싶다.

 

알아보자

 


 

상속은 클래스를 2가지 종류로 나눈다.

 

1. Parent or base class, 부모 클래스

2. Child or derived class, 자식 클래스

 

부모는 자식에게 상속을 하는 주체고

자식은 부모에게 상속을 받는 주체다.

 

이러한 관계를 Is-A Relationship이라고도 한다.

뜻은 Child class is a Parent class 라는 뜻이다.

 

상속이 된다면 Parent에 있는 변수, 메서드 등의 아이템들이

Child도 쓸 수 있게 바뀌는 것이다.

 

예를 들어보자

 

먼저 부모클래스다.

 

using UnityEngine;
using System.Collections;

//부모 클래스 "과일"
public class Fruit 
{
    public string color;

    //Fruit class의 첫번째 생성자로 얘는 상속되지 않는다.
    public Fruit()
    {
        color = "orange";
        Debug.Log("1st Fruit Constructor Called");
    }


    //두번째 생성자로 역시나 상속되지 않는다.
    public Fruit(string newColor)
    {
        color = newColor;
        Debug.Log("2nd Fruit Constructor Called");
    }
	
    //밑에 메서드들은 상속이 될까???
    // 상속이 된다.
    public void Chop()
    {
        Debug.Log("The " + color + " fruit has been chopped.");        
    }

    public void SayHello()
    {
        Debug.Log("Hello, I am a fruit.");
    }
}

 

 

다음은 자식 클래스를 보자

 

using UnityEngine;
using System.Collections;

public class Apple : Fruit  // : "클래스"에 의해 상속 받는다. 즉, Apple은 Fruit의 자식클래스다
{
    //Apple class의 첫 번째 생성자다.
    /////////////////////////////////////////////////////////////////////////
    // 자식 클래스의 생성자는 실행 되기 전에 부모 클래스의 생성자를 먼저 호출한다.//
    ////////////////////////////////////////////////////////////////////////
    public Apple()
    {
        //color는 Apple이 선언하지 않았음에도 Fruit에게 상속 받아 사용가능하다.
        color = "red";
        Debug.Log("1st Apple Constructor Called");
    }

    //두 번째 생성자다.
    ///////////////////////////////////////////////////////////////////////////////
    /////생성자는"base"라는 키워드를 사용해서 어떤 부모의 생성자를 호출할 지 정한다.
    ///////////////////////////////////////////////////////////////////////////////
    
    public Apple(string newColor) : base(newColor)
    {
        //이 생성자는 인자로부터 color를 받기 때문에 color를 할당받지 않아도 된다.
        Debug.Log("2nd Apple Constructor Called");
    }
}

 

즉, 자식클래스의 인스턴스를 만들기 위해 생성자를 선언하면..?

부모클래스의 생성자부터 실행되어 할당된 다음 자식 클래스로 온다는 말이다.

또한 만약 base 키워드로 부모클래스의 생성자를 어떤 것을 쓸지 고르지 않는다면

default 생성자로 자동으로 실행된다.

 

????

 

즉,

 

이 친구는 Fruit의 기본 생성자가 아닌 base(newColor) 생성자를 실행한 뒤 

 

 

Apple의 생성자가 실행된다는 의미다.

 

 


 

 

다시,

 

이 친구와 같이 base 키워드를 사용하지 않을 경우 

base()가 default 값으로 사용되어

 

 

위와 같은 부모클래스 생성자가 호출된 뒤 생성자가 실행된다는 말이다.

 

 

** 만약 부모클래스가 아닌 우선 자신 클래스의 다른 생성자를 하고싶은 경우 this()를 넣어서 호출이 가능하다.

반응형
그리드형