- OCP(Open-Closed Principle) : 개방-폐쇄 원칙
개방-폐쇄 원칙은 확장에는 열려 있고 변경에는 닫혀 있어야 한다는 원칙이다. 기존의 코드를 변경하지 않으면서 기능을 추가할 수 있도록 설계해야 하며, 변경에 유연하면서도 안정적인 시스템을 만드는 데 도움을 준다.
아래는 개방-폐쇄 원칙이 위배된 코드이다.
public class Product {
private String name;
private double price;
private String type;
/* Constructor, getters, and setters */
public double calculateDiscount() {
if (this.type.equals("book")) {
return this.price * 0.05;
} else if (this.type.equals("toy")) {
return this.price * 0.1;
} else if (this.type.equals("electronics")) {
return this.price * 0.15;
} else {
return this.price * 0.02;
}
}
}
위의 코드에서 calculateDiscount() 메서드에서 상품의 유형(type)에 따라 할인률을 계산하고 있다. 만약 새로운 상품 유형이 추가된다면, calculateDiscount() 메서드를 수정해야 한다.
아래는 개방-폐쇄 원칙이 적용된 코드이다.
public abstract class Product {
private String name;
private double price;
/* Constructor, getters, and setters */
public abstract double calculateDiscount();
}
public class BookProduct extends Product {
@Override
public double calculateDiscount() {
return this.getPrice() * 0.05;
}
}
public class ToyProduct extends Product {
@Override
public double calculateDiscount() {
return this.getPrice() * 0.1;
}
}
public class ElectronicsProduct extends Product {
@Override
public double calculateDiscount() {
return this.getPrice() * 0.15;
}
}
public class OtherProduct extends Product {
@Override
public double calculateDiscount() {
return this.getPrice() * 0.02;
}
}
위의 코드에서는 Product를 추상 클래스로 만들고, calculateDiscount()를 추상 메서드로 선언하였다.
이렇게 함으로써, 새로운 상품 유형이 추가되더라도 해당 유형에 대한 할인률을 계산하는 새로운 클래스만 만들면 되므로 기존 코드를 수정할 필요가 없어진다.