Posted in: C# 언어

C# 상속으로 코드 재활용하기

C#은 클래스의 필드, 메소드, 프로퍼티 같은 멤버들을 물려받아(?) 똑같은 코드를 굳이 안써도 되는 기능을 제공합니다.

물려받는 클래스(자식 클래스 또는 파생 클래스)가 물려줄 클래스(부모 클래스 또는 기반 클래스)를 지정합니다.

상속


class 부모_클래스
{
    // 멤버 선언
}

class 자식_클래스 : 부모_클래스
{
    // 부모 클래스의 모든 것을 물려받아 갖게 된다.
    // 단, private로 선언된 멤버는 제외.
}

자식 클래스의 이름 뒤에 클론( : )을 붙여주고 그 뒤에 부모 클래스의 이름을 붙여주면 됩니다.

부모 클래스의 생성자()
자식 클래스의 생성자()
자식 클래스의 종료자()
부모 클래스의 종료자()

클래스 호출이 이루어지는 순서는 부모 클래스의 생성자 -> 자식 클래스의 생성자 -> 자식 클래스의 종료자 -> 부모 클래스의 종료자입니다.

base 키워드


base 키워드는 부모 클래스를 가리킵니다. base 키워드를 통해 부모 클래스의 멤버에 접근할 수 있습니다.

class Base
{
    public void BaseMethod()
    {
    }
}

class Derived : Base
{
    public void DerivedMethod()
    {
        base.BaseMethod();
    }
}

base() 생성자


부모 클래스의 생성자가 매개 변수를 입력받도록 선언되어 있다면 자식 클래스의 인스턴스를 생성할 때 호출되는 부모 클래스의 생성자에게 매개 변수를 전달하려면 base() 생정자를 사용하면 됩니다.

class Base
{
    protected string Name;
    public Base(string Name)
    {
        this.Name = Name;
    }
}

class Derived : Base
{
    public Derived(string Name) : base(Name)
    {
        Console.WriteLine($"{this.Name}.Derived()");
    }
}

this()가 자기 자신의 생성자인 것처럼, Base()는 부모 클래스의 생성자입니다. 위 코드의 base(Name)은 Base(string Name)을 호출합니다.

예제


class Base
{
    protected string Name;
    public Base(string Name)
    {
        this.Name = Name;
        Console.WriteLine($"{this.Name}.Base()");
    }

    ~Base()
    {
        Console.WriteLine($"{this.Name}.~Base()");
    }

    public void BaseMethod()
    {
        Console.WriteLine($"{Name}.BaseMethod()");
    }
}

class Derived : Base
{
    public Derived(string Name) : base(Name)
    {
        Console.WriteLine($"{this.Name}.Derived()");
    }

    ~Derived()
    {
        Console.WriteLine($"{this.Name}.~Derived()");
    }

    public void DerivedMethod()
    {
        Console.WriteLine($"{Name}.DerivedMethod()");
    }
}

class MainApp
{
    static void Main(string[] args)
    {
        Base a = new Base("a");
        a.BaseMethod();

        Derived b = new Derived("b");
        b.BaseMethod();
        b.DerivedMethod();
    }
}
출력 결과

a.Base()
a.BaseMethod()
b.Base()
b.Derived()
b.BaseMethod()
b.DerivedMethod()

상속 봉인 한정자


sealed 한정자를 이용하면 해당 클래스는 상속 봉인(봉인 클래스)되어 상속받으려는 시도가 있으면 컴파일러 에러가 발생합니다.

sealed class Base
{

}

class Derived : Base // 컴파일 에러
{

}

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다