상속
객체지향 프로그래밍에서 물려받는 클래스(파생 클래스 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#이다.
'C#' 카테고리의 다른 글
오버라이딩과 다형성 (0) | 2022.05.13 |
---|---|
기반 클래스와 파생 클래스 사이의 형식 변환, is / as (0) | 2022.05.13 |
접근지정자 (0) | 2022.05.12 |
생성자 오버로딩 / this() (0) | 2022.05.12 |
객체 복사: 얕은 복사와 깊은 복사 (0) | 2022.05.12 |