이제 책을 처음 넘겨보도록 했다.
첫 장은 클래스를 처음 생성할 때, 사용할 수 있는 생성자를 대신하여 정적 팩터리 메서드를 사용할 수 없는지 생각해보라는 것이었다.
이 문제가 나온 이유는 다음과 같다.
클래스를 객체로 생성할 때, 매개변수가 동일한 생성자는 하나만 구현할 수 있다.
결국 클래스에 여러 생성자를 구현하기 위해서는 생성자의 매개변수 순서를 바꾸거나, 매개변수를 계속 추가하여야 하고 결국 나중에 사용하는 사람은
생성자 중 어떤 것을 사용하여야 할 지 몰라 원하는 기능을 사용할 수 없기 때문이다.
장점으로는 다음과 같이 설명한다.
1. 정적 팩터리 메서드는 이름을 가지고 있으므로 추상적으로 짓는다면 어떠한 기능을 하는지 알 수 있다.
2. 생성자와는 달리 새로운 객체를 생성할 필요는 없다고 한다. (이미 static으로 구현되어 있기 때문)
3. public이 아닌 내부 클래스에 대한 하위 반환값을 가질 수 있다.
4. 객체를 만들 때 편리하다. 컴파일러가 형인자(type)을 스스로 알아내도록 하는 기법을 자료형 유추(type inference)라 한다.
4번의 경우는 예제를 들어보자.
Map<String, List<String>> map = new HashMap<String, List<String>>();
다음과 같은 일반적인 해시맵을 만든다고 생각해보자.
이 선언문을 조금 더 간단하고 하고 싶다면 정적 팩터리 메서드로 다음과 같은 함수를 구현한다.
public static <K, V> HashMap<K, V> newInstance(){
return new HashMap<K, V>();
}
이 함수를 사용하여 다음과 같이 간결하게 생성을 할 수 있다.
Map<String, List<String>> map = new HashMap.newInstance();
이제 장점은 책에 나온 내용을 다 봤으니, 이제 단점을 알아보도록 하자. 모든 기법에는 장단점이 있으므로, 적절하게 맞춰 사용하여야 한다.
1. 생성자가 존재하지 않으므로, 하위 클래스를 생성할 수 없다.
2. 정적 팩터리 메서드가 다른 정적 메서드와 확연히 구분되지 않는다는 것이다. 결국 이름으로 구분하여 쓴다고 한다.
책에 나온 내용은 다음과 같다.
valueOf, getInstance, newInstance, getType, newType
눈썰미 좋은 분들은 눈치챘을 것이다. 공용으로 쓸 수 있는 추상적인 네이밍이란 것을..
공용 라이브러리를 만들 때, 사용하는 것을 추천하는 바이다.
'Java' 카테고리의 다른 글
Effective Java #05 불필요한 객체는 만들지 말라 (0) | 2016.04.13 |
---|---|
Effective Java #04 객체 생성을 막을 때는 private 생성자를 사용하라 (0) | 2016.04.13 |
Effective Java #02 private 생성자나 enum 자료형은 싱글턴 패턴을 따르도록 설계하라. (0) | 2016.04.13 |
Effective Java #02 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라. (0) | 2016.04.12 |
Effective Java #00 (2) | 2016.04.11 |