Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C# 다중 상속 구현하기: 인터페이스 활용법 완벽 가이드

C# 다중 상속의 기본 개념

C#은 클래스의 다중 상속(Multiple Inheritance)을 지원하지 않습니다. 하나의 클래스가 여러 클래스를 동시에 상속할 때 발생할 수 있는 모호성 문제(다이아몬드 문제 등)를 방지하기 위한 언어 설계상의 결정입니다.

대신 C#에서는 인터페이스(Interface)를 활용하면 다중 상속과 유사한 효과를 얻을 수 있습니다. 즉, 하나의 클래스는 오직 하나의 기본 클래스만 상속할 수 있지만, 여러 개의 인터페이스는 동시에 구현할 수 있습니다.

인터페이스 정의하기

다음은 도형의 페인팅 비용을 계산하는 PaintCost 인터페이스를 정의한 예시입니다.

public interface PaintCost {
    int getCost(int area);
}

기본 클래스와 파생 클래스

Shape는 기본 클래스(base class)이며, RectangleShape를 상속하는 동시에 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# 클래스는 단일 상속만 지원합니다.
  • 인터페이스는 여러 개를 동시에 구현할 수 있습니다.
  • 클래스 상속 + 인터페이스 구현을 조합하면 다중 상속과 같은 구조를 만들 수 있습니다.
  • 인터페이스는 구현 내용 없이 메서드 시그니처만 선언하므로, 실제 동작은 각 클래스에서 정의해야 합니다.