C#에서는 하나의 클래스가 여러 개의 클래스나 인터페이스로부터 파생될 수 있으며, 이를 통해 여러 기반 클래스(base class) 또는 인터페이스로부터 데이터와 기능을 상속받을 수 있습니다.
상속과 객체 생성의 기본 원리
파생 클래스(derived class)는 기반 클래스의 멤버 변수와 멤버 메서드를 그대로 상속받습니다. 따라서 하위 클래스(자식 클래스)의 객체를 생성하기 전에 반드시 상위 클래스(부모 클래스)가 먼저 초기화되어야 합니다.
C#에서는 base 키워드를 활용한 멤버 초기화 목록(member initialization list)을 통해 상위 클래스의 생성자를 호출하고 초기화 순서를 지정할 수 있습니다.
아래 예제를 통해 상속된 클래스의 객체가 어떻게 생성되는지 확인해 보겠습니다.
예제 코드
using System;
namespace Demo {
class Rectangle {
protected double length;
protected double width;
public Rectangle(double l, double w) {
length = l;
width = w;
}
public double GetArea() {
return length * width;
}
public void Display() {
Console.WriteLine("Length: {0}", length);
Console.WriteLine("Width: {0}", width);
Console.WriteLine("Area: {0}", GetArea());
}
}
class Tabletop : Rectangle {
private double cost;
public Tabletop(double l, double w) : base(l, w) { }
public double GetCost() {
double cost;
cost = GetArea() * 70;
return cost;
}
public void Display() {
base.Display();
Console.WriteLine("Cost: {0}", GetCost());
}
}
class ExecuteRectangle {
static void Main(string[] args) {
Tabletop t = new Tabletop(3, 8);
t.Display();
Console.ReadLine();
}
}
}코드 설명
위 예제의 핵심 포인트는 다음과 같습니다.
- Rectangle 클래스: 길이(length)와 너비(width)를 저장하는 기반 클래스로, 면적을 계산하는
GetArea()메서드와 정보를 출력하는Display()메서드를 제공합니다. - Tabletop 클래스:
Rectangle을 상속하는 파생 클래스입니다. 생성자에서: base(l, w)구문을 사용하여 부모 클래스의 생성자를 명시적으로 호출합니다. - base.Display() 호출: 오버라이딩된
Display()메서드 내부에서base.Display()를 호출하여 부모 클래스의 출력 로직을 재사용한 뒤, 비용(Cost) 정보를 추가로 출력합니다.
실행 결과
Length: 3 Width: 8 Area: 24 Cost: 1680
정리
C#에서 상속 관계에 있는 클래스의 객체를 생성할 때는 base 키워드를 통해 부모 클래스의 생성자를 먼저 실행하도록 지정해야 합니다. 이렇게 하면 상속받은 멤버들이 올바르게 초기화되며, 파생 클래스에서는 base 참조를 통해 부모 클래스의 기능을 손쉽게 재사용할 수 있습니다.