251. 디자인 패턴 (Design Patterns) 개요 - GoF (Gang of Four) 23가지 객체지향 설계 유지보수성 재사용성 소프트웨어 아키텍처 공통 언어
핵심 인사이트: (선배들의 족보 모음집) 신입이 들어와서 "게시판에 댓글 달리면 이메일 보내는 기능 만들어줘"라는 요구를 받았다. 신입은 3일을 밤새워
if-else로 스파게티 코드를 짜서 가져왔다. 고참이 코드를 찢어버리며 외쳤다. "야 ㅆㅂ!! 네가 고민하는 그 문제, 이미 20년 전에 전 세계 천재 해커들이 다 겪어보고 며칠을 피 터지게 싸우다가 '아~ 이 상황에선 이 모양(패턴)으로 클래스 뼈대를 짜는 게 버그도 안 터지고 나중에 고치기도 제일 좋네!' 하고 정답지(족보)를 다 만들어 놨어!! 그걸 '디자인 패턴'이라고 해!! 넌 그냥 족보를 펴서 '아, 뭔가 변하면 남들한테 알려줘야 하네? 그럼 GoF의 옵저버(Observer) 패턴 도면을 그대로 복사해서 쓰면 되겠구나!' 하고 레고 조립하듯 가져다 쓰기만 하면 되잖아!!" 바퀴를 다시 발명하지 않게 해주는 선인들의 23가지 설계 필살기, GoF 디자인 패턴이다.
Ⅰ. 바퀴를 다시 발명하지 마라 (디자인 패턴의 탄생)
- 개발의 반복성: 전 세계 수백만 명의 프로그래머가 코딩하지만, 겪는 문제(예: "똑같은 객체 복사하기", "상태 바뀔 때 알림 주기")의 구조는 소름 돋게 99% 똑같습니다.
- GoF (Gang of Four)의 위대한 업적: 1994년, 에리히 감마를 비롯한 4명의 천재(4인방, GoF)가 "객체지향 설계에서 매번 반복해서 나타나는 고질적인 문제들과, 그 문제를 가장 우아하게 해결한 모범 답안 클래스 도면(해결책)"을 모아 책으로 냈습니다. 이 책에 수록된 23가지의 패턴이 현대 객체지향 프로그래밍의 절대 헌법이 되었습니다.
Ⅱ. 디자인 패턴 (Design Patterns)의 개념 🌟
- 개념: 소프트웨어 설계에서 공통으로 발생하는 문제에 대해, **자주 쓰이는 검증된 설계 구조(클래스들의 역할과 화살표 관계)를 정형화된 패턴으로 만들어 재사용할 수 있게 한 '객체지향 설계의 모범 답안지(템플릿)'**입니다.
- 기반 룰: 242번에서 배운 **SOLID(객체지향 5대 원칙)**를 가장 완벽하게 지켜내기 위한 '실전 기술(초식)'들의 모음집입니다. (244번 OCP를 밥 먹듯이 씁니다.)
Ⅲ. 디자인 패턴 도입의 3가지 기적 🌟 핵심 🌟
1. 우주 최강의 소통 도구 (개발자 공통 언어) 🌟
- 과거: "철수야, 이거 클릭하면 다른 클래스들한테 데이터 쫙 뿌려주게 리스트에 담아놓고
for문 돌려서 하나씩 함수 호출하게 짜 줘." (설명 3분 걸림) - 패턴 도입: "철수야, 이거 옵저버(Observer) 패턴으로 짜 줘." (1초 만에 설계 의도 100% 전달 완료). 전 세계 개발자들의 소통 시간을 극단적으로 단축하는 마법의 공용어입니다.
2. 유지보수성과 재사용성의 극대화
- 천재들이 며칠 밤을 새우며 결합도(Coupling)를 최하로, 응집도(Cohesion)를 최고로 맞춰놓은 황금비율 도면입니다. 이걸 가져다 쓰면 나중에 기능(확장)을 덧붙일 때 244번 OCP 룰에 따라 기존 코드를 단 1줄도 고치지 않아도 되는 마법이 펼쳐집니다.
3. 검증된 안정성 (버그 차단)
- 이미 수십 년간 윈도우, 자바, 스프링 프레임워크 뼈대를 만들면서 검증된 방식이므로, 내 맘대로 짠 스파게티 코드보다 런타임 에러가 터질 확률이 0%에 수렴합니다.
Ⅳ. GoF 23가지 패턴의 3대 분류 🌟 무조건 암기 🌟
정보처리기사 객관식/실기 단골손님입니다. 23가지 패턴은 **"어떤 문제를 해결하느냐"**에 따라 크게 3가지 덩어리로 나뉩니다. (각 덩어리의 구체적인 패턴은 252~266번에서 배웁니다.)
- 생성 패턴 (Creational Patterns, 5개): "객체를 어떻게 똑똑하게 찍어낼(Create) 것인가?"에 관한 고민. (
new키워드의 하드코딩을 피하는 법) ➜ 싱글톤, 팩토리 등. - 구조 패턴 (Structural Patterns, 7개): "조그만 클래스 블록들을 어떻게 조립해서, 더 크고 복잡한 거대 구조(뼈대)를 튼튼하게 만들 것인가?"에 관한 고민. ➜ 어댑터, 데코레이터 등.
- 행위 패턴 (Behavioral Patterns, 11개): "클래스들이 어떻게 서로 핑퐁을 치며 임무(알고리즘)를 분담하고 대화(행동)할 것인가?"에 관한 고민. ➜ 옵저버, 전략 패턴 등.
📢 섹션 요약 비유: **디자인 패턴(Design Patterns)**은 체스나 바둑에서 최고수들이 수백 년 동안 싸우며 만들어낸 **'필승 정석(기보)'**과 같습니다. 체스 초보자(신입 개발자)는 말(객체)을 자기 마음대로 툭툭 던지다가(스파게티 코딩) 상대의 함정(수정 폭발 버그)에 빠져 금방 게임에서 집니다. 하지만 체스 고수(GoF)들은 "상대방이 나이트를 이쪽으로 빼면(특정 문제 상황 발생), 나는 폰을 이렇게 빼고 비숍을 이렇게 세우는 뼈대 구조(모범 답안)가 방어력과 공격력이 가장 완벽하더라!"라는 것을 깨닫고 그걸 책(족보)으로 써놨습니다. 개발자는 매번 새로운 코드를 짜면서 맨땅에 헤딩할 필요가 없습니다. 내가 지금 부딪힌 문제가 "어? 이거 상태 변할 때 알림 주는 기능이네?" 하고 깨달으면, 체스 족보에서 '옵저버 패턴'이라는 정석을 그대로 꺼내와 도면에 맞게 말(클래스)을 배치하기만 하면, 결합도와 응집도(수비와 공격)가 100% 완벽하게 계산된 난공불락의 아키텍처를 순식간에 찍어낼 수 있는 객체지향 21세기 마법서입니다.