ETC

빌더 패턴

낙타선생 2020. 10. 12. 18:02
반응형

빌더 패턴은 객체를 생성할 때 사용하는 패턴의 하나이다.

 

 

 

빌더 패턴의 장점

  1. 불필요한 생성자를 제거
  2. 데이터 순서와 상관없이 객체를 생성할 수 있게 해 줌

 

 

빌더 패턴의 예

먼저 빌더 클래스를 통해 생성하기 원하는 Info라는 클래스가 다음과 같이 선언되어 있다고 하자.

public class Info {
	
    private String name;
    private int age;
}

 

1. Info 객체 생성을 대행해줄 빌더 클래스인 InfoBuilder 작성

public InfoBuilder {
	
    private String name;
    private int age;
    
    public InfoBuilder setName(String name) {
    	this.name = name;
        return this;
    }
    public InfoBuilder setAge(int age) {
    	this.age = age;
        return this;
    }
    
    public Info build() {
    	return new Info(name, age);
    }
}

 

빌더 클래스 안에 실제 생성하고자 하는 객체의 생성 작업에 필요한 멤버 변수들과 동일한 멤버 변수를 선언한다.

멤버 변수의 setter를 각각 생성하고 각 setter는 빌드 클래스의 객체를 반환하도록 한다.

build()를 호출하면 Info 타입 객체를 생성하게 된다.

 

2. InfoBuilder 객체를 통해 Info 개체를 생성하는 방법

InfoBuilder infoBuilder = new InfoBuilder();

Info info = infoBuilder
		.setName("Dave")
                .setAge(28)
                .build();

 

 

 

롬복을 사용한 빌더 패턴

롬복(lombok) 플러그인을 사용하는 경우 클래스에 @Builder 애노테이션을 붙여 빌더 패턴 클래스를 간단히 만들 수 있다.

위의 예를 롬복 플러그인을 통해 리팩터링 하면 다음과 같다.

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

Info info = Info.Builder()
    .name("Dave")
    .age(28)
    .build();

 

보는 바와 같이 코드를 매우 간략하게 만들 수 있고 가독성 또한 좋아진다.

 

 

롬복 빌더 클래스의 멤버 변수 초기값 설정

빌더를 통해 객체를 생성할 때 특정 멤버 변수를 초기화할 값이 주어지지 않으면 멤버 변수의 데이터 타입에 따라 0 / null / false 중 하나로 초기화 되게 된다. 만약 원하는 값으로 초기화하고자 한다면 다음과 같이 멤버 변수 선언부에 @Builder.Default를 붙여준다.

@Builder
class Info {
	
    private String name;
    
    @Builder.Default 
    private int age = 20;
}

 

멤버 변수인 나이를 지정하지 않으면 초기값으로 20을 사용하여 객체를 생성하게 된다.