254. 팩토리 메서드 (Factory Method) - 서브클래스 객체 생성 위임 가상 생성자 생성 패턴 다형성 유연성 OCP

핵심 인사이트: (252번 생성 패턴의 두 번째) 내가 로봇 장난감 공장(부모 클래스)을 세웠다. 공장 코드를 짤 때 로봇 = new 마징가Z() 라고 아예 못을 박아놨다. 근데 내일 유행이 지나서 '태권V'를 찍어내야 한다! 빡친 나는 공장 코드를 뜯어서 new 태권V()로 덮어쓰고 피눈물을 흘렸다(OCP 위반). 로버트 마틴이 소리쳤다. "야!! 부모 클래스(본사)는 건방지게 '마징가Z'니 뭐니 구체적인 이름을 절대 입에 올리지 마!! 대신 본사는 텅 빈 깡통 구멍 함수(추상 메서드)만 파놓고 '아 몰라, 로봇 하나 만들어줘'라고 외치고 퇴근해!! 그럼 구체적으로 어떤 놈을 찍어낼지(new) '결정'하는 건, 본사를 상속받은 밑바닥의 '자식 클래스(하청업체)'들한테 100% 짬처리(위임) 해버리란 말이야!! 마징가Z를 만들고 싶으면 '마징가 공장(자식)'이, 태권V를 만들고 싶으면 '태권V 공장(자식)'이 알아서 new를 때리게 해!!" 객체 생성의 귀찮은 책임을 자식에게 떠넘겨서 본사(핵심 코드)의 평화를 지키는 마법, 팩토리 메서드 패턴이다.

Ⅰ. 팩토리 패턴의 핵심 철학 (가상 생성자)

  • 252번에서 말했듯 new 키워드를 직접 쓰는 순간 결합도가 폭발합니다.
  • 팩토리 메서드는 다른 말로 가상 생성자(Virtual Constructor) 패턴이라고도 불립니다. 즉, 진짜 new를 때리는 생성자를 부모가 몰래 숨겨버리고(가상), 자식들이 그 생성 버튼을 대신 누르게 꼼수를 부리는 구조입니다.

Ⅱ. 팩토리 메서드 (Factory Method)의 개념 🌟

  • 개념: GoF 생성 패턴 중 하나로, 상위(부모) 클래스는 뼈대(인터페이스)만 잡아두고 실제 객체를 생성하는 일은 하지 않으며, 객체를 생성하기 위한 구멍(인터페이스/추상 메서드)만 정의해 두고, 구체적으로 어떤 클래스의 인스턴스를 생성(new)할지에 대한 결정권은 100% 서브(자식) 클래스에게 위임(떠넘기기)하는 설계 패턴입니다.

Ⅲ. 팩토리 메서드의 4대 뼈대 구조 🌟 핵심 기출 🌟

도면(UML)에 무조건 이 4개의 덩어리가 등장합니다.

  1. Product (제품 껍데기): 생성될 로봇의 공통 껍데기 규격 (예: Robot 인터페이스 - 공격하기()).
  2. Concrete Product (진짜 제품): 실제로 new 쳐서 튀어나올 진짜 로봇들 (예: MazingaZ, TaekwonV).
  3. Creator (공장 본사 껍데기) 🌟 (핵심):
    • 공통 로직을 담은 추상 부모 클래스입니다. 안에 텅 빈 createRobot() 이라는 추상 메서드(이게 팩토리 메서드임!) 구멍만 파놓고 지는 new를 절대 안 합니다.
  4. Concrete Creator (하청업체 공장 자식들):
    • 본사(Creator)를 상속받은 자식 공장들입니다. (예: MazingaFactory, TaekwonVFactory)
    • 빈 구멍으로 남아있던 createRobot() 함수를 오버라이딩하여, 이 안에서 비로소 자기가 맡은 제품을 return new MazingaZ(); 하고 진짜로 낳아줍니다(생성).

Ⅳ. 도입의 기적 (완벽한 OCP의 달성)

  • 오늘 마징가Z와 태권V만 찍어내고 있었습니다.
  • 사장님이 "내일 에반게리온 추가해!"라고 합니다.
  • 기존의 본사 코드(Creator)나 기존 로봇 코드(Product)의 배를 가르고 수정할까요? 절대 단 1줄도 수정하지 않습니다(Closed)!
  • 개발자는 밖에서 그냥 Evangelion 껍데기 클래스 하나 만들고, EvangelionFactory(자식) 공장 클래스 하나를 딸깍 만들어서 상속 라인에 툭 끼워 넣기만 하면(Open), 본사 코드는 1도 모르는 사이에 에반게리온이 무한대로 찍혀 나오는 마법의 확장성을 얻습니다.

📢 섹션 요약 비유: 팩토리 메서드 패턴은 글로벌 피자 프랜차이즈(본사)의 **'가맹점 지사 100% 재량권 짬처리 전략'**입니다. 바보 같은 프랜차이즈 본사(new 하드코딩)는 서울 본사에서 "페퍼로니 피자 레시피(new 페퍼로니)"를 못 박아버렸습니다. 제주도에 매장을 내니 손님들이 흑돼지 피자를 찾는데 본사 레시피 코드에 막혀서 못 팔고 망합니다. 이를 부순 **팩토리 메서드(본사 Creator)**는 본사 메뉴얼에 피자 레시피를 적지 않습니다! 대신 텅 빈 구멍 명령인 나만의_특산물_피자_만들기()(추상 팩토리 메서드) 하나만 띡 적어놓습니다. 그리고 구체적으로 무슨 피자(구체 Product)를 굽고 무슨 토핑을 넣을지에 대한 100%의 권한과 책임은, 서울 강남점(자식 공장 1), 제주 서귀포점(자식 공장 2) 같은 현지 가맹점(Concrete Creator)들에게 완벽하게 떠넘겨 버립니다(위임). 강남점은 그 빈 구멍 함수 안에 new 불고기피자()를 채워 넣어 굽고, 제주점은 그 구멍 안에 new 흑돼지피자()를 채워 구워냅니다. 본사는 피자를 굽는(생성하는) 고통에서 해방되어 핵심 시스템만 관리하고, 내일 부산점이 새로 오픈해도 본사는 신경 1도 안 쓰고 부산점이 알아서 new 해물피자()를 찍어내는 궁극의 하청업체 다형성 생산 라인입니다.