SOIEU.TAGSABOUT

ITEM2. 생성자에 매개변수가 많다면 빌더 패턴을 고려하라

방법 1. 매개변수의 경우의 수만큼 생성자 만들기

public class Person {
    private String name;
    private int age;
    private String address;

    // 모든 매개변수를 받는 생성자
    public Person(String name, int age, String address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // 일부만 받는 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person(String name) {
        this.name = name;
    }
}
  • 장점: 클래스 인스턴스를 생성할 때 단일 메소드 호출로 필요한 값들을 설정할 수 있다.
  • 단점: 매개변수 조합이 많아질수록 생성자 오버로딩이 너무 많아져 가독성이 떨어지고, 유지보수가 어려워진다.

방법 2. set 메서드로 필요한 매개변수만 설정하기

public class Person {
    private String name;
    private int age;
    private String address;

    // 기본 생성자
    public Person() {}

    // setter 메서드
    public void setName(String name) {
        this.name = name;
    }

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

    public void setAddress(String address) {
        this.address = address;
    }
}
  • 장점: 원하는 값만 선택적으로 설정할 수 있어 초기화가 유연하다.
  • 단점: 객체를 만들고 여러 set 메서드를 호출해야 해서 코드가 길어진다. 또한, 객체가 완전히 초기화되지 않을 위험성이 있다.

방법 3. 빌더 패턴

public class Person {
    private String name;
    private int age;
    private String address;

    // private 생성자
    private Person(Builder builder) {
        this.name = builder.name;
        this.age = builder.age;
        this.address = builder.address;
    }

    // Builder 클래스
    public static class Builder {
        private String name;
        private int age;
        private String address;

        public Builder setName(String name) {
            this.name = name;
            return this; // 빌더 객체를 반환
        }

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

        public Builder setAddress(String address) {
            this.address = address;
            return this;
        }

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

// 사용 예시
Person person = new Person.Builder()
    .setName("Alice")
    .setAge(30)
    .setAddress("123 Main St")
    .build();

  • 장점:
    • 가독성이 뛰어나고 코드가 간결하다.
    • 객체를 불변으로 설계할 수 있다.
    • 매개변수가 많을 때 적합하며, 선택적으로 설정할 수 있다.
  • 단점: 클래스와 함께 추가적인 Builder 클래스가 필요해 코드가 약간 길어진다.

결론

빌더 패턴은 매개변수가 많거나 선택적으로 초기화해야 할 경우 가장 적합하다. 특히, 유지보수와 확장성이 중요할 때 유용하다. 반면, 간단한 클래스에는 생성자 방식이나 set 메서드를 사용하는 것이 더 효율적일 수 있다.

;