C#/인터페이스

[C#] 클래스의 다중상속(다이아몬드문제)와 인터페이스

도도돋치 2025. 4. 23. 21:04
Contents 접기
728x90

다중 상속(Multiple Inheritance)이란?

한 클래스가 둘 이상의 부모 클래스로부터 상속받는 것.

예를 들어, 만약 C#에서 다중 상속이 가능하다면 이런 식일 것이다.

class A {
    public void MethodA() { }
}

class B {
    public void MethodB() { }
}

// 이런 식으로 두 클래스를 동시에 상속
class C : A, B {
    // MethodA랑 MethodB 둘 다 사용 가능
}

 

- 다이아몬드 문제(Diamond Problem)란?

한개의 클래스가 두개 이상의 부모 클래스로부터 동일한 멤버를 상속 받는 문제

하지만,

C#에서는 클래스 간의 다중 상속은 지원하지 않는다.

그 이유는 여러 부모 클래스에 같은 이름의 메서드나 속성이 있을 경우 충돌이 생길 수 있어서, 복잡성과 오류 가능성을 줄이기 위해 C#은 클래스 간에는 단일 상속(single inheritance)만 허용한다.


예를 들어보자:

클래스 A에 Print()라는 메서드가 있다
B, C가 A를 상속받고, 둘 다 Print()를 오버라이드
D가 B와 C를 둘 다 상속

 

👉 이제 D에서 Print()를 호출하면?

😵 B의 Print()를 쓸까? C의 Print()를 쓸까?

컴파일러도 헷갈려한다.
명확한 규칙 없이 모호함, 충돌, 예외 발생 가능성 생김

 

그래서 C#은 단호하게 결정함

클래스는 하나만 상속!
👉 대신 인터페이스는 얼마든지 다중 구현 가능하게 하자!


인터페이스는 다중 구현 가능할까?

  • 인터페이스에는 구현(코드)가 없다
  • 그냥 "이런 메서드가 있어야 해"라는 약속(형태)만 정의

➡ 충돌할 코드 자체가 없으니까 다중 구현해도 안전

 

인터페이스

그 대신 C#에서는 인터페이스를 이용한 다중 상속이 가능하다.

interface IWalk {
    void Walk();
}

interface ITalk {
    void Talk();
}

class Person : IWalk, ITalk {
    public void Walk() {
        Console.WriteLine("Walking");
    }

    public void Talk() {
        Console.WriteLine("Talking");
    }
}
  • 이렇게 하면 여러 개의 인터페이스는 동시에 상속할 수 있어서, 다중 상속의 효과를 낼 수 있다.
  • 인터페이스는 메서드 시그니처만 정의하고 구현은 안 하니까 충돌 위험도 없다.
  • 인터페이스 이름은 I로 시작하는 규칙이 있다.
728x90