다중 인터페이스
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에서 상속받으며, 두 인터페이스를 모두 구현합니다
}이러한 유연성 덕분에 여러 소스의 동작을 조합할 수 있습니다. Robot은 IMovable, IChargeable, ISpeakable을 구현할 수 있습니다. 각 인터페이스는 하나의 기능을 나타내며, 클래스는 필요한 기능만 정확히 골라 조합할 수 있습니다.
챌린지
쉬움하나의 클래스가 여러 interface를 구현하여 서로 다른 기능을 얻는 방식을 보여 주는 스마트 홈 장치 시스템을 만들어 보겠습니다. 제어할 수 있고 전원 관리 기능도 갖춘 장치를 만들게 됩니다.
코드를 네 개의 파일로 구성합니다.
IControllable.cs:SmartHomenamespace에IControllable이라는interface를 Define합니다. 이interface는 켜고 끌 수 있는 장치를 나타냅니다. 두 개의method인TurnOn()과TurnOff()를 declare해야 하며, 둘 다 string을 반환합니다.INetworkConnected.cs:SmartHomenamespace에INetworkConnected라는interface를 Define합니다. 이interface는 네트워크에 연결할 수 있는 장치를 나타냅니다. string을 반환하는Connect(string network)method를 declare해야 합니다.SmartTV.cs:SmartHomenamespace에IControllable과INetworkConnected모두를 implements하는SmartTVclass를 Define합니다. TV에는Brandproperty(string)와ScreenSizeproperty(int, 인치 단위)이 있어야 합니다. 두 값을 모두 받는Constructor를 만듭니다. 모든interfacemethod를 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, 즉 concreteSmartTVtype,IControllablevariable,INetworkConnectedvariable에 저장하여 multipleinterface의 유연성을 보여 줍니다. 각 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) 호출
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
객체 지향 프로그래밍의 모든 레슨
직접 연습해 보세요: 온라인 C# 컴파일러