base 키워드
base 키워드
파생 클래스 안에서 기본 클래스의 멤버에 접근해야 할 때, 바로 그때 base 키워드가 등장해요. 언제 쓰면 좋은지 두 가지로 정리해 볼게요.
- 기본 클래스에서 이미 다른 메서드로 재정의(override)된 메서드를 호출하고 싶을 때
- 파생 클래스의 인스턴스를 만들 때 어떤 기본 클래스 생성자를 호출할지 지정하고 싶을 때
그런데 base는 아무 데서나 쓸 수 있는 건 아니에요. **생성자, 인스턴스 메서드, 인스턴스 속성 접근자(accessor)**에서만 기본 클래스에 접근할 수 있어요. 정적(static) 메서드 안에서 base 키워드를 쓰면 오류가 발생한답니다.
C# 언어 참조 문서는 가장 최근에 릴리스된 C# 언어 버전을 기준으로 작성돼요. 다가오는 릴리스의 공개 미리보기에 포함된 기능에 대한 초기 문서도 함께 담고 있죠. 이 문서에서는 지난 세 버전의 언어 또는 현재 공개 미리보기에서 처음 도입된 기능을 따로 표시하고 있어요.
[!TIP] 특정 기능이 C#에서 언제 처음 도입됐는지 알아보려면 C# 언어 버전 기록 문서를 참고하세요.
접근하게 되는 기본 클래스는 클래스 선언에서 지정한 바로 그 기본 클래스예요. 예를 들어 class ClassB : ClassA라고 선언했다면, ClassA가 다시 어떤 기본 클래스를 상속받고 있든 상관없이 ClassB에서 ClassA의 멤버에 접근하게 되는 거예요.
본문
이번 예시에서는 기본 클래스 Person과 파생 클래스 Employee에 모두 GetInfo라는 메서드가 있어요. base 키워드를 쓰면 파생 클래스 안에서도 기본 클래스의 GetInfo 메서드를 호출할 수 있답니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace csrefKeywordsAccess
{
public class Person
{
protected string ssn = "444-55-6666";
protected string name = "John L. Malgraine";
public virtual void GetInfo()
{
Console.WriteLine($"Name: {name}");
Console.WriteLine($"SSN: {ssn}");
}
}
class Employee : Person
{
public readonly string id = "ABC567EFG";
public override void GetInfo()
{
// Calling the base class GetInfo method:
base.GetInfo();
Console.WriteLine($"Employee ID: {id}");
}
}
class TestClass
{
static void Main()
{
Employee E = new Employee();
E.GetInfo();
}
}
/*
Output
Name: John L. Malgraine
SSN: 444-55-6666
Employee ID: ABC567EFG
*/
}
다음 예시는 파생 클래스의 인스턴스를 만들 때 어떤 기본 클래스 생성자를 호출할지 지정하는 방법을 보여줘요.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace csrefKeywordsAccess
{
public class BaseClass
{
private int num;
public BaseClass() =>
Console.WriteLine("in BaseClass()");
public BaseClass(int i)
{
num = i;
Console.WriteLine("in BaseClass(int i)");
}
public int GetNum() => num;
}
public class DerivedClass : BaseClass
{
// This constructor will call BaseClass.BaseClass()
public DerivedClass() : base() { }
// This constructor will call BaseClass.BaseClass(int i)
public DerivedClass(int i) : base(i) { }
static void Main()
{
DerivedClass md = new DerivedClass();
DerivedClass md1 = new DerivedClass(1);
}
}
/*
Output:
in BaseClass()
in BaseClass(int i)
*/
}
더 많은 예시는 new, virtual, override를 참고하세요.