Backend/Java

빌더(Builder)

개발자의 첫 걸음 2025. 7. 25. 10:00

 

안녕하세요 오늘은 필드가 많아서 복합한 객체를

 

쉽게 볼 수가 있는 빌더에 알아볼게요!

 

 

빌더(Builder)

 

빌더는 소프트웨어 설계 패턴 중 하나로 복잡한 객체를 단계별로 만들 때 주로 사용해요.

 

필드(속성)가 많거나, 필드에 필수값과 선택값이 섞여있을 때 매우 유용하답니다.

 

 

빌더를 피자 주문으로 비유하자면

 

피자의 토핑(도우, 치즈, 도핑 재료)을 입맛에 맞는 주문을 받아서

 

나만의 피자를 만드는 과정과 같은 느낌이랍니다.

 

그럼 빌드의 사용목적과 장단점들을 한번 간단하게 알아볼까요?

 

 

 

빌더의 사용목적

 

빌더는 위에 소개를 한 것과 추가로 생성자가 너무 많아질 때(오버로딩)

 

코드가 복잡하고 읽기가 너무 어려울 때 주로 사용해요.

 

빌더 사용으로 가독성과 유지보수성이 좋아지고 선택적인 매개변수를 쉽게 처리가 가능해집니다.

 

 

 

빌더의 장점

 

빌더의 장점은 크게 세 가지

 

가독성 향상, 유연성 증가, 확장성 용이가 있는데요. 간단하게 알아볼게요!

 

 

1. 가독성 향상

 

첫 번째로 어떤 값이 들어가는지 한눈에 보일 수 있어요.

 

 

2. 유연성 증가

 

두 번째는 선택적으로 필요한 필드만 설정이 가능해요.

 

 

3. 확장성 용이

 

세 번째는 새로운 필드가 생겨도 기존 코드에 영향 없이 확장이 가능해요.

 

 

 

 

빌더의 단점

 

빌더의 단점은 두 가지로.

 

첫 번째 빌더 클래와 관련된 메서드 작성으로 코드량이 많이 지게 돼버려서 

 

구현적으로 복잡해 보여요.

 

두 번째는 생성자가 적은 단순한 객체에 빌더를 사용하면 가볍게 코딩할 수 있는걸 

 

역으로 복잡하게 만들고 비용이 커지는 단점이 존재합니다.

 

그때는 생성자/Setter로 대신 사용하는 게 더 보기가 좋고 명확할 수도 있어요.

 

 

 

빌더의 사용 예시 

 

class Pizza {
    // 필수 사항
    private final String menu;
    private final String size;

    // 선택 사항
    private final boolean cheese;
    private final boolean mushroom;
    private final boolean pepperoni;

    // 1) Builder 클래스 정의 (Pizza 클래스 내부의 클래스)
    public static class Builder{
        // static: Pizza 클래스가 인스턴스화 되지 않을 때 내부 Builder 클래스로 인스턴스화 진행
        // 외부클래스명.내부클래스명();

        // 필수 필드: 반드시 초기화
        private final String menu;
        private final String size;

        // 선택 필드: 기본값 설정 (추가 하지않으면 해당 값으로 입력)
        private boolean cheese = false;
        private boolean mushroom = false;
        private boolean pepperoni = false;

        // 필수 값 초기화
        public Builder(String menu, String size) {
            this.menu = menu;
            this.size = size;
        }

        // 선택 값 지정 메서드
        public Builder addCheese() {
            this.cheese = true;
            return this; // this는 해당 클래스 타입의 객체 그 자체
        }

        public Builder addMushroom() {
            this.mushroom = true;
            return this;
        }

        public Builder addPepperoni() {
            this.pepperoni = true;
            return this;
        }

        // Builder 객체를 생성하는 build 메서드
        // : 인스턴스 메서드 - 인스턴스.메서드명();
        public Pizza build() {
            return new Pizza(this);
        }
    }

    private Pizza(Builder builder) {
        this.menu = builder.menu;
        this.size = builder.size;

        // add~() 메서드 호출 하지않더라도 기본값 false 지정
        this.cheese = builder.cheese;
        this.mushroom = builder.mushroom;
        this.pepperoni = builder.pepperoni;
    }


}

피자를 빌더로 이용해서 예시를 만들어봤어요. 

 

피자의 토핑의 세 가지 cheese, mushroom, pepperoni를 선택 값 지정까지 했어요!

 

public class E_Builder {
    public static void main(String[] args) {
        // Pizza noBuilderPizza = new Pizza("파인애플 피자", "L", false, false, false);
        Pizza builderPizza = new Pizza.Builder("고구마피자","M").build();

        Pizza optionalPizza1 = new Pizza.Builder("포테이토 피자","S") // Builder 인스턴스 생성
                .addCheese() // Builder 인스턴스 메서드 - 반환 Builder 객체
                .addMushroom() // Builder 인스턴스 메서드 - 반환 Builder 객체
                .build(); // Builder 인스턴스 메서드 - 반환 Builder 객체

        Pizza optionalPizza2 = new Pizza.Builder("쉬림프 피자","L")
                .addPepperoni()
                .build();

피자의 클래스 지정 후 메인 메서드로 나만의 피자를 빌더 인스턴스를 생성해서 만들어봤어요.

 

항상 빌더를 생성 후 마침표로. build(); 를 넣어주셔야 빌더를 정상적으로 마칠 수 있어요.

 

 

 

 

 

이렇게 빌더에 대해 여러 가지를 알아봤는데요.

 

복잡한 객체가 많아서 보기 힘들 경우 빌더를 쓰면

 

옵션 고르듯 쉽게 만들 수 있을 것 같아요.

 

 

 

 

'Backend > Java' 카테고리의 다른 글

내부 클래스 (Inner Class)  (4) 2025.07.27
프레임워크(Framework)  (6) 2025.07.26
싱글톤 (Singleton)  (4) 2025.07.24
제네릭 (Generic)  (4) 2025.07.23
Java 기초 테스트  (4) 2025.07.23