244. OCP (Open-Closed Principle) - 개방-폐쇄 원칙 SOLID 다형성 추상화 인터페이스 확장성 유지보수 디자인 패턴 객체지향 심장
핵심 인사이트: (객체지향의 존재 이유, O) 쇼핑몰 결제창을 짰다.
if (신용카드) { 카드결제() } else if (카카오페이) { 카카오결제() }. 완벽하다며 잠을 잤다. 다음 날 사장님이 "야! 오늘부터 '네이버페이'도 추가해!" 라고 지시했다. 개발자는 울면서 1만 줄짜리 핵심 결제 클래스의 배를 갈라else if (네이버페이)를 수동으로 쑤셔 넣고 코드를 뜯어고쳤다. 그러다 실수로 위쪽신용카드코드를 건드려 결제 시스템이 펑 터졌다. 객체지향의 신(버트란드 마이어)이 강림하여 귀싸대기를 때린다. "야 ㅆㅂ!! 언제까지 새로운 놈이 올 때마다 잘 돌아가던 기존 코드(심장)의 배를 갈라 피를 철철 흘리며 뜯어고칠(수정) 거냐?! '기능 확장(Open)'은 레고 블록 끼우듯 무한대로 활짝 열어두되, 그 과정에서 이미 짜놓은 기존 핵심 코드(심장)는 단 1줄도 수정(Close)되지 않게 꽁꽁 닫아버려라!! 그게 어떻게 가능하냐고? 구체적인 '신용카드' 이름 부르지 말고, '결제수단(인터페이스)'이라는 텅 빈 추상적인 콘센트 구멍만 파놔!! 그럼 네이버페이가 100개가 오든 그 구멍에 찰칵찰칵 꽂기만 하면(다형성), 심장 코드는 1줄도 안 고치고 영원히 살아가잖아!!" 다형성을 무기로 수정을 금지하고 확장을 폭발시키는 객체지향의 영혼, 개방-폐쇄 원칙(OCP)이다.
Ⅰ. IF-ELSE 지옥 (수정의 늪)
- 하수들의 코딩: 새로운 요구사항이 들어오면 무조건 기존 클래스 파일 안으로 들어가서
if ~ else문을 계속 덧붙이며 코드를 뚱뚱하게 뜯어고칩니다(수정). - 비극: 100번 테스트 완료된 안전한 기존 코드에 칼을 대는 행위는 100% 확률로 예상치 못한 **사이드 이펙트 버그(회귀 버그)**를 유발합니다. 확장이 두려워집니다.
Ⅱ. OCP (Open-Closed Principle)의 개념 🌟
- 1988년 버트란드 마이어(Bertrand Meyer)가 제안한 가장 위대한 룰입니다.
- Open (개방 - 확장에 열림): "시스템에 새로운 기능, 새로운 요구사항을 덧붙이는 것(확장)은 무한대로, 아주 쉽게 허용되어야 한다."
- Closed (폐쇄 - 수정에 닫힘): "하지만 그 새로운 기능을 덧붙일 때, 기존에 잘 돌고 있던 핵심 클래스의 코드를 단 1줄이라도 변경(수정)하는 일은 절대 일어나서는 안 된다!"
- 모순의 해결: 코드를 안 고치고 어떻게 기능을 추가하냐고요? **'추상화(인터페이스)'와 '다형성'**을 무기로 쓰면 이 마법이 100% 현실이 됩니다.
Ⅲ. OCP의 마법: 추상화 방패 🌟 핵심 기출 🌟
OCP를 지키려면 무조건 216번 헥사고날의 '포트와 어댑터'를 써야 합니다.
1. 구체물에 의존하는 재앙 (OCP 위반)
주문기계가신용카드객체의pay()함수를 다이렉트로 호출합니다.- 네이버페이를 추가하려면
주문기계의 코드를 열어서(수정 발생 ➜ Closed 위반!)네이버페이.pay()코드로 뜯어고쳐야 합니다.
2. 추상화(인터페이스) 콘센트 뚫기 (OCP 완벽 준수)
주문기계와 구체적인 결제수단 사이에 **[결제수단 인터페이스]라는 가상의 텅 빈 콘센트 구멍(추상화)**을 하나 파놓습니다.주문기계는 맹세코 콘센트 구멍 너머에 신용카드가 있는지 네이버페이가 있는지 1도 모릅니다. 그냥 "난 내 눈앞에 있는 콘센트 구멍(결제수단)에다가pay()전원 버튼만 누를게!" 라고 짜놓습니다.- 확장의 마법(Open): 10년 뒤, 일론 머스크가 화성 코인 결제를 추가해 달라고 합니다.
- 수정의 방어(Closed): 개발자는
주문기계클래스의 코드를 열어볼 필요조차 없습니다(1줄도 수정 안 함, 100% 안전 보장). 그냥 밖에서화성코인이라는 새로운 클래스 껍데기를 하나 더 만들고(기능 확장), 그 콘센트 구멍(결제수단 인터페이스)에 플러그를 '찰칵' 끼워주기만 하면 주문기계가 화성 코인을 쓱 가져가서 마술처럼 결제해버립니다! (다형성의 궁극적 승리)
Ⅳ. 디자인 패턴의 심장 (251번 스포일러)
- 앞으로 배울 GoF의 전략(Strategy) 패턴, 데코레이터(Decorator) 패턴 등 23가지 디자인 패턴의 90%는 결국 **"어떻게 하면 이 OCP(기존 코드 안 고치고 무한 확장하기) 원칙을 우아하게 달성할 수 있을까?"**에 대한 피 터지는 해답지 모음집입니다.
📢 섹션 요약 비유: **개방-폐쇄 원칙(OCP)**은 스마트폰의 **'절대 분해 금지, USB-C 포트(추상화) 연결 법칙'**과 같습니다. 옛날 싸구려 장난감(OCP 위반 코드)은 빛이 나는 기능을 추가하고 싶으면, 장난감의 나사를 다 풀고 배를 갈라서(기존 코드 뜯어고치기 수정) 전구 전선을 납땜으로 억지로 쑤셔 붙여야 했습니다. 그러다 메인보드를 건드려 장난감이 타버립니다(버그 폭발). 이를 부숴버린 OCP 원칙은, 스마트폰(핵심 시스템) 제조사가 폰의 배를 영원히 절대 열지 못하게(수정에 닫힘 Closed) 아예 본드로 밀봉해버리는 것입니다. 대신 폰 밑바닥에 **'USB-C 포트(인터페이스/추상화)'**라는 만능 콘센트 구멍을 뚫어두었습니다. 나중에 빔프로젝터 기능이든 3D 카메라 기능이든 새로운 기능이 필요해지면(확장에 열림 Open), 스마트폰 나사를 풀고 배를 가르는 멍청한 짓은 절대 하지 않습니다! 그냥 밖에서 새로운 빔프로젝터 기계를 하나 사서(새로운 클래스 생성), 그 기계의 선을 스마트폰 밑바닥 USB-C 포트에 '찰칵' 꽂아주기만 하면(다형성 연결) 기존 폰은 1%의 손상도 없이 새로운 우주 최강의 기능을 마음껏 뿜어낼 수 있게 되는 플러그 앤 플레이(Plug & Play)의 극한 예술입니다.