brunch

You can make anything
by writing

C.S.Lewis

by 이승현 Feb 21. 2018

Effective Java - 객체의 생성과 소멸

#02 생성자의 매개변수가 많을 때는 빌더(Builder)를 고려하자

Effective Java - 객체의 생성과 소멸


#02 생성자의 매개변수가 많을 때는 빌더(Builder)를 고려하자


이전 글을 통해 배운 static 팩토리 메서드와 기본 생성자는 공통적인 한계점이 있습니다.

둘 다 인스턴스 생성을 위한 매개변수가 많아질수록 신축성 있게 처리하지 못합니다.


#01 생성자 & public static 팩토리 메서드


이를 해결하기 위한 몇몇 방법들과 빌더(Builder)를 이용한 방법에 대해 알아보겠습니다.




#01. 텔레스코핑 생성자(Telescoping constructor) 패턴


인스턴스 생성을 위해 필요한 매개 변수들에 따라 필요한 생성자도 다양해집니다.


아래 코드를 보면 필수 필드인 servingSize, servings를 기반으로 선택 필드에 따라 생성자도 구현이 필요합니다.

#02 Telescoping constructor pattern


모든 매개 변수를 포함하는 생성자를 이용한다면 다음과 같이 구현해야 합니다.

#03 Instance


매개 변수의 개수가 적다면 괜찮지만, 만약 6개의 매개 변수가 아닌 이상의 매개 변수가 필요하다면 코드 작성이 힘들어지고 가독성도 떨어지게 됩니다.




#02. 자바 빈즈(JavaBeans) 패턴


자바 빈즈 패턴은 매개 변수가 없는 생성자를 호출해서 객체를 생성한 후, Setter 메서드를 통해 필수/선택 필드 값을 지정합니다.


#04 JavaBeans pattern


자바 빈즈 패턴은 텔레스코핑 생성자 패턴과 달리 코드도 간단해지고 가독성도 좋아집니다.


#05 Instance


하지만 자바 빈즈 패턴도 문제점이 있습니다.

자바 빈즈 패턴은 여러 번의 메서드 호출을 통해 인스턴스가 생성되므로, 그 과정에서 자바 빈 객체가 일관된 상태를 유지 못할 수 도 있습니다. 따라서 결함을 찾기 어려운 문제는 야기할 수 있습니다.

이를 해결하기 위해서 객체 생성이 완전히 끝날 때까지, 동결(Freezing)하는 방법도 있지만 실제 적용하기 어렵고 런타임 에러도 유발할 수 있습니다.


#06 Freezing JavaBeans




#03. 빌더(Builder) 패턴


위 두 가지 방법의 문제들을 빌더 패턴을 이용하면 모두 해결할 수 있습니다.


아래와 같이 구현할 수 있습니다.

1. 원하는 객체를 바로 생성하는 대신 클라이언트는 모든 필수 매개 변수를 갖는 생성자(or static 팩토리 메서드)를 호출하여 객체를 얻습니다.

2. 그다음 빌더 객체의 setter 메서드를 호출하여 필요한 선택 매개변수들의 값을 정합니다.

3. 클라이언트는 매개 변수가 없는 build 메서드를 호출하여 불변 객체를 생성합니다.

불변 객체는 생성 후에 상태가 변하지 않습니다. ex) String


#07 Builder pattern


아래와 같은 클라이언트 코드는 작성이 쉽고, 가독성이 좋습니다.

#08 Instance


불변 규칙(invariants)을 build 메서드나 setter 메서드에서 검사할 수 있습니다.

매개 변수나 필드가 가질 수 있는 값의 연속된 범위나 타입 및 형태
#09 check invariants


생성자 대비 장점은, 여러 개의 가변 인자(varargs) 매개 변수를 가질 수 있습니다.

#10 varargs


JDK1.5 이상을 사용하는 경우, 제네릭 타입만 지정하면 객체 타입에 상관없이 모든 빌더에 이용할 수 있습니다. 이에 대한 자세한 내용은 추후에 정리하겠습니다.

#11 Generic type T builder


이러한 빌더 패턴의 장점들에도 불구하고 단점도 존재합니다.

빌더 패턴의 단점은 어떤 객체를 생성하려면 우선 빌더를 생성해야 합니다.

텔레스코핑 패턴보다 코드가 길어지기 때문에, 매개 변수가 많을 때(4개 이상)만 이용하는 것이 좋습니다.




결국 객체를 생성함에 있어 아래와 같이 정리할 수 있습니다.

매개 변수가 4개 이상일 경우 : 빌더 패턴

매개 변수가 4개 이하일 경우 : 생성자 or static 팩토리 패턴




#12 Android AlertDialog


안드로이드에서는 AlertDialog에서 빌더 패턴을 볼 수 있습니다.

매거진의 이전글 Effective Java - 객체의 생성과 소멸
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari