C# 다중 상속의 기본 개념
C#은 클래스의 다중 상속(Multiple Inheritance)을 지원하지 않습니다. 하나의 클래스가 여러 클래스를 동시에 상속할 때 발생할 수 있는 모호성 문제(다이아몬드 문제 등)를 방지하기 위한 언어 설계상의 결정입니다.
대신 C#에서는 인터페이스(Interface)를 활용하면 다중 상속과 유사한 효과를 얻을 수 있습니다. 즉, 하나의 클래스는 오직 하나의 기본 클래스만 상속할 수 있지만, 여러 개의 인터페이스는 동시에 구현할 수 있습니다.
인터페이스 정의하기
다음은 도형의 페인팅 비용을 계산하는 PaintCost 인터페이스를 정의한 예시입니다.
public interface PaintCost {
int getCost(int area);
}기본 클래스와 파생 클래스
Shape는 기본 클래스(base class)이며, Rectangle은 Shape를 상속하는 동시에 PaintCost 인터페이스를 함께 구현하는 파생 클래스(derived class)입니다.
class Rectangle : Shape, PaintCost {
public int getArea() {
return (width * height);
}
public int getCost(int area) {
return area * 80;
}
}위 코드처럼 콜론(:) 뒤에 기본 클래스와 인터페이스를 함께 나열하면, 상속과 인터페이스 구현을 한 번에 처리할 수 있습니다.
전체 예제 코드
이제 C#에서 인터페이스를 활용해 다중 상속을 구현하는 전체 코드를 살펴보겠습니다.
using System;
namespace MyInheritance {
class Shape {
public void setWidth(int w) {
width = w;
}
public void setHeight(int h) {
height = h;
}
protected int width;
protected int height;
}
public interface PaintCost {
int getCost(int area);
}
class Rectangle : Shape, PaintCost {
public int getArea() {
return (width * height);
}
public int getCost(int area) {
return area * 80;
}
}
class RectangleDemo {
static void Main(string[] args) {
Rectangle Rect = new Rectangle();
int area;
Rect.setWidth(8);
Rect.setHeight(10);
area = Rect.getArea();
// 객체의 면적 출력
Console.WriteLine("Total area: {0}", Rect.getArea());
Console.WriteLine("Total paint cost: ${0}", Rect.getCost(area));
Console.ReadKey();
}
}
}실행 결과
가로 8, 세로 10으로 설정된 사각형의 경우 프로그램 실행 시 다음과 같은 결과가 출력됩니다.
Total area: 80
Total paint cost: $6400핵심 정리
- C# 클래스는 단일 상속만 지원합니다.
- 인터페이스는 여러 개를 동시에 구현할 수 있습니다.
- 클래스 상속 + 인터페이스 구현을 조합하면 다중 상속과 같은 구조를 만들 수 있습니다.
- 인터페이스는 구현 내용 없이 메서드 시그니처만 선언하므로, 실제 동작은 각 클래스에서 정의해야 합니다.