이 단원에서 다루는 것:
- 언제 어떻게 객체를 생성해야 하나?
- 언제 어떻게 객체를 생성하면 안되나?
- 언제 소멸되었다고 확신할 수 있나?
- 소멸 전에 꼭 해줘야 할 액션은?
Item 1. Consider static factory method instead of constructors
public constructor 대신 static factory method는 어떤가요?
public constructor 대신 static factory method는 어떤가요?
public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; }
위 코드는 Java의 Boolean 클래스의 실제 구현입니다. 매번 Boolean 객체를 생성하는 것이 아니라, 재사용하고 있습니다.
(주의점. 디자인 패턴의 Factory Method Pattern과는 다른 개념입니다!)
장점
1. 메소드 이름을 설정할 수 있다.
클래스를 만들 때 생성자의 signature가 같아서, 매개변수 타입의 순서를 다르게 하는 꼼수(?)를 부릴 때가 있는데요. 매우 안 좋은 방법입니다. 차라리 static factory method를 제공하여 각 상황에 맞게 알맞은 메소드를 호출할 수 있게 할 수 있습니다.
2. 호출 될 때마다 새로운 객체를 생성할 필요가 없을 경우 효율성이 높은 코드를 만들 수 있다.
매번 객체를 생성할 필요가 없는 경우, 하나의 객체를 재사용할 수 있으므로 생성하는데 많은 비용이 드는 객체를 다루는 경우 퍼포먼스가 향상됩니다. 또 "=="로 객체를 비교할 수 있습니다.
3. 반환형으로 subtype 객체를 지정할 수 있습니다.
클래스의 생성자는 해당 클래스 타입만을 반환할 수 있지만 static factory method를 구현할 경우 subtype을 반환하게 할 수 있습니다.
단점
1. static factory method만 제공하는 클래스는 public or protected constructor가 없기 때문에 subclass로 사용될 수 없습니다.
따라서 개발자는 해당 클래스를 상속하기 보다 생성해서 사용하게 됩니다.
2. 다른 static method와 구별이 잘 안될 수 있습니다.
해당 메소드는 생성자를 대체하는 static method이지만 다른 static method와 구별이 잘 안될 수 있습니다. 개발자는 주석을 달거나 아래의 naming convention을 활용하여 보완할 수 있습니다.
(주의점. 디자인 패턴의 Factory Method Pattern과는 다른 개념입니다!)
장점
1. 메소드 이름을 설정할 수 있다.
클래스를 만들 때 생성자의 signature가 같아서, 매개변수 타입의 순서를 다르게 하는 꼼수(?)를 부릴 때가 있는데요. 매우 안 좋은 방법입니다. 차라리 static factory method를 제공하여 각 상황에 맞게 알맞은 메소드를 호출할 수 있게 할 수 있습니다.
2. 호출 될 때마다 새로운 객체를 생성할 필요가 없을 경우 효율성이 높은 코드를 만들 수 있다.
매번 객체를 생성할 필요가 없는 경우, 하나의 객체를 재사용할 수 있으므로 생성하는데 많은 비용이 드는 객체를 다루는 경우 퍼포먼스가 향상됩니다. 또 "=="로 객체를 비교할 수 있습니다.
3. 반환형으로 subtype 객체를 지정할 수 있습니다.
클래스의 생성자는 해당 클래스 타입만을 반환할 수 있지만 static factory method를 구현할 경우 subtype을 반환하게 할 수 있습니다.
단점
1. static factory method만 제공하는 클래스는 public or protected constructor가 없기 때문에 subclass로 사용될 수 없습니다.
따라서 개발자는 해당 클래스를 상속하기 보다 생성해서 사용하게 됩니다.
2. 다른 static method와 구별이 잘 안될 수 있습니다.
해당 메소드는 생성자를 대체하는 static method이지만 다른 static method와 구별이 잘 안될 수 있습니다. 개발자는 주석을 달거나 아래의 naming convention을 활용하여 보완할 수 있습니다.
- valueOf
- of
- getInstance
- newInstance
- getType
- newType
댓글 없음:
댓글 쓰기