ETC
빌더 패턴
낙타선생
2020. 10. 12. 18:02
반응형
빌더 패턴은 객체를 생성할 때 사용하는 패턴의 하나이다.
빌더 패턴의 장점
- 불필요한 생성자를 제거
- 데이터 순서와 상관없이 객체를 생성할 수 있게 해 줌
빌더 패턴의 예
먼저 빌더 클래스를 통해 생성하기 원하는 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을 사용하여 객체를 생성하게 된다.