재우니의 블로그

 

Interface Segregation Principle (ISP)

 

인터페이스 분리 원칙(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();
    }
}