다중 인터페이스
Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 27번째.
클래스는 하나의 기본 클래스로부터만 상속받을 수 있는 반면, 필요한 만큼 많은 인터페이스를 구현할 수 있습니다. 이것은 인터페이스가 추상 클래스에 비해 갖는 주요 장점 중 하나로, 클래스가 여러 동작을 채택할 수 있도록 해줍니다.
여러 인터페이스를 구현하려면, 콜론 뒤에 쉼표로 구분하여 나열하면 됩니다:
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을 구현할 수 있습니다. 각 인터페이스는 단일 기능을 나타내며, 클래스는 필요한 기능을 정확하게 조합하여 사용할 수 있습니다.
챌린지
쉬움단일 클래스가 여러 인터페이스를 구현하여 다양한 기능을 얻는 방법을 보여주는 스마트 홈 장치 시스템을 구축해 보겠습니다. 제어 가능하면서도 전원 관리 기능을 모두 갖춘 장치를 만들게 됩니다.
코드는 다음 네 개의 파일로 구성됩니다:
IControllable.cs:SmartHome네임스페이스에IControllable이라는 인터페이스를 정의합니다. 이 인터페이스는 켜고 끌 수 있는 장치를 나타냅니다. 두 개의 메서드TurnOn()과TurnOff()를 선언해야 하며, 둘 다 문자열을 반환합니다.INetworkConnected.cs:SmartHome네임스페이스에INetworkConnected라는 인터페이스를 정의합니다. 이 인터페이스는 네트워크에 연결할 수 있는 장치를 나타냅니다. 문자열을 반환하는Connect(string network)메서드를 선언해야 합니다.SmartTV.cs:SmartHome네임스페이스에IControllable과INetworkConnected를 모두 구현하는SmartTV클래스를 정의합니다. TV는Brand속성(string)과ScreenSize속성(int, 인치 단위)을 가져야 합니다. 두 값을 모두 받는 생성자를 만듭니다. 모든 인터페이스 메서드를 구현합니다: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: 메인 파일에서 입력값을 사용하여SmartTV를 생성합니다. 동일한 TV 객체를 세 가지 다른 변수 타입(구체적인SmartTV타입,IControllable변수,INetworkConnected변수)에 저장하여 다중 인터페이스의 유연성을 보여줍니다. 각 참조를 통해 적절한 메서드를 호출하여 동일한 객체가 작업 중인 인터페이스에 따라 어떻게 다르게 처리될 수 있는지 보여줍니다.
세 가지 입력을 받게 됩니다:
- TV 브랜드 이름
- 인치 단위의 화면 크기
- 연결할 네트워크 이름
출력은 다음 형식으로 인쇄하십시오:
Via SmartTV:
{TurnOn() result}
{Connect(network) result}
Via IControllable:
{TurnOff() result}
Via INetworkConnected:
{Connect(network) result}예를 들어, 입력값이 Samsung, 55, HomeWiFi인 경우 출력은 다음과 같아야 합니다:
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 객체가 서로 다른 인터페이스 참조를 통해 어떻게 액세스될 수 있는지 확인해 보세요. IControllable로 저장되면 제어 메서드만 호출할 수 있습니다. INetworkConnected로 저장되면 네트워크 메서드만 호출할 수 있습니다. 이것이 다중 인터페이스 구현의 힘입니다. 하나의 클래스가 여러 기능을 얻으면서도 사용 방식에 있어 유연성을 유지할 수 있습니다!
치트 시트
클래스는 콜론 뒤에 쉼표로 구분하여 나열함으로써 여러 인터페이스를 구현할 수 있습니다:
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");
}
}클래스는 모든 인터페이스의 모든 멤버를 구현해야 합니다.
상속과 여러 인터페이스를 결합할 때는 기본 클래스가 먼저 와야 합니다:
public class Duck : Bird, IFlyable, ISwimmable
{
// Bird에서 상속받고, 두 인터페이스를 모두 구현합니다
}이를 통해 여러 소스로부터 동작을 구성할 수 있으며, 각 인터페이스는 단일 기능을 나타냅니다.
직접 해보기
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 타입 (인터페이스 참조)
// 3. INetworkConnected 타입 (인터페이스 참조)
// TODO: 요구된 형식으로 출력을 출력하세요:
// Via SmartTV:
// - TurnOn() 및 Connect(network) 호출
// Via IControllable:
// - TurnOff() 호출
// Via INetworkConnected:
// - Connect(network) 호출
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.