base 키워드

base 키워드

파생 클래스 안에서 기본 클래스의 멤버에 접근해야 할 때, 바로 그때 base 키워드가 등장해요. 언제 쓰면 좋은지 두 가지로 정리해 볼게요.

  • 기본 클래스에서 이미 다른 메서드로 재정의(override)된 메서드를 호출하고 싶을 때
  • 파생 클래스의 인스턴스를 만들 때 어떤 기본 클래스 생성자를 호출할지 지정하고 싶을 때

그런데 base는 아무 데서나 쓸 수 있는 건 아니에요. **생성자, 인스턴스 메서드, 인스턴스 속성 접근자(accessor)**에서만 기본 클래스에 접근할 수 있어요. 정적(static) 메서드 안에서 base 키워드를 쓰면 오류가 발생한답니다.

C# 언어 참조 문서는 가장 최근에 릴리스된 C# 언어 버전을 기준으로 작성돼요. 다가오는 릴리스의 공개 미리보기에 포함된 기능에 대한 초기 문서도 함께 담고 있죠. 이 문서에서는 지난 세 버전의 언어 또는 현재 공개 미리보기에서 처음 도입된 기능을 따로 표시하고 있어요.

[!TIP] 특정 기능이 C#에서 언제 처음 도입됐는지 알아보려면 C# 언어 버전 기록 문서를 참고하세요.

접근하게 되는 기본 클래스는 클래스 선언에서 지정한 바로 그 기본 클래스예요. 예를 들어 class ClassB : ClassA라고 선언했다면, ClassA가 다시 어떤 기본 클래스를 상속받고 있든 상관없이 ClassB에서 ClassA의 멤버에 접근하게 되는 거예요.

출처: The base keyword — dotnet/docs

본문

이번 예시에서는 기본 클래스 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를 참고하세요.

더 알아보기