인터페이스 분리 원칙(ISP)은 클라이언트가 사용하지 않는 인터페이스에 의존하도록 강요해서는 안 된다는 원칙을 제시합니다. 이 원칙은 특정 클라이언트 요구사항에 맞춘 더 작고 집중적인 인터페이스를 만들도록 장려합니다.
using System;
// 인터페이스 선언
public interface IDrivable
{
void Drive();
}
public interface IFlyable
{
void Fly();
}
// 자전거 클래스: IDrivable 인터페이스 구현
public class Bicycle : IDrivable
{
public void Drive()
{
Console.WriteLine("The bicycle is being driven.");
}
}
// 비행기 클래스: IFlyable 인터페이스 구현
public class Airplane : IFlyable
{
public void Fly()
{
Console.WriteLine("The airplane is flying.");
}
}
class Program
{
static void Main()
{
// 자전거 인스턴스 생성 및 주행 메서드 호출
var bicycle = new Bicycle();
Console.WriteLine("Bicycle:");
bicycle.Drive();
Console.WriteLine();
// 비행기 인스턴스 생성 및 비행 메서드 호출
var airplane = new Airplane();
Console.WriteLine("Airplane:");
airplane.Fly();
}
}
이 코드에서는IDrivable및IFlyable인터페이스를 선언하고, 이를 구현하는Bicycle및Airplane클래스를 만들어 주행 및 비행 동작을 시뮬레이션합니다.Main메서드에서는 각각의 인스턴스를 생성하고 해당 메서드를 호출하여 결과를 출력합니다. 코드를 실행하면 자전거가 주행하고 비행기가 비행하는 것을 확인할 수 있습니다.
ISP 위반한 사례
하나의 인터페이스에 불필요하게 많은 메서드가 선언되어 있거나, 클라이언트가 필요하지 않은 메서드를 구현해야 하는 경우입니다. 주어진IVehicle인터페이스를 기반으로 한 ISP 위반 예제를 아래에 제시합니다.
using System;
// 잘못된 IVehicle 인터페이스: 여러 메서드가 함께 선언됨
public interface IVehicle
{
void Drive();
void Fly();
void Navigate(); // 새로운 메서드 추가, 여기서는 필요하지 않음
void Refuel(); // 새로운 메서드 추가, 여기서는 필요하지 않음
}
// 자동차 클래스: IVehicle 인터페이스 구현
public class Car : IVehicle
{
public void Drive()
{
Console.WriteLine("The car is being driven.");
}
public void Fly()
{
Console.WriteLine("Error: Cars cannot fly.");
}
// Navigate 및 Refuel 메서드 구현
public void Navigate()
{
Console.WriteLine("The car is navigating.");
}
public void Refuel()
{
Console.WriteLine("The car is refueling.");
}
}
class Program
{
static void Main()
{
// IVehicle을 사용하는 클라이언트 코드
IVehicle vehicle = new Car();
// 클라이언트는 Navigate 및 Refuel 메서드를 사용하지 않아도 됨
// 하지만 IVehicle 인터페이스의 일부로 불필요한 메서드를 구현해야 함
vehicle.Drive();
vehicle.Fly();
}
}