상속을 설명하기 전에 부모 클래스와 자식 클래스를 두개 만들어 줍니다. 

 

Human.cs (부모 클래스)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

// 추상 함수를 쓰면 반드시 클래스도 추상 클래스가 되어야 한다.
abstract public class Human : MonoBehaviour
{
    protected string humanName;
    protected int humanAge;

    // 자식 클래스에서 함수 재정의를 하려면 부모클래스를 virtual로 선언해야 한다.
    protected virtual void Info()
    {
        print("나는 인간입니다.");
    }

    abstract protected void Name();
}

 

Student.cs (자식 클래스) 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Student : Human
{
    string schoolName;

    void Start()
    {
        schoolName = "티스토리";
        humanName = "소블리애";
        humanAge = 20;

        print(schoolName);
        Info();
        Name();        
    }

    // 부모 클래스의 Info함수를 재정의 한다.
    protected override void Info()
    {
        base.Info();
        print("나는 학생입니다");
    }

    // 만약 Name 함수를 재정의를 안했다면 컴파일 에러가 발생하게 된다.
    // 추상 함수는 자식 클래스에서 반드시 재정의를 해줘야 한다.
    // 프로그래머의 코드 누락을 방지하기 위한 방법.
    protected override void Name()
    {
        print(humanName);
    }
}

 

결과 화면 

위에 코드를 보면 학생은 인간임으로 논리적으로 상속이 성립합니다. 부모 클래스로 부터 상속 받은 자식 클래스는 부모에서 생성된 멤버 변수를 기본적으로 갖게 됩니다. humanName과 humanAge가 그렇습니다. 또한 자식 클래스에서 함수를 재정의 하여 쓸 수도 있습니다. 이때 반드시 부모 클래스에 가상함수(virtual)라고 알려줘야 합니다. 자식 클래스는 함수 이름 앞에 재정의(override) 키워드를 넣어주면 됩니다.

 

또한 반드시 작성해야 하는 함수(추상함수)를 갖게 되는 경우 부모 클래스에서 abstract 키워드를 함수와 클래스 앞에 넣어 줍니다. 그리고 구현 부분은 상속받은 자식 클래스에서 구현합니다. abstract를 붙여주는 이유는 해당 함수 및 클래스가 미완성인 상태를 명시 하는 것이다. 자식 클래스에서 해당 함수를 완성해야만 한다. 만약에 자식 클래스에서 구현을 하지 않았다면 컴파일 에러가 발생하게 됩니다. 이는 프로그래머가 반드시 작성해야 하는 코드임을 알려줄 수 있습니다. 

 

추가로 클래스 멤버 또는 함수에는 접근 한정자가 붙습니다. 용도는 아래와 같습니다.

 

public - 타 클래스에서 모두 사용 가능

private - 클래스의 내부에서만 사용 가능

protected - 상속 받는 자식 클래스만 사용 가능 

'프로그래밍 언어 > C#' 카테고리의 다른 글

C# 인덱서  (0) 2019.12.05
C# 프로퍼티  (0) 2019.12.05
C# 델리게이트와 이벤트  (0) 2019.12.05
C# 구조체와 클래스 차이점  (0) 2019.12.04
C# 얕은 복사와 깊은 복사  (0) 2019.12.04
Posted by 소블리애
,