티스토리 뷰

JAVA

생성자 인자가 많을때는 빌더 패턴

세댕댕이 2022. 7. 15. 01:29

2. 생성자 인자가 많을때는 빌더 패턴

생성자에 들어가는 파라미터 개수가 많을 경우 사용해볼만한 패턴은 다음과 같다

 

1. 점층적 생성자 패턴

- 필수 인자만 받는 생성자 하나 정의

- 그 이후부터 선택적 인자를 추가해가면서 생성자를 계속 쌓아나가는 방식

- 각 파라미터가 무슨 값인지 의미를 알기 어렵고, 자료형이 같은 인자들끼리 순서를 잘못 넣어 문제를 일으킬 가능성이 상당히 높다.

 

2. 자바빈 패턴

- 일단 인자 없는 생성자(NoArgsConstructor)를 호출해서 빈 객체를 만듬

- 그 다음에 setter 프로퍼티를 이용해서 값을 하나하나 채워주는 방식

- 1회의 함수 호출로 객체 생성을 끝낼 수 없으므로, 객체의 일관성이 일시적으로 깨질 수 있다.

- 변경 불가능(immutable)한 클래스를 만들 수 없다

 

3. 빌더 패턴

- 점층적 생성자 패턴의 안정성과 자바빈 패턴의 가독성을 결합

- 클라이언트가 필요한 객체를 직접 생성하는 대신, 필수 인자들을 전달하여 빌더 객체(Builder Object)를 만든 뒤, 빌더 객체에 정의된 설정 메서드들을 호출하여 선택적 인자들을 추가해나가는 방식.

- 메서드 체인(Method Chaining)방식으로 메서드를 계속 호출하면서 각 필드의 이름과 인자를 매핑할 수 있다.

public class User {
    private final String name;
    private final String tel;
    private final String birth;
    private final String address;

    public static class Builder {
        // 필수 인자
        private final String name;
        private final String tel;
        
        // 선택 인자
        private String birth;
        private String address;

        public Builder(String name, String tel) {
            this.name = name;
            this.tel = tel;
        }
        public Builder birth(String birth) {
            this.birth = birth; return this;
        }
        public Builder address(String address) {
            this.address = address; return this;
        }
        public User build() {
            return new User(this);
        }
    }

    private User(Builder builder) {
        name = builder.name;
        tel = builder.tel;
        birth = builder.birth;
        address = builder.address;
    }
}

////////////

public static void main(String[] args) {
    User user = new User.Builder("name", "tel")
                    .address("address")
                    .birth("birth").build();
}

- 가독성이 아주아주 뛰어나다

- 불변 객체를 만들 수 있다. (필드에 final이 붙어있기 때문에 Setter 등을 통해 값이 변경될 수 없다)

-> 변경점을 최소화하고 유지보수를 용이하게 만들어준다!!

 

 

* Lombok을 이용하면 아주 편리하게 빌더패턴을 이용할 수 있다. (@AllArgsConstructor 필요)

@Builder
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class User {
    private final String name;
    private final String tel;
    private final String birth;
    private final String address;
}

모든 값을 채우지 않고도 객체를 생성할 수 있으며, 이 경우 채워지지 않은 값은 null로 할당된다.

-> 매우 유연한 객체 생성 가능. 하나의 빌더 객체로 여러 형태의 객체를 만들어낼 수 있다.

 

 

<단점>

1. 객체를 생성하기 위해서는 빌더 객체를 먼저 생성해야 한다. 극한의 성능을 따지는 순간에서는 문제가 될수도?

2. 코드가 길어지는건 어쩔 수 없다. 인자가 한두개인 경우는 굳이 쓸 필요가 없다.

'JAVA' 카테고리의 다른 글

객체 생성을 막을때는 private 생성자  (0) 2022.07.15
싱글톤은 Enum 타입으로 만들어라  (0) 2022.07.15
생성자 대신 정적 팩토리 메서드  (0) 2022.07.15
JAVA의 예외 처리란?  (1) 2021.11.26
인터페이스란?  (0) 2021.11.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함