개방-폐쇄 원칙(Open-Closed Principle, OCP)은 소프트웨어 엔티티(클래스, 모듈, 함수 등)가 확장에는 열려 있어야 하지만 수정에는 닫혀 있어야 한다는 원칙입니다. 이 원칙을 적용하지 않은 코드와 적용한 코드를 Java로 작성하여 비교해 보겠습니다.
아래 코드에서는 새로운 할인 정책을 추가할 때마다 DiscountService 클래스를 수정해야 합니다.
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);
}
}
아래 코드에서는 새로운 할인 정책을 추가할 때 기존 코드를 수정하지 않고, 새로운 클래스를 추가하여 확장할 수 있습니다.
public interface DiscountStrategy {
double applyDiscount(double price);
}
public class NewYearDiscount implements DiscountStrategy {
@Override
public double applyDiscount(double price) {
return price * 0.9; // 10% 할인
}
}
public class BlackFridayDiscount implements DiscountStrategy {
@Override
public double applyDiscount(double price) {
return price * 0.8; // 20% 할인
}
}
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를 준수하는 것이 중요합니다.