Java

[JAVA] 디자인패턴 : 빌더 패턴(Builder Pattern)

연화 2025. 1. 16. 10:46

소프트웨어 개발에서 객체 생성은 가장 기본적이면서도 중요한 작업 중 하나입니다. 특히 복잡한 객체를 생성할 때는 코드의 가독성과 유지보수성을 높이기 위해 적합한 디자인 패턴을 사용하는 것이 좋습니다. 이 글에서는 객체 생성 관련 디자인 패턴 중 하나인 빌더 패턴 (Builder Pattern)에 대해 설명하고, 예제를 통해 이를 이해해보겠습니다.

 

1. 빌더 패턴이란?

빌더 패턴은 복잡한 객체를 단계별로 생성할 수 있도록 도와주는 디자인 패턴입니다. 이 패턴은 다음과 같은 상황에서 유용합니다:

  • 생성할 객체의 속성이 많을 때.
  • 객체를 생성하는 과정에서 매개변수의 순서나 가독성이 문제가 될 때.
  • 선택적인 속성들을 처리해야 할 때.

빌더 패턴을 사용하면 객체의 생성 로직과 표현 로직을 분리하여 코드의 유연성가독성을 높일 수 있습니다.

 

2. 빌더 패턴의 구조

빌더 패턴은 다음과 같은 주요 구성 요소로 이루어져 있습니다:

  • Product: 생성할 객체 (예: Person)
  • Builder: 객체 생성 로직을 포함하는 클래스 (PersonBuilder)
  • Director (선택 사항): 빌더를 조합하여 객체를 생성하는 컨트롤러 (예제에서는 생략)

 

3. 빌더 패턴 예제: Person 클래스

아래 예제는 빌더 패턴을 적용하여 Person 객체를 생성하는 코드입니다.

package ch01;

public class Person {
    // 멤버 변수 선언
    private String name;
    private int age;

    // private 생성자: Builder를 통해서만 객체 생성 가능
    private Person(PersonBuilder builder) {
        this.name = builder.name;
        this.age = builder.age;
    }

    // static 내부 클래스: PersonBuilder 정의
    public static class PersonBuilder {
        private String name;
        private int age;

        // 필수 속성을 초기화하는 생성자
        public PersonBuilder(String name, int age) {
            this.name = name;
            this.age = age;
        }

        // 선택적 속성을 설정하는 메서드
        public PersonBuilder name(String name) {
            this.name = name;
            return this; // 메서드 체이닝 지원
        }

        public PersonBuilder age(int age) {
            this.age = age;
            return this; // 메서드 체이닝 지원
        }

        // 빌더 패턴의 핵심: build 메서드로 최종 객체 반환
        public Person build() {
            return new Person(this);
        }
    }

    public static void main(String[] args) {
        // 빌더 패턴으로 Person 객체 생성
        Person person1 = new Person.PersonBuilder("홍길동", 30).build();
        Person person2 = new Person.PersonBuilder("김철수", 25)
                                     .name("김영희") // 선택적 속성 수정
                                     .age(20)       // 선택적 속성 수정
                                     .build();

        System.out.println("Person1: " + person1.name + ", " + person1.age);
        System.out.println("Person2: " + person2.name + ", " + person2.age);
    }
}

 

4. 주요 특징 및 장점

  1. 객체 생성 과정의 명확성
    빌더 패턴을 사용하면 객체 생성 과정이 코드로 명확하게 드러납니다. 매개변수 순서를 혼동할 염려가 없습니다.
  2. 메서드 체이닝 지원
    메서드 체이닝을 통해 유연하고 직관적인 코드 작성을 할 수 있습니다.
  3. 불변 객체 생성에 유용
    Person 클래스의 생성자는 private으로 제한되어 있어, 빌더를 통해서만 객체를 생성할 수 있습니다. 이로 인해 불변 객체를 쉽게 생성할 수 있습니다.
  4. 코드의 유연성
    선택적인 속성을 설정할 수 있어 다양한 요구 사항을 유연하게 처리할 수 있습니다.

 

5. 빌더 패턴의 한계

  • 복잡한 구조: 빌더 패턴은 클래스가 단순할 때는 오히려 코드가 복잡해질 수 있습니다.
  • 추가적인 클래스 필요: 빌더 클래스를 별도로 정의해야 하므로, 클래스 수가 증가합니다.

 

 

빌더 패턴은 복잡한 객체를 생성할 때 매우 유용한 디자인 패턴입니다. 특히 Java와 같이 생성자 오버로딩이 빈번히 사용되는 언어에서는 코드의 명확성과 유지보수성을 높이는 데 큰 도움을 준다고 해요.

다음에도 디자인 패턴에 관련된 포스팅으로 찾아오도록 하겠습니다. 감사합니다!

 

 

💡 다른 디자인 패턴에 대해서도 궁금하시다면 아래의 포스팅을 찾아주세요!

 

[JAVA] 디자인 패턴이란?

안녕하세요! 오늘은 소프트웨어 설계에서 자주 언급되는 디자인 패턴(Design Patterns)에 대해 알아보려고 합니다. 디자인 패턴은 개발자들에게 더 나은 설계를 위한 가이드를 제공하며, 효율적인

dev-yeonwha.tistory.com

 

[JAVA] 디자인패턴 : 어댑터 패턴(Adapter Pattern)

안녕하세요! 이번 포스팅에서는 디자인 패턴 중에서 **어댑터 패턴(Adapter Pattern)**에 대해 다뤄보려고 합니다. 어댑터 패턴은 개발 과정에서 자주 등장하는 호환성 문제를 해결하기 위해 사용되

dev-yeonwha.tistory.com

 

[JAVA] 디자인패턴 : 싱글톤 패턴(Singleton Pattern)

안녕하세요! 이번 포스팅에서는 디자인 패턴 중에서도 가장 기본적이고 널리 사용되는 싱글톤 패턴(Singleton Pattern)에 대해 알아보겠습니다. 싱글톤 패턴은 프로그램에서 단 하나의 객체만 생성

dev-yeonwha.tistory.com

 

[JAVA] 디자인패턴 : 콜백(Callback) 패턴 알아보기

안녕하세요! 오늘은 디자인 패턴 중에서도 콜백 메서드라는 개념에 대해 알아보겠습니다. 콜백 메서드는 유연하고 확장 가능한 코드 설계를 가능하게 하며, 특히 비동기 처리나 이벤트 기반 시

dev-yeonwha.tistory.com