본문 바로가기
LV3_Advanced/GOF 패턴

Builder (빌더) - 생성 패턴 #2

by 하타라시 2026. 2. 16.

목차

💡
  • 왜 빌더 패턴을 사용해야 하는가?
  • 설계도는 어떻게 생겼나?
  • 실제로 어떻게 구현하나?
  • 장점과 단점은 무엇인가?

왜 빌더 패턴을 사용해야 하는가?

생성자에 들어갈 매개변수가 많고, 그 중 필수가 아닌 선택적인 값이 섞여 있을 때, 실수를 방지하기 위해 사용합니다.

생성자의 경우 매개변수를 입력하는 순서가 정해져 있지만, 마무리를 하기 전까지 값을 명확하게 추가할 수 있습니다.

설계도는 어떻게 생겼나?

만들고자 하는 객체 안에 static 형태의 Builder클래스를 만들고, 값을 세팅한 뒤 this를 반환합니다.

실패

실제로 어떻게 구현하나?

빌더 클래스 세팅

public class Hero {
    private String name;
    private int hp;
    private String weapon; // 선택 사항

    // 생성자는 private으로 막아서 외부에서 직접 생성 못하게 함
    private Hero(Builder builder) {
        this.name = builder.name;
        this.hp = builder.hp;
        this.weapon = builder.weapon;
    }

    // 내부에 static builder 클래스를 생성
    public static class Builder {
        // 필수 값
        private String name;
        private int hp;
        
        // 선택 값
        private String weapon;

				// 필수 값은 생성자로 받기
        public Builder(String name, int hp) {
            this.name = name;
            this.hp = hp;
        }
        
				/*
        public Builder setName(String name) {
            this.name = name;
            return this;
        }
        
        public Builder setHp(int hp) {
            this.hp = hp;
            return this;
        }
        */

        public Builder setWeapon(String weapon) {
            this.weapon = weapon;
            return this;
        }

        // 최종적으로 static 내부에서 만들어진 Hero를 반환
        public Hero build() {
            return new Hero(this);
        }
    }
}

실행 예시

public class Main {
    public static void main(String[] args) {
        
        // 점(.)을 찍어서 계속 연결하는 것이 핵심!
        Hero myHero = new Hero.Builder("전사", 100) 
                .setWeapon("전설의 검")           
                .build();                         

        System.out.println("생성 완료!");
    }
}

장점과 단점은 무엇인가?

장점

  • 가독성 향상
    • new Hero(”A”, 1 , null, “Sword”) 처럼 모든 파라미터를 생성자에 만드는 형태가 아니라, new Hero.Builder(”홍길동”,88).setWeapon(”Sword”) 같은 형태로 사용해서 필요한 파라미터만 추가하면 됩니다.
  • 안정성 향상
    • 필수 값은 객체 생성 시점에 반드시 전달되고, 선택 값은 명확하게 구분되어 객체 생성 과정에서의 실수를 줄일 수 있습니다.

단점

  • 구조 복잡성 증가
    • 빌더 패턴을 만들기 위해서, 클래스가 2개 이상 활용해야 하기 때문에, 간단한 클래스라면 오히려 복잡해지게 됩니다.
  • 코드 수정의 번거로움
    • N개의 필드를 가진 클래스를 만들려면, 빌더 클래스에도 N개의 필드를 만들어야합니다.