this 명령어가 클래스 인스턴스 그 자체를 가리키는 것과 달리 base [예약어]는 [부모 클래스]를 명시적 으로 가리킬 때 사용한다.
이번에도 this와 마찬가지이다. 지그까지 사용한 부모 클래스의 멤버들은 base. 가 생략된 것이다.
using System;
namespace Project1
{
class Test
{
protected void print()
{
Console.WriteLine("테스트");
}
}
class Test2 : Test
{
public void PRINT()
{
base.print();
base.print();
}
}
class Class1
{
public static void Main(String[] args)
{
Test2 tst = new Test2();
tst.PRINT();
}
}
}
마찬가지로, base 또한 선택의 문제이다. 생성자에서 사용되는 패턴도 this 와 유사하다.
부모 클래스의 생성자는 매개변수를 반드시 하나 받고
자식 클래스의 생성자는 매개변수를 받지 않는 클래스를 작성한다고 생각해보자.
using System;
namespace Project1
{
class Test
{
private int index;
Test(int index)
{
this.index = index;
}
}
class Test2 : Test
{
Test2()
{
Console.WriteLine("자식 클래스의 생성자입니다.");
}
}
class Class1
{
Test2 tst = new Test2();
}
}
이 코드는 오류를 발생시킨다.

Test2를 객체를 생성했지만 생성자는 Test2의 생성자만 호출되는 것이 아니기 때문이다.
자식 클래스에서부터 자신의 부모 클래스로 생성자의 [호출]이 이루어지고,
부모 클래스에서 부터 생성자가 [실행]된다.
하지만 이 코드에서는 부모 클래스의 생성자가 매개변수를 반드시 하나는 받게 되어있는데, 이 매개변수가 없기 때문에
'index'에 해당하는 제공된 인수가 없습니다.
라며 오류가 생긴다.
바로 이런 경우에 base 예약어를 사용하여 어떤 생성자를 어떤 값으로 호출해야 할지 명시해서 문제를 해결할 수 있다.
using System;
namespace Project1
{
class Test
{
private int index;
protected Test(int index)
{
this.index = index;
}
public int getIndex
{
get { return index; }
}
}
class Test2 : Test
{
public Test2() : base(0)
{
Console.WriteLine("자식 클래스의 생성자입니다.");
int baseIndex = base.getIndex;
Console.WriteLine(baseIndex);
}
}
class Class1
{
static void Main(string[] args)
{
Test2 tst = new Test2();
}
}
}
this 와 사용법은 동일하다.
'C# > 책 정리' 카테고리의 다른 글
| C# 정리 ) base 를 이용한 메서드 재사용 (0) | 2021.12.01 |
|---|---|
| C# 정리 ) 메서드 오버라이드 (0) | 2021.12.01 |
| C# 정리 ) this (0) | 2021.11.30 |
| C# 정리 ) System.Array (0) | 2021.11.29 |
| C# 정리 ) GetHashCode (0) | 2021.11.29 |
댓글