256. 빌더 (Builder) - 복잡한 객체를 단계별로 생성 생성 패턴 매개변수 생성자 객체 조립 가독성 객체지향
핵심 인사이트: (252번 생성 패턴의 네 번째) "야! 피자 객체 하나 만들려고
new 피자("치즈", "토마토", "페퍼로니", "올리브", "두꺼운빵")이렇게 괄호 안에 재료 10개를 한 줄로 쑤셔 박아 넣으면, 세 번째 들어간 '페퍼로니'가 소스인지 토핑인지 치즈인지 헷갈려서 개발자가 피를 토하잖아!! 게다가 치즈를 안 넣고 싶은 손님이 오면new 피자(null, "토마토", ...)이렇게null똥칠을 해놔야 해?! 미쳤어!! 당장 무식하게 한 방에 찍어내는 멍청한 생성자를 부숴버려!! 대신 빵을 굽는 놈, 토핑 얹는 놈, 소스 뿌리는 놈처럼 '객체를 조립하는 단계(Step)'를 잘게 쪼개!! 그리고피자.빵("얇게").소스("토마토").토핑("페퍼로니").최종완성(Build)!이렇게 단계를 차근차근 밟아가면서 직관적으로 조립해 내는 기계(Builder)를 세워!! 그럼 눈 감고도 무슨 재료가 들어갔는지 읽히잖아!!" 복잡하고 뚱뚱한 객체를 에러 없이 우아하게 레고 조립하듯 쌓아 올리는 공정 라인, 빌더(Builder)다.
Ⅰ. 점층적 생성자의 끔찍한 지옥 (Telescoping Constructor)
- 객체(회원가입 정보 등)에 필드(변수)가 10개가 넘어가면, 개발자는 생성자를 무식하게 길게 짭니다.
new User("홍길동", 20, 180, 70, "서울", "학생", "010-...", ...)- 지옥 오픈: 세 번째 파라미터
180이 키인지 몸무게인지 IQ인지 알 길이 없습니다(가독성 최악). 몸무게를 안 넣으려면 중간에null이나0을 억지로 쑤셔 넣어야 해서 코드가 개판이 됩니다.
Ⅱ. 빌더 (Builder) 패턴의 개념 🌟
- 개념: GoF 생성 패턴 중 하나로, 작고 단순한 객체가 아니라 **'복잡하게 얽히고 속성이 미치도록 많은 객체'를 생성할 때, 한 번의 끔찍한 생성자 호출로 퉁치지 않고, 객체를 생성하는 방법(과정)과 객체를 실제로 표현하는 방법(결과)을 분리하여, "동일한 조립 공정(순서)을 거치면서도 서로 다른 속성값을 가진 객체를 뚝딱 만들어낼 수 있는 단계별(Step-by-step) 조립 패턴"**입니다.
Ⅲ. 빌더의 4대 구성 요소 🌟 핵심 🌟
- Builder (빌더 껍데기): "빵 깔기", "소스 바르기" 같은 **각 조립 단계들의 빈 구멍(인터페이스)**만 정의해 둔 놈입니다.
- ConcreteBuilder (진짜 조립 기계): 이 구멍을 상속받아, 진짜로 빵에 얇은 밀가루를 펴 바르고 토마토소스를 바르는 실제 내부 로직을 구현하는 노가다꾼입니다. 자기가 만든 완성된 부품 덩어리를 쥐고 있습니다.
- Product (최종 완성품): 조립 기계가 한 땀 한 땀 찍어서 최종적으로 내뱉은 '하와이안 피자' 객체 본체입니다.
- Director (감독관 / 디렉터) 🌟:
- 2번 노가다꾼을 채찍질하는 놈입니다. 자기는 피자를 못 만듭니다.
- 대신 조립 순서를 압니다. "야 기계야! 1. 빵 깔아라 ➜ 2. 소스 발라라 ➜ 3. 치즈 얹어라 ➜ 완성본 내놔!" 라고 조립의 순서(순서도 알고리즘)만 캡슐화해서 지휘합니다.
Ⅳ. 왜 실무에서 빌더 패턴을 사랑하는가? (메서드 체이닝)
- 이 패턴을 쓰면 자바 코드가 마치 영어 소설책처럼 미치도록 아름답게 읽힙니다. (가독성의 끝판왕)
User.builder().name("홍길동").age(20).address("서울").build();- 내가 넣고 싶은 옵션만 딱딱 명시적으로 이름표를 붙여서 골라 넣을 수 있고(null 똥칠 방지), 마지막에
.build()버튼 하나만 쾅 누르면 완전무결한 뚱뚱한 객체 하나가 안전하게 조립되어 떨어집니다.
📢 섹션 요약 비유: 빌더(Builder) 패턴은 서브웨이(Subway) 샌드위치 매장의 **'단계별 샌드위치 조립 시스템'**입니다. 하수 햄버거집(생성자 하드코딩)은 손님이 "토마토 빼고 올리브 많이 넣고 소스는 칠리 뿌린 치킨버거 주세요"라고 10가지 요구사항을 한 문장(
new)으로 속사포로 내뱉으면, 직원이 못 알아듣고 엉뚱한 햄버거를 내놓습니다(가독성 및 생성 에러). 서브웨이(Builder)는 이 무식한 방식을 거부합니다. 손님(Director 감독관)이 유리창을 따라 옆으로 한 발짝씩 걸어가며 조립 기계(ConcreteBuilder)에게 순서대로 하나씩 명령합니다(단계별 생성). "1단계: 빵은 플랫 브레드로 깔아(Step 1). 2단계: 치즈 빼고 닭고기 올려(Step 2). 3단계: 칠리소스 뿌려(Step 3). 끝! 포장해 줘(Build)!" 복잡하고 요구사항이 수십 개인 거대한 샌드위치(복잡한 객체)라도, 이렇게 순서를 쪼개서 하나씩 재료를 얹어 조립해 나가면 알바생도 절대 헷갈리지 않고 손님이 원하는 완벽한 100% 맞춤형 샌드위치(최종 객체)를 에러 없이 안전하게 찍어낼 수 있는 궁극의 맞춤형 조립 라인입니다.