1) 개요
자바에서 인스턴스를 생성할 수 있는 방법은 public(or protected) 생성자를 사용하는 것입니다.
하지만 static factory method로도 인스턴스를 생성할 수 있습니다.
다음의 예제를 살펴보겠습니다.
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
위 예제를 살펴보면 정적 팩토리 메소드(static factory method)는 생성자 대신에 사용할 수 있는 것을 알 수 있으실 겁니다.
여기서는 생성자를 대신하여 사용할 수 있는 정적 팩토리 메소드를 살펴보겠습니다.
static factory method가 가지는 장점이 몇 가지 있습니다.
1. 생성자와 다르게 이름을 가지고 있습니다.
매개변수로만 구분되어지는 생성자는 인스턴스되었을 때 해당 생성자가 어떤 로직을 담고 있는지 직접 확인해야하는 알 수 있는 번거로움이 존재합니다. 그에 반해 static factory method는 명명되어 개발자가 이름만으로도 코드를 이해하기 쉽게 만들어줍니다.
2. 호출할 때마다 객체를 새로 생성할 필요가 없습니다.
불변 클래스(immutable class)는 불 필요한 객체를 새로 생성하지 않아도 이미 구성되어진 인스턴스를 사용할 수 있습니다.(Flyweight Pattern과 흡사한 장점입니다.) 그에 따라 생성하는데 어려움이 있는 객체를 간단하게 만들고 사용할 수 있게 됩니다.
3. 반환 유형(return type)을 정하여 객체를 반환할 수 있습니다.
return type을 지정할 수 있는 건 해당 객체가 굉장히 유연한 구조를 가질 수 있다는 것과 같습니다. 이를테면 자신의 하위객체(subtype)를 지정해서 return할 수 있으며 이는 인터페이스에 속하는 실제 객체를 숨기고 싶을 때 매우 유용합니다.
static factory method가 가지는 단점도 몇 가지가 있습니다.
1. public 또는 protected 의 접근 지정자 없이는 서브클래싱할 수 없습니다.
2. 프로그래머가 생성자를 찾기 어렵습니다.
클래스의 생성자가 클래스와 다른 이름을 가지고 있을 수 있기 때문에 생성자에 관련된 문서나 지시없이는 특정 메소드가 생성자인지 파악하기 어렵습니다. 그러나 static factory method에 관련된 공통 규칙이나 문서를 작성함으로 이 단점에서 다소 자유로워질 수 있습니다.
2) 예제
생성자(Constructor)와 static factory method의 예제를 먼저 살펴보겠습니다.
public class Color {
private final int hex;
Color(String rgb) {
this(Integer.parseInt(rgb, 16));
}
Color(int red, int green, int blue) {
this(red << 16 + green << 8 + blue);
}
Color(int h) {
this.hex = h;
}
}
public class staticColor {
private final int hex;
private staticColor(int h) {
this.hex = h;
}
static staticColor makeFromRGB(String rgb) {
return new staticColor(Integer.parseInt(rgb, 16));
}
static staticColor makeFromPalette(int red, int green, int blue) {
return new staticColor(red << 16 + green << 8 + blue);
}
static staticColor makeFromHex(int h) {
return new staticColor(h);
}
}
3) 결론
static factory method와 관련하여 결론을 내보자면
전체적인 구조와 결합도가 높은 객체는 생성자를 사용하는 것이 권장되며,
전체적인 구조와 결합도가 낮은 객체는 static factory method를 사용하는 것이 좋습니다.
'독후감 > Effective Java' 카테고리의 다른 글
6. 불필요한 객체 생성을 피하라 (0) | 2021.03.31 |
---|---|
5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2021.03.30 |
4. 인스턴스화를 막으려거든 private 생성자를 사용하라 (0) | 2021.03.18 |
3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2021.03.18 |
2. 생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2021.03.18 |