using System;
namespace ISPViolationExample
{
// ❌ 너무 많은 책임을 가지는 인터페이스 (ISP 위반)
public interface IBird
{
void Eat();
void Fly();
void Swim();
}
// ❌ 참새는 수영할 수 없지만 인터페이스의 Swim()을 구현해야 함 → ISP 위반
public class Sparrow : IBird
{
public void Eat()
{
Console.WriteLine("참새가 먹이를 먹는다.");
}
public void Fly()
{
Console.WriteLine("참새가 날아간다.");
}
public void Swim()
{
Console.WriteLine("참새는 수영할 수 없다."); // ❌ 잘못된 구현 → ISP 위반
}
}
// ❌ 펭귄은 날 수 없지만 인터페이스의 Fly()를 구현해야 함 → ISP 위반
public class Penguin : IBird
{
public void Eat()
{
Console.WriteLine("펭귄이 먹이를 먹는다.");
}
public void Fly()
{
throw new NotImplementedException("펭귄은 날 수 없습니다."); // ❌ 강제 구현 → ISP 위반
}
public void Swim()
{
Console.WriteLine("펭귄이 수영한다.");
}
}
class Program
{
static void Main()
{
IBird sparrow = new Sparrow();
sparrow.Eat();
sparrow.Fly(); // 정상
sparrow.Swim(); // ❌ 의미 없는 동작 수행
IBird penguin = new Penguin();
penguin.Eat();
penguin.Fly(); // ❌ 런타임 오류 발생 가능 → ISP 위반
penguin.Swim(); // 정상
}
}
}
3. ❌ OCP를 위반한 코드 문제점 파악
IBird 인터페이스에 너무 많은 기능 포함 → 클라이언트가 필요 없는 메서드를 구현해야 함
펭귄은 날 수 없음에도 Fly()를 구현해야 함 → ISP 위반
참새는 수영할 수 없음에도 Swim()을 구현해야 함 → ISP 위반
4.✅OCP가 지켜진 코드
using System;
namespace ISPExample
{
// ✅ 기본 Bird 인터페이스 정의 (공통 기능만 정의)
public interface IBird
{
void Eat();
}
// ✅ 날 수 있는 새 인터페이스 정의
public interface IFlyable
{
void Fly();
}
// ✅ 수영할 수 있는 새 인터페이스 정의
public interface ISwimmable
{
void Swim();
}
// ✅ 참새는 날 수 있는 새이므로 IFlyable 구현
public class Sparrow : IBird, IFlyable
{
public void Eat()
{
Console.WriteLine("참새가 먹이를 먹는다.");
}
public void Fly()
{
Console.WriteLine("참새가 날아간다.");
}
}
// ✅ 펭귄은 수영할 수 있는 새이므로 ISwimmable 구현
public class Penguin : IBird, ISwimmable
{
public void Eat()
{
Console.WriteLine("펭귄이 먹이를 먹는다.");
}
public void Swim()
{
Console.WriteLine("펭귄이 수영한다.");
}
}
// ✅ 오리는 날고 수영할 수 있으므로 두 인터페이스 모두 구현
public class Duck : IBird, IFlyable, ISwimmable
{
public void Eat()
{
Console.WriteLine("오리가 먹이를 먹는다.");
}
public void Fly()
{
Console.WriteLine("오리가 날아간다.");
}
public void Swim()
{
Console.WriteLine("오리가 수영한다.");
}
}
class Program
{
static void Main()
{
IBird sparrow = new Sparrow();
sparrow.Eat();
((IFlyable)sparrow).Fly(); // 참새는 날 수 있음
IBird penguin = new Penguin();
penguin.Eat();
((ISwimmable)penguin).Swim(); // 펭귄은 수영할 수 있음
IBird duck = new Duck();
duck.Eat();
((IFlyable)duck).Fly(); // 오리는 날 수 있음
((ISwimmable)duck).Swim(); // 오리는 수영할 수 있음
}
}
}