본문 바로가기
C#

C# 의 상속이 C++ 과 다른 점

by Oz Driver 2025. 6. 25.

 

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# 은 그런 문법이 아예 없습니다.