본문 바로가기

독후감/Effective Java

1. 생성자 대신 static factory method를 사용해보자

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를 사용하는 것이 좋습니다.