본문 바로가기

C#

상속

상속

객체지향 프로그래밍에서 물려받는 클래스(파생 클래스 Derived Class 또는 자식 클래스)가 유산을 물려줄 클래스(기반 클래스 Base Class 또는 부모 클래스)를 지정한다.

Class 기반 클래스
{ 
}

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

파생 클래스는 기반 클래스 위에 얹어 만든 거라고 생각하면 이해하기 쉬울 것 같다.

파생 클래스는 객체를 생성할 때 내부적으로 기반 클래스의 생성자를 호출한 후에 자신의 생성자를 호출하고, 객체가 소멸될 때는 반대의 순서로(파생 클래스 -> 기반 클래스) 종료자를 호출한다.

Base() -> Derived() -> ~Derived() -> ~Base()

기반 클래스의 생성자 -> 파생 클래스의 생성자 -> 파생 클래스의 종료자 -> 기반 클래스의 종료자 순으로 호출

 

 

base 키워드를 통해 기반 클래스, 코드의 Base 클래스에 접근할 수 있다.

class Base
    {
        public void ABCD()
        {
            Console.WriteLine("ABCD");
        }
    }
    class Derive : Base
    {
        public void DerivedMethod()
        {
            base.ABCD();
        }
    }

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

 

이럴 때는 base키워드를 사용하면 된다. this 키워드가 "자기 자신"을 가리킨다면 base는 "기반 클래스"를 가리킨다.

this를 통해 자기 자신의 멤버에 접근할 수 있었던 것처럼, base 키워드를 통해 기반 클래스의 멤버에 접근할 수 있다.

 

class Base
    {
        protected string Name;
        public Base(string Name)
        {
            this.Name = Name;
            Console.WriteLine($"base: {this.Name}");
        }    
    }
    class Derive : Base
    {
        public Derive(string Name) : base(Name)     //Base(string Name) 호출
        {
            Console.WriteLine(base.Name);
            Console.WriteLine("Derive 생성자");
        }
    }

 

Base -> Derive 순으로 출력

 

상속 막기

기반 클래스의 작성자는 의도하지 않은 상속이나 파생 클래스의 구현을 막기 위해 상속이 불가능하도록 클래스를 선언할 수 있다. 이때, sealed 한정자를 이용해야 한다.

 

참조: 이것이 C#이다.