252. 생성 패턴 (Creational Patterns) - 객체 생성 메커니즘 캡슐화 인스턴스화 은닉 GoF 디자인 패턴 결합도
핵심 인사이트: (GoF 3대 분류 중 첫 번째) "야! 251번 디자인 패턴 배운댔지? 그중 첫 번째 5마리(생성 패턴)는 오직 하나의 목표만 패는 놈들이야. 너희 자바에서 객체 만들 때 무조건
new 마티즈()이렇게 쓰지? 근데 네 코드가마티즈라는 구체적인 이름(클래스)을 1만 줄에 다 박아놨는데, 내일 사장님이 '마티즈 단종! 전부 스파크로 바꿔!'라고 하면? 1만 줄 다 찾아서new 스파크()로 고칠래?! 미친 노가다잖아!! 생성 패턴의 핵심은 이 저주받은new키워드를 네 메인 코드에서 싹 다 파내서 쓰레기통에 버려버리는 거야!! 대신 '객체를 찍어내는 공장(Factory)'을 따로 만들어서 꽁꽁 숨겨(캡슐화)!! 그리고 넌 공장한테 '자동차 하나 줘'라고 추상적으로 부탁만 해! 그럼 내일 스파크로 바뀌어도 넌 코드 1줄 안 고치고 공장장이 알아서 스파크를 찍어주잖아!!" 객체의 탄생(new)이라는 가장 위험한 순간을 통제하고 은닉하는 조물주의 마법, 생성 패턴이다.
Ⅰ. new 키워드의 치명적 저주 (강한 결합도)
- 비극:
Car myCar = new Avante();처럼 코드를 짜는 순간, 내 클래스(고수준)와Avante(저수준 구체물)는 콘크리트로 찰싹 달라붙어버립니다(강한 결합). - 내일 차 종이 바뀌면 내 코드를 찢어발기고 뜯어고쳐야 합니다. (244번 OCP 원칙, 247번 DIP 원칙 완벽 위배)
- 즉, **"객체를 누가 언제 어떻게 생성할 것인가?"**를 고민 없이 짜면 시스템 확장이 아예 불가능해집니다.
Ⅱ. 생성 패턴 (Creational Patterns)의 개념 🌟
- 개념: GoF의 23가지 패턴 중 '객체의 생성(Creation)과 참조 과정'을 캡슐화(은닉)하여, 시스템이 어떤 구체적인 클래스에 의존하지 않게(느슨한 결합) 만들어주는 5가지 패턴의 모음입니다.
- 핵심 목표: 내 코드 밖에서 객체를 알아서 찍어내게 만들어서, 나중에 조립할 부품(클래스)이 바뀌어도 내 코드는 단 1줄도 수정되지 않게 보호하는 것입니다.
Ⅲ. 생성 패턴의 5형제 (간략 스포일러) 🌟 무조건 암기 🌟
정보처리기사 시험에서 "다음 중 생성 패턴이 아닌 것은?"으로 100% 출제됩니다. (각 패턴의 디테일은 253~257번에서 파고듭니다.)
- 싱글톤 (Singleton): "야! DB 연결 객체 1만 개 찍어내면 메모리 터져! 우주에 무조건 딱 1개만 만들어서 다 같이 돌려 써!"
- 팩토리 메서드 (Factory Method): "객체 생성은 부모가 안 해! 생성 권한(결정권)을 자식 클래스한테 짬처리(위임) 시켜버려!"
- 추상 팩토리 (Abstract Factory): "공장 1개가 아니라, 윈도우용 버튼/스크롤 공장, 맥용 버튼/스크롤 공장처럼 연관된 부품(군)들을 통째로 묶어서 찍어내는 거대 복합 공장이야!"
- 빌더 (Builder): "객체 생성할 때 매개변수 10개 던지다 헷갈려 죽겠다! 피자 만들 때 빵 고르고, 토핑 얹고, 소스 뿌리듯 단계별로 차근차근 조립해서 찍어내!"
- 프로토타입 (Prototype): "DB 긁어서 객체 1개 만드는데 10초 걸리네? 두 번째 똑같은 놈 만들 때는 DB 가지 말고, 만들어진 원본 놈을 Ctrl+C, Ctrl+V(복제) 해서 1초 만에 쑴풍쑴풍 찍어내!"
Ⅳ. 왜 생성 패턴이 아키텍처의 시작인가?
- 건물을 지으려면 일단 '벽돌(객체)'을 가져와야 합니다.
- 근데 내가 찰흙(new)으로 매번 벽돌을 굽고 있으면 집이 엉망이 됩니다.
- 이 생성 패턴 5인방은 내가 찰흙을 만지지 않고, 외부의 '스마트 공장'에 전화를 걸어 100% 규격이 일치하는 벽돌(객체)을 안전하게 배달받도록 만들어주는 가장 우아한 팩토리 시스템의 기초입니다.
📢 섹션 요약 비유: **생성 패턴(Creational Patterns)**은 레스토랑의 **'요리 주문과 제조의 철저한 분리 원칙'**입니다. 하수 식당(new 하드코딩)은 홀서빙 직원이 손님 주문을 받으면 자기가 직접 주방에 들어가서 프라이팬을 들고 스파게티(
new 스파게티())를 만듭니다(강한 결합). 만약 내일부터 메뉴가 우동으로 바뀌면 서빙 직원이 우동 요리법까지 새로 배워야 하는 쌩고생을 합니다(OCP 위반 수정). 이를 깨부순 생성 패턴은 식당에 **'거대한 밀폐 주방(Factory 캡슐화)'**을 하나 지어버립니다. 홀서빙 직원은 이제 절대 주방(생성 과정)에 들어가지 않습니다! 손님이 주문하면 그냥 주방 문틈(인터페이스)으로 "면 요리 하나 주세요!" 라고 추상적인 주문(요청)만 쓱 밀어 넣고 돌아섭니다. 그럼 밀폐된 주방 안에서 주방장(팩토리 메서드나 빌더)이 오늘 메뉴에 맞춰서 알아서 스파게티를 볶든 우동을 삶든 뚝딱 찍어내서 접시에 담아 내보내 줍니다. 서빙 직원은 접시에 담긴 게 면이기만 하면 그냥 쿨하게 손님상에 내면 끝나는, '무엇(What)을 쓸지만 생각하고 어떻게(How) 찍어낼지는 완전히 남에게 미뤄버리는' 객체지향 1원칙의 실사판입니다.