Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

nomad-programmer

[Programming/C#] 상속 : base, base() 본문

Programming/C#

[Programming/C#] 상속 : base, base()

scii 2020. 9. 8. 14:24
class 부모 클래스
{
    // 멤버 선언
}

class 파생 클래스 : 부모 클래스
{
    // 아무 멤버를 선언하지 않아도 부모 클래스의 모든 것을 물려받아 갖게 된다.
    // 단, private로 선언된 멤버는 예외이다.
}

파생 클래스의 이름 뒤에 콜론(:)을 붙여주고 그 뒤에 상속받을 부모 클래스의 이름을 붙여주면 된다.

만약 부모 클래스의 생성자가 매개 변수를 입력받도록 선언되어 있다면 파생 클래스의 인스턴스를 생성할 때 호출되는 부모 클래스의 생성자에게 어떻게 매개 변수를 전달해줄 수 있을까?

이럴 때는 base 키워드를 사용하면 된다. this 키워드가 "자기 자신"을 가리킨다면 base는 "부모 클래스"를 가리킨다. this를 통해 자기 자신의 멤버에 접근할 수 있었던 것처럼, base 키워드를 통해 기반 클래스의 멤버에 접근할 수 있다.

base 키워드 : 상속 받은 부모 클래스를 가리키는 변수이다.
base() : 부모 클래스의 생성자를 호출하는 명령어이다.

 

파생 클래스의 생성자에서 부모 클래스의 생성자에게 매개 변수를 넘겨주는 방법

이것 역시 this와 같다. this()가 자기 자신의 생성자인 것처럼, base()는 부모 클래스의 생성자이다. base()에 매개 변수를 넘겨 호출하면 부모 클래스의 생성자를 초기화할 수 있다.

using System;

namespace CSharpExample
{
    class BaseClass
    {
        private string name;

        public BaseClass(string name)
        {
            this.name = name;
            Console.WriteLine($"{this.name}.BaseClass()");
        }

        ~BaseClass()
        {
            Console.WriteLine($"{name}.~BaseClass()");
        }

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

        protected string GetName()
        {
            return name;
        }
    }

    class DerivedClass : BaseClass
    {
        // 상속받은 BaseClass 초기화
        public DerivedClass(string name) : base(name)
        {
            Console.WriteLine($"{name}.DerivedClass()");
        }

        // 생성자 오버로딩
        public DerivedClass() : this("hahaha555") { }

        ~DerivedClass()
        {
            Console.WriteLine($"{GetName()}.~DerivedClass()");
        }

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

    class MainApp
    {
        static int Main(string[] args)
        {
            BaseClass a = new BaseClass("aaa");
            a.BaseMethod();

            DerivedClass b = new DerivedClass("bbb");
            b.BaseMethod();
            b.DerivedMethod();

            return 0;
        }
    }
}

/* 결과

aaa.BaseClass()
aaa.BaseMethod()
bbb.BaseClass()
bbb.DerivedClass()
bbb.BaseMethod()
bbb.DerivedMethod()
bbb.~DerivedClass()
bbb.~BaseClass()
aaa.~BaseClass()

*/

 

sealed : 상속 봉인

의도하지 않은 상속이나 파생 클래스의 구현을 막기 위해 상속을 불가능하도록 클래스를 선언할 수 있다.
바로 sealed 한정자를 이용하는 것이다. 다음과 같이 sealed 한정자로 클래스를 수식하면, 이 클래스는 "상속 봉인"이 되어 (이런 클래스를 봉인 클래스라고 한다) 이로부터 상속받으려는 시도가 컴파일러부터 발견됐을 때 에러 메시지가 출력된다.

sealed class Base
{
    // ...
}

class Derived : Base
{
    // ...
}
Comments