728x90

객체의 생성과 파괴 Item2 - 생성자에 매개변수가 많다면 빌더를 고려하라

 

필수 매개변수와 선택 매개변수

다음은 클래스 Dog에 담겨져 있는 정보들이다.

타입 이름 설명 구분
String name 이름 필수
int age 나이 필수
String kind 선택
int weight 무게 선택

위 테이블에는 당장 필요한 정보, 당장 필요 없는 정보가 있다.

하지만 급하지 않은 정보 때문에 객체 생성을 못하고 있는건 낭비같다.

 

만약 이 모든 조합을 생성자로 생성하면 생성자 메서드만 엄청 많아질 것이다.

 

자바빈즈 패턴

public class Dog
{
    String name;
    int age;
    String kind;
    int weight;
    
    // Setter
    public void setName(String name)
    {
        this.name = name;
    }
    
    public void setAge(int age)
    {
        this.age = age;
    }
    
    public void setKind(String kind)
    {
        this.kind = kind;
    }
    
    public void setWeight(int weight)
    {
        this.weight = weight;
    }
}

public class Application
{
    public static void main(String[] args)
    {
        Dog dog = new Dog();
        dog.setName("월월이");
        dog.setAge(2);
        dog.setKind("치와와");
        dog.setWeight(3);
    }
}

이 코드는  위에 엄청 많아질 생성자 코드보다는 훨씬 깔끔하다.

하지만 이 코드는 객체 하나를 생성하는데 이렇게 많은 메서드를 호출해야 한다.

 

빌더 패턴

public class Dog
{
    String name;
    int age;
    String kind;
    int weight;
    
    public static class Builder 
	{
        // 필수 매개변수
        private final String name;
        private final int age;

        // 선택 매개변수 - 기본값으로 초기화한다.
        private String kind = "똥개";
        private int weight = 0;

        public Builder(String name, int age) 
  		{
            this.name = name;
            this.age = age;
        }

        public Builder kind(String val)
        { 	
  			kind = val;      
  			return this; 
  		}
        public Builder weight(int val)
        { 
  			weight = val;           
  			return this; 
  		}

        public Dog build() {
            return new Dog(this);
        }
    }
    
    private Dog(Builder builder)
    {
        name = builder.name;
        age = builder.age;
        kind = builder.kind;
        weight = builder.weight;
    }
}

public class Application
{
    public static void main(String[] args)
    {
        Dog dog = new Dog()
            .Builder("애옹이", 3)
            .kind("치와와")
            .weight(4)
            .build();
    }
}

위 코드는 빌더 패턴이다.

 

빌더 패턴은 내부의 Builder클래스를 작성해서 객체를 생성한다.

 

장점

  • 점층적 생성자 패턴처럼 객체 안정성이 있다.
  • 자바 빈즈 패턴처럼 코드 가독성이 좋고 유연하다.

단점

  • 빌더에 대한 코드를 따로 작성해야 한다.
  • 매개변수가 4개 이상일 때 그 효과가 좋다.

 

728x90

+ Recent posts