builder와 생성자의 차이

song yuheon·2023년 9월 20일
0

Spring

목록 보기
71/93
post-thumbnail
post-custom-banner

생성자


  1. 직관적이다
    생성자는 객체 생성을 위한 가장 기본적이고 직관적인 방법이며 클래스에 정의된 속성들을 초기화하는데 사용된다.

  2. 한정적이다
    생성자는 인자의 수와 타입이 고정되어 있기 때문에 일부 선택적인 속성들에 대해 유연성이 떨어질 수 있다.

  3. 오버로딩을 통한 유연성
    여러 생성자를 정의함으로써 다양한 방법으로 객체를 생성할 수 있지만 이 경우 생성자가 많아지면 코드 유지 관리가 어려워질 수 있다.


Builder 패턴


  1. 유연성
    Builder 패턴은 객체를 생성할 때 더 많은 유연성을 제공한다.
    선택적인 매개변수가 많은 경우에 유용하며, 필요에 따라 다양한 방식으로 객체를 구성할 수 있습니다.

  2. 가독성
    Builder 패턴은 메소드 체이닝을 사용하여 코드의 가독성을 높입니다.
    이를 통해 각 매개변수의 역할이 더 명확하게 드러나며, 어떤 값이 설정되었는지 명확하게 확인할 수 있다.

  3. 불변 객체
    Builder 패턴을 사용하면 불변 객체를 쉽게 생성할 수 있다.
    빌더를 통해 모든 필수 필드를 설정한 후 불변 객체를 생성할 수 있다.


비교


  • 복잡성
    Builder 패턴은 생성자보다 복잡하며 추가적인 Builder 클래스 또는 내부 클래스를 정의해야 한다.
  • 초기화 단계
    Builder 패턴은 복잡한 초기화 단계를 잘 처리할 수 있으며 생성자보다 객체 생성 과정을 더 잘 조절할 수 있다.
// 생성자 방식
public class User {
    private String name;
    private int age;
    
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

// Builder 패턴
public class User {
    private String name;
    private int age;

    private User(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
    }

    public static class Builder {
        private String name;
        private int age;

        public Builder setName(String name) {
            this.name = name;
            return this;
        }

        public Builder setAge(int age) {
            this.age = age;
            return this;
        }

        public User build() {
            return new User(this);
        }
    }
}

// 사용 예
User user = new User.Builder()
                 .setName("Alice")
                 .setAge(30)
                 .build();

만약 Lombok의 @builder를 사용한다면?
아래처럼 간결하게 표현 가능하다.

  • 클래스 내에서 필드를 초기화 하고 특정 필드만 값을 주어서 사용도 가능하다.
import lombok.Builder;

@Builder
public class User {
    private String name;
    private int age;
}

profile
backend_Devloper
post-custom-banner

0개의 댓글