개인 공부

상속(Inheritance)

송현호 2023. 8. 31. 00:01

현재 진행하는 프로젝트에서 상속에 대한 이해가 부족한 것 같아서 상속을 공부하기로 함

 

상속(Inheritance) : 유산이나 지위를 물려 받다

C#에서도 마찬가지로 이러한 클래스 간에 메서드 속성 등을 상속 받는 것이 가능함

 

class ParentClass
{
    public int MyField { get; set; }

    public void MyMethod()
    {
        Console.WriteLine("Method from ParentClass");
    }
}

class ChildClass : ParentClass
{
    public void AnotherMethod()
    {
        base.MyMethod(); // 부모 클래스의 MyMethod 호출
        Console.WriteLine("Method from ChildClass");
    }
}

chat gpt의 예시

 

상속의 구현은 다음과 같이 클래스 이름 옆에 : 상위 클래스이름 

을 붙여 줌으로서 구현 가능하다.

 

이러한 상속에는 특이점이 있는데

자식 클래스의 생성자를 호출할 경우 부모 클래스의 생성자 또한 같이 호출된다.

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Inheritance
{
    internal class App
    {
        public App() 
        {
            new Child();
        }
    }
}
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Inheritance
{
    internal class Child : Parent
    {
        public Child()
        {
            Console.WriteLine("Child생성자 생성");
        }
    }
}
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Inheritance
{
    internal class Parent
    {
        public float num = 150;
        public Parent()
        {
            Console.WriteLine("Parent생성자 생성");
        }

        public void PrintHelloWorld()
        {
            Console.WriteLine("HelloWorld");
        }
    }

    
}

실험해본 결과 자식클래스의 생성자를 호출할 경우 부모 클래스의 생성자또한 호출되는 것을 확인할 수 있다.

 

부모 클래스의 메서드나 속성을 사용하고 싶을땐 다음과 같이 base로 접근 가능하다.

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Inheritance
{
    internal class Child : Parent
    {
        public Child()
        {
            base.PrintHelloWorld();
            Console.WriteLine(base.num);
            Console.WriteLine("Child생성자 생성");
        }
    }
}

Parent생성자가 먼저 생성되고 HelloWorld와 num이 잘 출력되는 모습

 

그 외에도 override를 통해 부모 클래스의 메서드를 재정의 하는 것이 가능하다 다만 이 경우 부모클래스의 메서드가 virtual 또는 abstract로 표시되야 한다.