C#

C# 기초부터 고급까지 Chapter 2.1.4. ISP (Interface Segregation Principle) – 인터페이스 분리 원칙

Juan_ 2025. 4. 27. 21:06
728x90

📚 Chapter 2.1.4. ISP (Interface Segregation Principle) – 인터페이스 분리 원칙


✅ ISP란?

"하나의 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않게 해야 한다."

쉽게 말하면,

  • "인터페이스는 작게 작게 쪼개라!"
  • "필요한 기능만 가진 인터페이스만 제공해라!"

📚 왜 ISP가 중요한가?

문제 상황 결과
거대한 인터페이스 필요 없는 메서드도 강제로 구현해야 함
코드 복잡성 증가 무쓸모 코드들이 시스템을 오염시킴
유지보수 난이도 상승 하나 바꾸면 연쇄 수정 지옥

✅ ISP를 지키면 →

  • 필요한 기능만 깔끔하게 다루고,
  • 코드 수정 범위 최소화된다!

🛠️ 기본 나쁜 예제: ISP 위반

덩치 큰 인터페이스

public interface IWorker
{
    void Work();
    void Eat();
}

서로 다른 요구를 가진 클래스

public class HumanWorker : IWorker
{
    public void Work() => Console.WriteLine("일한다!");
    public void Eat() => Console.WriteLine("식사한다!");
}

public class RobotWorker : IWorker
{
    public void Work() => Console.WriteLine("로봇이 일한다!");
    
    public void Eat()
    {
        throw new NotImplementedException("로봇은 밥 안 먹는다!");
    }
}

❌ 문제점

  • 로봇은 Eat() 필요 없는데도
  • 강제로 메서드를 구현해야 함! (심지어 예외 던져야 함 ㅋㅋ)

👉 인터페이스가 너무 커서 억지 구현 발생 → ISP 위반


🛠️ 좋은 예제: ISP 적용

인터페이스 분리!

public interface IWorkable
{
    void Work();
}

public interface IFeedable
{
    void Eat();
}

각 클래스는 필요한 것만 구현

public class HumanWorker : IWorkable, IFeedable
{
    public void Work() => Console.WriteLine("일한다!");
    public void Eat() => Console.WriteLine("식사한다!");
}

public class RobotWorker : IWorkable
{
    public void Work() => Console.WriteLine("로봇이 일한다!");
}

✅ 이제 필요한 것만 선택해서 구현할 수 있다!

"억지 구현" 따위 필요 없음!


📚 실무 스타일 예시: 파일 입출력

상황 잘못된 설계
파일 저장, 로드, 삭제 기능을 한 인터페이스에 몰빵 필요 없는 메서드까지 강제로 구현해야 함

ISP 적용하면?

  • ISaveable, ILoadable, IDeletable 기능별 인터페이스 분리해서
  • 필요한 것만 골라 쓴다!

✨ ISP 심화 – 실전 설계 꿀팁

상황 해결법
인터페이스 메서드 5개 이상 쪼개는 거 검토해라
일부 구현체가 NotImplementedException 던진다 100% 인터페이스 분리 부족하다
인터페이스 메서드명에 "And" 들어간다 기능 분리 신호다! (SaveAndLoad ❌)

🎯 ISP를 지키면 생기는 실무 장점

항목 효과
인터페이스 명확성 필요한 기능만 명확하게 설계
유지보수 쉬움 수정 범위 최소화
재사용성 향상 작은 단위 인터페이스 재활용 가능
테스트 용이 테스트 더 깔끔하고 빠름

✅ ISP 요약

항목 설명
목표 클라이언트가 필요 없는 메서드에 의존하지 않게 한다
신호 인터페이스 거대해지면 분리 고려
해결책 기능별로 인터페이스 쪼개기
728x90