앞날 창창보
article thumbnail

 

뭘 골라야하지~

 

주변 사람들이 언제부턴가 "생성자 쓰지마! 정적 팩토리 메서드(이하 정팩메)가 최고야!"라고 말하기 시작했다. 사실 나는 정팩메를 싫어한다. 이유는 정말 단순했다. 생성자에 굳이굳이 메서드를 한 번 더 감싸기 때문에 코드가 더 늘어나기 때문이다. 그리고 new 라는 키워드가 눈에 훨씬 잘 들어와서, 객체를 생성한다는 것을 잘 보여준다고 느껴졌다.

그러나 나도 이펙티브 자바를 읽고자 마음을 먹었고, 책을 펼치자, "생성자 대신 정적 팩터리 메서드를 고려하라" 라는 말이 눈에 들어왔다. (드디어 찾았다! 범인!)

 

정적 팩토리 메서드의 장단점


정적 팩토리 메서드는 장점이 많다.

 

장점

1. 이름을 가질 수 있다.

   생성자는 넘기는 매개변수와 생성자 그 자체로는 어떤 객체가 생성될 지 판단 해야하는데 이 과정은 명확하지 않다. 

 

2. 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다.

   필요에 따라 싱글턴 패턴, 플라이웨이트 패턴과 비슷한 개념으로 활용할 수 있다.

 

3. 반환 타입의 하위 타입 객체를 반환할 수 있다.

   구현 클래스를 공개하지 않고도 그 객체를 반환할 수 있어서, API를 작게 유지할 수 있다.

 

4. 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수 있다.

 

5. 정팩메를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다.

   클래스가 존재하지 않고, 인터페이스가 존재하는 것이다. 다음과 같이 설계한다면 서비스 제공자 프레임워크를 만드는 근간이 된다.

 

단점

1. 상속을 하기 위해선 public이나 protected 생성자가 필요하니 정팩메만 제공하면 하위 클래스를 만들 수 없다.

 

2. 정팩메는 프로그래머가 찾기 어렵다.

   생성자처럼 기본으로 제공하는 api가 아니기 때문에 사용하기 위해서는 직접 클래스를 찾아봐야하는 수밖에 없다.

 

정적 팩토리 메서드의 장단점을 봤을 때, 사용해야하는 상황은?


나는 정팩메의 장점 중 하나라도 잘 사용할 수 있으면, 정팩메를 사용하는 것이 맞다고 생각한다. 왜냐하면, 코드를 작성하는 난이도나, 길이의 비용이 그닥 높지 않기 때문이다. 

 

이름을 가져야한다? -> 정팩메....!

호출될 때마다 인스턴스를 새로 생성하지 않아도 된다? -> 정팩메...!

...

 

이름을 가져야한다?, 호출될 때마다 인스턴스를 새로 생성하지 않아도 된다? -> 정팩메!

...

 

이름을 가져야한다?, 때마다 인스턴스를 새로 생성하지 않아도 된다?, 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환해야한다? -> 정!팩!메!!!!

 

그러나 장점이 하나도 필요하지 않으면, 그냥 생성자를 쓰는 것이 다른 개발자들이 조금 더 쉽게 찾을 수 있고, 코드가 간결하게 유지 될 것이라고 생각한다. 그러다가 코드가 고도화되고, 장점이 필요한 상황이 된다면 당당하게 정팩메로 바꾸면 될 것 같다!

 
 
 

검색 태그