C#

C# 기초부터 고급까지 Chapter 2.1.2. OCP (Open-Closed Principle) – 개방-폐쇄 원칙

Juan_ 2025. 4. 27. 21:01
728x90

📚 Chapter 2.1.2: OCP (Open-Closed Principle) – 개방-폐쇄 원칙


✅ OCP란?

확장에는 열려 있고, 수정에는 닫혀야 한다.

즉,

  • 새로운 기능 추가할 때는 기존 코드를 수정하지 말고
  • 코드를 확장해서 기능을 늘려라!

📚 왜 OCP가 중요한가?

문제 상황 결과
기존 코드 수정 다른 기능에 영향 줄 가능성 있음 (Side Effect 발생)
버그 발생 옛날 기능까지 깨질 위험
테스트 실패 기존 테스트까지 다 망가질 수 있음

✅ OCP를 지키면

  • 새로운 요구사항이 와도
  • 옛날 코드는 건드리지 않고
  • 확장만 하면 되니까 안전하다!

🛠️ 나쁜 예제: OCP 위반

public class PaymentService
{
    public void ProcessPayment(string method)
    {
        if (method == "CreditCard")
        {
            Console.WriteLine("신용카드 결제 처리");
        }
        else if (method == "PayPal")
        {
            Console.WriteLine("페이팔 결제 처리");
        }
    }
}

❌ 문제점

  • 결제 방법이 늘어날 때마다 if-else 폭탄 추가해야 함
  • 기존 클래스 수정해야 함 (OCP 위반!)

🛠️ 좋은 예제: OCP 적용

1. 결제 방식 인터페이스 분리

public interface IPaymentMethod
{
    void Pay();
}

2. 구체 클래스 만들기

public class CreditCardPayment : IPaymentMethod
{
    public void Pay()
    {
        Console.WriteLine("신용카드 결제 처리");
    }
}

public class PayPalPayment : IPaymentMethod
{
    public void Pay()
    {
        Console.WriteLine("페이팔 결제 처리");
    }
}

3. 서비스는 인터페이스만 바라본다!

public class PaymentService
{
    public void ProcessPayment(IPaymentMethod paymentMethod)
    {
        paymentMethod.Pay();
    }
}

사용 예시

PaymentService service = new PaymentService();
service.ProcessPayment(new CreditCardPayment()); // 신용카드 결제
service.ProcessPayment(new PayPalPayment());      // 페이팔 결제

📚 실무 스타일 예시: 전략 패턴 (Strategy Pattern)

public interface IDiscountStrategy
{
    decimal ApplyDiscount(decimal price);
}

public class NewYearDiscount : IDiscountStrategy
{
    public decimal ApplyDiscount(decimal price) => price * 0.8M;
}

public class RegularDiscount : IDiscountStrategy
{
    public decimal ApplyDiscount(decimal price) => price * 0.9M;
}

public class ShoppingCart
{
    private readonly IDiscountStrategy _discountStrategy;

    public ShoppingCart(IDiscountStrategy discountStrategy)
    {
        _discountStrategy = discountStrategy;
    }

    public decimal CalculatePrice(decimal originalPrice)
    {
        return _discountStrategy.ApplyDiscount(originalPrice);
    }
}

✅ 쇼핑몰이 명절 세일, 정기 세일 추가할 때?

→ 기존 ShoppingCart 코드 수정 안 하고
새 Discount 클래스만 추가하면 된다! (OCP 지킨 거!)


✨ OCP 심화 – 실전 설계 꿀팁

상황 방법
기능 추가 예상된다 처음부터 인터페이스 설계하라
if-else 많이 보인다 다형성(Polymorphism)으로 구조 바꿔라
조건 분기가 3개 넘는다 반드시 인터페이스+클래스 분리 고려해라
기존 코드 만지면 공포스럽다 OCP 위반 신호다! 확장 구조로 변경 고려!

🎯 OCP를 지키면 생기는 실무 장점

항목 효과
기능 추가 쉬움 코드 수정 없이 새 기능 추가 가능
버그 위험 감소 기존 기능 건드리지 않음
팀 협업 편리 각자 새로운 기능 클래스만 따로 만들면 됨
코드 수명 연장 오래가는 탄탄한 코드 베이스 완성

✅ OCP 요약

항목 설명
목표 확장에는 열려 있고, 수정에는 닫혀야 한다
신호 if-else 지옥, 기능 추가 시 기존 코드 수정 필요
해결책 다형성 기반 구조 만들기 (인터페이스 활용!)
728x90