C++ 에서 상속을 배운 경험이 있는 사람이라면, C# 에도 동일한 개념이 있기 때문에 특별히 배울 필요가 없이 넘어갔을지도 모릅니다. 그런데 C# 에서의 상속은 C++ 과 비교해 몇가지 부분에서 결정적인 차이가 있습니다.
이건 단순한 문법 차이가 아니라, 언어의 철학과 설계 방향이 달라서 생긴 아주 중요한 차이입니다.
이 글에서는 C++과 C#의 상속 구조가 어떻게 다르고, 왜 C#은 다중 상속을 허용하지 않는지를 비교해서 정리해 보겠습니다.
C++ 의 다중 상속
C++에서는 다음과 같이 여러 클래스를 동시에 상속할 수 있습니다.
class A
{
public void SayA() { std::cout << "A!" << std::endl; }
};
class B
{
public void SayB() { std::cout << "B!" << std::endl; }
};
class C : public A, public B
{
public void SayC() { std::cout << "C!" << std::endl; }
};
• C는 A, B 모두의 기능을 한꺼번에 상속합니다.
• public, private, protected 와 같은 상속 방식도 클래스마다 지정할 수 있습니다.
이렇게 상속을 여러 개 동시에 할 수 있다는 점은 복잡한 구조를 갖는 시스템을 설계할 때 유용하기도 하지만, 다이아몬드 상속 문제, 모호성 문제처럼 예측하기 어려운 문제도 함께 발생시키게 됩니다.
따라서 C++ 에서의 다중 상속은 매우 조심스럽게 쓰이게 됩니다.
C# 의 단일 상속
C# 은 다음과 같은 코드를 허용하지 않습니다.
class A
{
// 구현
}
class B
{
// 구현
}
// 오류 : 클래스는 하나만 상속 가능
class C : A, B
{
// 구현
}
C#에서는 클래스는 오로지 하나만 상속할 수 있습니다.
또한 상속할 클래스의 접근 제한자는 자동으로 public 이고 별도로 붙이지 않습니다.
그래서 다음처럼 써야 합니다.
class Character
{
public int hp = 100;
public void TakeDamage(int amount)
{
hp -= amount;
Console.WriteLine($"남은 체력: {hp}");
}
}
class Enemy : Character
{
public void Roar()
{
Console.WriteLine("으르렁!");
}
}
왜 이런 차이가 생겼을까?
C++ 은 강력한 자유도를 제공합니다.
클래스든 연산자든, 복잡하게 상속하든, “너가 책임지고 잘 써” 라는 철학입니다.
반면 C# 은 설계가 간단하고 안전해야 한다는 철학을 따르고 있습니다.
그래서 C# 은 “클래스 상속은 하나만 허용하고, 여러 역할은 ‘인터페이스’로 분리해서 구현하라”는 방향을 선택한 것입니다. (인터페이스에 관해서는 추후에 다루겠습니다.)
접근 제한자에서도 차이가 있다
C++에서는 클래스 상속 시에도 public, private, protected 를 지정할 수 있습니다.
// A의 public 멤버가 B에서도 그대로 public
class B : public A
{
// 구현
};
// A의 public 멤버가 C 안에선 private로 바뀜
class C : private A
{
// 구현
};
하지만, 위에서도 살짝 언급했듯이 C# 에서는 이런 부분이 없고 상속은 무조건 public 으로 동작합니다.
다만, 접근 제한자는 상속받은 클래스 내부의 각 field 나 method 에 대해서 개별적으로 붙이면 됩니다.
정리하자면
• C++ 은 클래스 여러 개를 동시에 상속 가능합니다.
• C# 은 클래스는 하나만 상속하고 추가 구현은 인터페이스로 구현합니다.
• C++은 "상속 방식(public / private)" 을 명시하지만, C# 은 그런 문법이 아예 없습니다.
'C#' 카테고리의 다른 글
C#의 is 와 as 키워드 (#02) (0) | 2025.06.26 |
---|---|
C#의 is 와 as 키워드 (#01) (0) | 2025.06.26 |
=> 에 대한 진실과 오해 : 이것은 람다일까 아닐까? (0) | 2025.06.23 |
C# 다형성(Polymorphism) 정리 (0) | 2025.06.23 |
속성(Property)의 동작 원리 (0) | 2025.06.23 |