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