빌더 패턴 (Builder Pattern)

ForLearn·2022년 10월 27일
0

롬복을 이용하면서 @Builder을 선언하여 객체를 종종 생선하곤 한다. 대충 빌더패턴을 이용해서 객체를 생성한다든 정도로 알고 사용했다. 제대로 사용하기 위해 어떤 특징과 장단점을 가지는지 알아보도록 하자.

빌더 패턴의 특징

매개변수 순서, 데이터 추가에 따른 생성자 신경쓰지 않아도 됨 ➡ 유연성 확보

생성자로 객체를 생성하는 경우, 인자가 많아질 수록 생성하는 필드가 추가될 수록 관리하기 힘들다는 단점이 있다.

만약 User 객체를 생성하는 경우 iq의 값을 빼고 생성한다면, iq에 더미 값을 넣거나 iq가 없는 생성자를 만들어야 한다.

생성자로 객체 생성

public class User {

    private String name;
    private int age;
    private int height;
    private int iq;
    
    // iq가 없는 생성자를 따로 생성했음... 
     public User (String name , int age , int height {
        this.name = name;
        this.height = height;
        this.iq = iq;
    }
    // 정적 메서드를 이용한 방법 
    public static User of(String name, int age, int height) {
        return new User(name, 0, 180, 150);
    }
    
}

User user = new User("개발자", 30, 200);

롬복의 @Builder를 사용

User user = User.builder()
             .name("개발자")
             .age(30)
             .height(200)
             .build();

빌더 패턴을 사용하면 매개변수의 순서, 생성자 추가등을 고려하지 않아도 된다.
또한 위의 생성자와 비교할 경우 User에 어떤 필드를 추가해줘야 할지 명식적으로 알 수 있어서 코드의 가독성이 더 좋아진다.

➡ 만약 User 클래스에 Weight라는 필드가 추가되었다면 새로운 코드를 추가해야 한다.

User user = new User("개발자", 30, 200);
User user = new User("개발자", 30, 200 , 100);

변경 가능성 최소화

개발을 하다보면 많은 경우 수정자 패턴(Setter)을 자주 사용하게 된다. 하지만 Setter의 사용은 불필요한 변경 가능성을 열어두게 된다. 이는 유지보수 하는 경우 값이 할당된 지점을 찾기 어렵게 한다.

변경 가능성을 최소화하는 좋은 방법은 final을 사용하여 불변성을 확보하는 것이다. final을 사용할 수 없는 경우 Setter을 사용하지 않음으로 변경 가능성을 열어두지 않는 방법이 있다.

빌더패턴을 사용하면 Setter를 사용하지 않기 때문에 이를 보장할 수 있다.

장점

  1. 데이터(매개변수)의 순서 상관없이 객체 생성 가능
  2. 코드의 가독성이 좋아짐
  3. 필요한 데이터만 설정 가능
  4. 변경 가능성을 최소화할 수 있음 (setter를 사용하지 않아 불변성)

Reference

0개의 댓글