Menu
Coddy logo textTech

다중 인터페이스

Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨. 70개 중 27번째.

클래스는 하나의 base 클래스에서만 상속할 수 있지만, 필요한 만큼 많은 인터페이스를 Implement할 수 있습니다. 이는 인터페이스가 추상 클래스보다 갖는 주요 이점 중 하나입니다. 인터페이스를 사용하면 클래스가 여러 동작을 채택할 수 있습니다.

여러 인터페이스를 구현하려면 콜론 뒤에 쉼표로 구분하여 나열하면 됩니다:

public interface IFlyable
{
    void Fly();
}

public interface ISwimmable
{
    void Swim();
}

public class Duck : IFlyable, ISwimmable
{
    public void Fly()
    {
        Console.WriteLine("Flying through the air");
    }
    
    public void Swim()
    {
        Console.WriteLine("Swimming in the pond");
    }
}

Duck 클래스는 두 인터페이스의 모든 멤버를 구현해야 합니다. 이는 실제 상황을 자연스럽게 모델링합니다. 오리는 실제로 날 수도 있고 수영할 수도 있으므로 두 계약을 모두 충족하는 것이 타당합니다.

상속을 여러 인터페이스와 결합할 때는 기본 클래스가 먼저 와야 합니다:

public class Duck : Bird, IFlyable, ISwimmable
{
    // Bird에서 상속받으며, 두 인터페이스를 모두 구현합니다
}

이러한 유연성 덕분에 여러 소스의 동작을 조합할 수 있습니다. RobotIMovable, IChargeable, ISpeakable을 구현할 수 있습니다. 각 인터페이스는 하나의 기능을 나타내며, 클래스는 필요한 기능만 정확히 골라 조합할 수 있습니다.

challenge icon

챌린지

쉬움

하나의 클래스가 여러 interface를 구현하여 서로 다른 기능을 얻는 방식을 보여 주는 스마트 홈 장치 시스템을 만들어 보겠습니다. 제어할 수 있고 전원 관리 기능도 갖춘 장치를 만들게 됩니다.

코드를 네 개의 파일로 구성합니다.

  • IControllable.cs: SmartHome namespaceIControllable이라는 interface를 Define합니다. 이 interface는 켜고 끌 수 있는 장치를 나타냅니다. 두 개의 methodTurnOn()TurnOff()를 declare해야 하며, 둘 다 string을 반환합니다.
  • INetworkConnected.cs: SmartHome namespaceINetworkConnected라는 interface를 Define합니다. 이 interface는 네트워크에 연결할 수 있는 장치를 나타냅니다. string을 반환하는 Connect(string network) method를 declare해야 합니다.
  • SmartTV.cs: SmartHome namespaceIControllableINetworkConnected 모두를 implements하는 SmartTV class를 Define합니다. TV에는 Brand property(string)와 ScreenSize property(int, 인치 단위)이 있어야 합니다. 두 값을 모두 받는 Constructor를 만듭니다. 모든 interface method를 Implement합니다:
    • TurnOn()"{Brand} {ScreenSize}-inch TV is now ON"을 반환합니다.
    • TurnOff()"{Brand} {ScreenSize}-inch TV is now OFF"를 반환합니다.
    • Connect(string network)"{Brand} TV connected to {network}"를 반환합니다.
  • Program.cs: main 파일에서 input 값을 사용하여 SmartTV를 Create합니다. 동일한 TV 객체를 세 가지 different한 variable type, 즉 concrete SmartTV type, IControllable variable, INetworkConnected variable에 저장하여 multiple interface의 유연성을 보여 줍니다. 각 reference를 통해 적절한 method를 Call하여, 어떤 interface를 사용하느냐에 따라 동일한 객체를 different하게 다룰 수 있음을 보여 줍니다.

세 가지 input을 받습니다.

  • TV brand 이름
  • 인치 단위의 Screen size
  • 연결할 Network 이름

다음 format으로 output을 Print합니다.

Via SmartTV:
{TurnOn() result}
{Connect(network) result}
Via IControllable:
{TurnOff() result}
Via INetworkConnected:
{Connect(network) result}

예를 들어 input이 Samsung, 55, HomeWiFi라면 output은 다음과 같아야 합니다.

Via SmartTV:
Samsung 55-inch TV is now ON
Samsung TV connected to HomeWiFi
Via IControllable:
Samsung 55-inch TV is now OFF
Via INetworkConnected:
Samsung TV connected to HomeWiFi

동일한 SmartTV 객체에 different한 interface reference를 통해 액세스할 수 있다는 점에 주목하세요. IControllable로 저장하면 control method만 Call할 수 있습니다. INetworkConnected로 저장하면 network method만 Call할 수 있습니다. 이것이 multiple interface를 Implement하는 것의 power입니다. 하나의 class가 multiple capability를 얻으면서도 사용 방식에서는 유연성을 유지할 수 있습니다!

직접 해보기

using System;
using SmartHome;

class Program
{
    public static void Main(string[] args)
    {
        // 입력 읽기
        string brand = Console.ReadLine();
        int screenSize = Convert.ToInt32(Console.ReadLine());
        string network = Console.ReadLine();
        
        // TODO: 입력 값으로 SmartTV 객체 생성
        
        // TODO: 동일한 TV 객체를 세 가지 다른 변수 유형에 저장:
        // 1. SmartTV 유형 (구체 클래스)
        // 2. IControllable type (interface reference)
        // 3. INetworkConnected type (interface reference)
        
        // TODO: 필요한 형식으로 출력 인쇄:
        // Via SmartTV:
        // - TurnOn() 및 Connect(network) 호출
        // Via IControllable:
        // - TurnOff() 호출
        // Via INetworkConnected:
        // - Connect(network) 호출
        
    }
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨

직접 연습해 보세요: 온라인 C# 컴파일러