여기에 아이템1에 나온 용어들을 정리했습니다.
클래스를 인스턴스화 하기 위해서 필요한것이 바로 생성자다.
Human h = new Human(); // new 생성자를 통한 인스턴스를 생성
public 생성자를 통해서 인스턴스를 생성할 수 있다.
생성자에 넘기는 매개변수에 따라 같은 클래스 내에도 여러 생성자를 가질 수 있다.
Class Human {
private String name;
private int age;
private String gene;
public Human(String name, int age, String gene) { ... }
public Human(String name) { ... }
public Human(int age) { ... }
public Human(String gene){ ... }
}
생성자 마다 어떤 이유로 매개변수를 다르게 주는지 알려면 코드를 작성한 사람에게 묻거나 직접 내부를 볼 수 밖에 없다.
이때 사용할 수 있는게 정적 팩토리 메서드다.
public class Human {
private String name;
private int age;
private String gene;
public static Human basicRegistration(String name, int age, String gene) { ... }
public static Human registerBygene(String gene){ ... }
public static Human registerByAge(int age){ ... }
}
public class LottoNum {
private static final int MIN_NUM = 1;
private static final int MAX_NUM = 45;
private static List<LottoNum> lottoNums = new ArrayList();
public static void init(){
for (int i = 0; i < 6; i++) {
IntStream.range(MIN_NUM, MAX_NUM)
.forEach(i -> new LottoNum(i));
}
}
private int pickNum;
private LottoNum(int pickNum) {
this.pickNum = pickNum;
}
public List<LottoNum> getLottoNums() {
return lottoNums;
}
}
public abstract class Mammal {
...
public static Mammal getSpecies(String characteristic){
if(characteristic.equals("cute"){
return new Dog();
}
if(characteristic.equals("bipedalism"){
return new Human();
}
}
...
}
이런 장점들에도 불구 하고 단점은 존재합니다.
public abstract class Test {
private Test() {
}
static public Test test() {
return new Test();
}
}
위 코드와 같이 상속을 하려면 public이나 protected 생성자가 필요한데, 정적 팩토리 메서드 방식을 사용하면 하위 클래스를 만들 수 없게 됩니다.
그리고 정적 팩토리 메소드는 따로 문서화를 통해 명시해야 합니다. 그렇지 않으면 개발자가 팩토리 메소드를 찾기 힘들겁니다. ㅠ