클래스를 통해 객체를 만드는 일반적인 방법은 public으로 선언된 생성자를 이용하는 것이다. 또한 클래스에 public으로 선언된 정적 팩터리 메서드를 이용하여 객체를 생성하는 방법도 있다. 정적 팩터리 메서드를 이용했을 때 장단점은 아래와 같다.

장점1. 정적 팩터리 메서드에는 이름이 있다.

생성자는 클래스명과 이름이 같다. 생성자에 전달되는 인자들은 어떤 객체가 생성되는지 설명하지 못하며, 시그니처별로 하나의 생성자만 넣을 수 있는데 정적 팩터리 메서드를 사용하면 이러한 문제를 해결할 수 있다. 적절한 이름의 정적 팩터리 메서드이름은 생성되는 객체가 어떠한지 충분히 설명할 수 있는 장점이 있다. 

장점2. 호출할 떄마다 새로운 객체를 생성할 필요가 없다.

변경 불가능한 클래스라면(생성자가 private로 막혀있는..)  이미 만들어 둔 객체를 활용할 수도 있고, 만든 객체를 캐시해놓고 재사용하여 같은 객체가 불필요하게 생성되는 것을 제한할 수 있는 장점이 있다. 특히 객체를 만드는 비용이 클 때 위와같은 방법은 더 효율이 좋다.

장점3. 반환값 자료형의 하위 자료형 객체를 반환할 수 있다.

subA가 A의 서브클래스라고 할 때, 아래와 같은 코드를 작성할 수 있다.


위와 같은 방식으로 코드를 작성하면, SubA클래스의 구현 세부사항을 감출 수 있다. 


장점4. 형인자 자료형 객체를 만들 떄 편리하다.

보통 형인자를 전달해서 객체를 생성할 때는 아래와 같이 작성한다.


 이처럼 자료형 명세를 중복하면, 형인자가 늘어남에 따라 길고 복잡한 코드가 만들어져서, 가독성이 떨어진다. 하지만 정적 팩터리 메서드를 사용하면 컴파일러가 스스로 알아내도록 할 수 있다.이런 기법을 자료형 유추라고 한다.

 만약 HashMap클래스에서 위와같은 메서드를 지원해줬다면 코드를 좀 더 간결하게 바꿀 수 있다.


단점1. 정적 팩터리 메서드만 있는 클래스를 만들면 생기는 가장 큰 문제는, public이나 protected로 선언된 생성자가 없으므로 하위 클래스를 만들수가 없다.

즉 상속을 이용한 코드작성보다는 구성을 이용한 코드로 작성해야 한다는 것이다. 음 .. 근데 둘다 상황에 따라 설계가 다를 것 같으므로 단점이라고 생각되지는 않는다.. 

단점2. 정적 팩터리 메서드는 다른 정적 메서드와 확연히 구분되지 않는다.

정적 팩터리 메서드는 생성자처럼 다른 메서드와 확연하게 구분되지 않는다. 따라서 네이밍을 신중히 해야하고, 주석을 달아야할 것 같다..


요약

정적 팩터리 메서드와 public 생성자는 용도가 서로 다르다. 정적 팩터리 메서드의 용도는 위와같은데, 두개를 명확히 용도에 따라 구분하자니 쉽지가 않다.  일반적인 public을 이용한 생성자는 멤버변수의 초기화, 또는 상속을 이용한 설계를 할 때 사용하는 것 같다.


+ Recent posts