Engineering Note

[OOP] OCP(개방 폐쇄 원칙) 본문

Computer Science/OOP & Design Pattern

[OOP] OCP(개방 폐쇄 원칙)

Software Engineer Kim 2025. 10. 17. 19:29

OCP(Open Closed Principle)
: 개방-폐쇄 원칙은 소프트웨어 구성요소(클래스, 모듈, 상수 등)는 확장에는 개방적이어야 하고, 수정에는 폐쇄적이어야 한다는 원칙입니다. 즉, 기존의 코드를 변경하지 않고도 시스템의 기능을 확장할 수 있어야 합니다.
OCP를 적용하면, 기존 코드를 변경하지 않고도 새로운 기능을 추가할 수 있습니다. 이는 유지보수성과 재사용성을 향상시키는데 도움이 됩니다.
 
 
구현 방법
: OCP를 적용하기 위해선 다형성을 활용하는 것이 일반적입니다. 인터페이스나 추상 클래스를 사용하여 확장 가능한 부분을 정의하고, 구체적인 구현은 별도의 클래스에서 제공하는 방식입니다.
 

public interface PaymentMethod{
 void pay(amount);
}

public class CreditCart implements PaymentsMethod{
 @Override
 public void pay(amount){
  //신용카드 결제 로직 구현
 }
}

public class PayPal implements PaymentMethod {
 @Override
 public void pay(amount){
  //PayPal 결제 로직 구현
 }
}

// 카카오페이 결제 (나중에 추가!)
public class KakaoPay implements PaymentMethod {
    @Override
    public void pay(int amount) {
        System.out.println("카카오페이로 " + amount + "원 결제");
    }
}

 
위 코드는 결제 방식을 인터페이스로 정의하고, 각 결제 방식을 구현한 클래스를 별도로 제공하는 방식으로 OCP 원칙을 적용한 예시입니다. 이런 방식으로 구현하면 새로운 결제 방식이 추가되더라도 기존 코드의 변경 없이 결제 방식 클래스를 추가하기만 하면 됩니다.

public class PaymentService {
    
    // 이 메서드는 수정하지 않고 결제 기능을 확장할 수 있음
    public void processPayment(PaymentMethod method, int amount) {
        System.out.println("=== 결제 시작 ===");
        method.pay(amount);  // 어떤 결제든 동일하게 처리!
        System.out.println("=== 결제 완료 ===\n");
    }
}

 

 

public class Main {
    public static void main(String[] args) {
        PaymentService service = new PaymentService();
        
        // 1. 신용카드로 결제
        PaymentMethod creditCard = new CreditCard();
        service.processPayment(creditCard, 10000);
        
        // 2. PayPal로 결제
        PaymentMethod paypal = new PayPal();
        service.processPayment(paypal, 20000);
        
        // 3. 카카오페이로 결제 (새로 추가!)
        PaymentMethod kakaoPay = new KakaoPay();
        service.processPayment(kakaoPay, 30000);
    }
}
Comments