[SOLID] 인터페이스 분리 원칙(ISP)을 적용하지 않은 샘플과 적용한 샘플 비교

엔스마트·2024년 7월 2일

인터페이스 분리 원칙(Interface Segregation Principle, ISP)은 클라이언트가 자신이 사용하지 않는 메서드에 의존하지 않도록 하는 원칙입니다. 이는 인터페이스를 더 작고 구체적인 것으로 나누어 클라이언트가 자신에게 필요한 메서드만 사용하도록 설계해야 함을 의미합니다.

인터페이스 분리 원칙을 적용하지 않은 샘플

아래 예제에서는 큰 인터페이스를 사용하여 여러 클래스를 구현하는 상황을 보여줍니다.

Worker.java (ISP 미적용)

public interface Worker {
    void work();
    void eat();
}

public class HumanWorker implements Worker {
    @Override
    public void work() {
        System.out.println("Human working");
    }

    @Override
    public void eat() {
        System.out.println("Human eating");
    }
}

public class RobotWorker implements Worker {
    @Override
    public void work() {
        System.out.println("Robot working");
    }

    @Override
    public void eat() {
        // 로봇은 먹지 않음
        throw new UnsupportedOperationException("Robots don't eat");
    }
}

public class Main {
    public static void main(String[] args) {
        Worker human = new HumanWorker();
        human.work();
        human.eat();

        Worker robot = new RobotWorker();
        robot.work();
        try {
            robot.eat();
        } catch (UnsupportedOperationException e) {
            System.out.println(e.getMessage());
        }
    }
}

위의 예제에서는 RobotWorker 클래스가 eat 메서드를 지원하지 않기 때문에 UnsupportedOperationException을 던집니다. 이는 인터페이스 분리 원칙을 위반한 사례입니다.

인터페이스 분리 원칙을 적용한 샘플

ISP를 준수하기 위해, 인터페이스를 더 작고 구체적인 것으로 분리합니다.

Workable.java

public interface Workable {
    void work();
}

Eatable.java

public interface Eatable {
    void eat();
}

HumanWorker.java

public class HumanWorker implements Workable, Eatable {
    @Override
    public void work() {
        System.out.println("Human working");
    }

    @Override
    public void eat() {
        System.out.println("Human eating");
    }
}

RobotWorker.java

public class RobotWorker implements Workable {
    @Override
    public void work() {
        System.out.println("Robot working");
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        Workable humanWorker = new HumanWorker();
        humanWorker.work();
        ((Eatable) humanWorker).eat();

        Workable robotWorker = new RobotWorker();
        robotWorker.work();
    }
}

비교 분석

ISP 미적용 코드의 문제점:

  • 불필요한 메서드 구현: RobotWorker 클래스는 eat 메서드를 구현할 필요가 없지만, 인터페이스에 포함되어 있어 불필요한 메서드를 구현해야 합니다.
  • 예외 처리 필요: RobotWorker 클래스가 eat 메서드를 지원하지 않기 때문에 예외를 던지게 됩니다. 이는 불필요한 예외 처리를 요구합니다.
  • 인터페이스 사용의 어려움: 클라이언트가 인터페이스를 사용할 때 불필요한 메서드를 포함하게 되어 사용이 어려워집니다.

ISP 적용 코드의 장점:

  • 구체적인 인터페이스: 인터페이스가 더 작고 구체적이므로, 클래스는 필요한 인터페이스만 구현하면 됩니다.
  • 간단한 클래스 설계: RobotWorker 클래스는 work 메서드만 구현하고, HumanWorker 클래스는 work와 eat 메서드를 구현하여 각 클래스의 역할이 명확해집니다.
  • 클라이언트 코드의 간결성: 클라이언트는 필요한 인터페이스만 사용하므로, 코드가 더 간결해집니다.

결론

인터페이스 분리 원칙을 준수하면, 인터페이스가 더 작고 구체적이 되어 클래스가 자신에게 필요한 메서드만 구현하게 할 수 있습니다. 이는 코드의 복잡도를 줄이고, 유지보수성과 확장성을 향상시킵니다. 따라서 소프트웨어 개발에서 ISP를 준수하는 것이 중요합니다.

profile
클라우드 전환, MSA 서비스, DevOps 환경 구축과 기술지원 그리고 엔터프라이즈 시스템을 구축하는 최고 실력과 경험을 가진 Architect Group 입니다.

0개의 댓글