[SOLID] 개방-폐쇄 원칙(OCP)을 적용하지 않은 샘플과 적용한 샘플 비교

엔스마트·2024년 6월 28일

개방-폐쇄 원칙(Open-Closed Principle, OCP)은 소프트웨어 엔티티(클래스, 모듈, 함수 등)가 확장에는 열려 있어야 하지만 수정에는 닫혀 있어야 한다는 원칙입니다. 이 원칙을 적용하지 않은 코드와 적용한 코드를 Java로 작성하여 비교해 보겠습니다.

개방-폐쇄 원칙을 적용하지 않은 샘플

  • 문제점: 기존 코드를 수정해야만 새로운 기능을 추가할 수 있음

아래 코드에서는 새로운 할인 정책을 추가할 때마다 DiscountService 클래스를 수정해야 합니다.

DiscountService.java (OCP 미적용)

public class DiscountService {
    public double applyDiscount(String discountType, double price) {
        if (discountType.equals("NEW_YEAR")) {
            return price * 0.9; // 10% 할인
        } else if (discountType.equals("BLACK_FRIDAY")) {
            return price * 0.8; // 20% 할인
        }
        return price;
    }

    public static void main(String[] args) {
        DiscountService discountService = new DiscountService();
        double discountedPrice = discountService.applyDiscount("NEW_YEAR", 100);
        System.out.println("Discounted price: " + discountedPrice);
    }
}

개방-폐쇄 원칙을 적용한 샘플

  • 해결책: 새로운 기능을 추가할 때 기존 코드를 수정하지 않고 확장할 수 있음

아래 코드에서는 새로운 할인 정책을 추가할 때 기존 코드를 수정하지 않고, 새로운 클래스를 추가하여 확장할 수 있습니다.

DiscountStrategy.java

public interface DiscountStrategy {
    double applyDiscount(double price);
}

NewYearDiscount.java

public class NewYearDiscount implements DiscountStrategy {
    @Override
    public double applyDiscount(double price) {
        return price * 0.9; // 10% 할인
    }
}

BlackFridayDiscount.java

public class BlackFridayDiscount implements DiscountStrategy {
    @Override
    public double applyDiscount(double price) {
        return price * 0.8; // 20% 할인
    }
}

DiscountService.java (OCP 적용)

public class DiscountService {
    private DiscountStrategy discountStrategy;

    public DiscountService(DiscountStrategy discountStrategy) {
        this.discountStrategy = discountStrategy;
    }

    public double applyDiscount(double price) {
        return discountStrategy.applyDiscount(price);
    }

    public static void main(String[] args) {
        DiscountService newYearService = new DiscountService(new NewYearDiscount());
        double newYearPrice = newYearService.applyDiscount(100);
        System.out.println("New Year Discounted price: " + newYearPrice);

        DiscountService blackFridayService = new DiscountService(new BlackFridayDiscount());
        double blackFridayPrice = blackFridayService.applyDiscount(100);
        System.out.println("Black Friday Discounted price: " + blackFridayPrice);
    }
}

비교 분석

OCP 미적용 코드의 문제점:

  • 유지보수성: 새로운 할인 정책을 추가할 때마다 DiscountService 클래스를 수정해야 합니다. 이는 기존 코드를 변경하게 되어 새로운 버그를 유발할 수 있습니다.
  • 확장성: 할인 정책이 늘어날수록 applyDiscount 메서드가 복잡해지고, 코드의 가독성이 떨어집니다.
  • 단일 책임 원칙 위반: DiscountService 클래스가 여러 할인 정책을 다루므로, 단일 책임 원칙도 위반하고 있습니다.

OCP 적용 코드의 장점:

  • 유지보수성: 새로운 할인 정책을 추가할 때 DiscountStrategy 인터페이스를 구현하는 새로운 클래스를 추가하면 됩니다. 기존 코드는 수정할 필요가 없습니다.
  • 확장성: 할인 정책이 늘어나더라도 DiscountService 클래스는 변경되지 않으므로 코드의 가독성이 유지됩니다.
  • 단일 책임 원칙 준수: 각 할인 정책이 독립적인 클래스로 분리되어 있으므로, 단일 책임 원칙도 준수하고 있습니다.

결론

개방-폐쇄 원칙을 적용하면 코드의 유지보수성과 확장성이 크게 향상됩니다. 새로운 기능을 추가할 때 기존 코드를 수정하지 않고 확장할 수 있으므로, 변경에 유연하고, 코드의 복잡도를 낮출 수 있습니다. 따라서 소프트웨어 개발에서 OCP를 준수하는 것이 중요합니다.

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

0개의 댓글