생성자, 빌더 그리고 정적 팩토리

고승원·2023년 7월 5일
0

Java

목록 보기
1/3

자바에서 객체를 생성하는데 여러가지 방법이 있다. 기본인 생성자부터 빌더 정적 팩토리.. 왜 어떨때 사용하는걸까?
토론해보면 재밌을 것 같다.

어떤 방법이 가장 좋을까?

"정답은 없다." 어떤 방법을 사용하던지 장단점이 있기 때문에 본인의 상황에 맞게 적절히 선택하여 사용하면 된다.
장단점을 알아보자.

생성자

생성자는 인스턴스가 생성될 때 한 번 호출되는 '인스턴스 초기화 메서드'이다. 따라서 인스턴스 변수의 초기화 작업에 사용되고, 인스턴스 생성 시에 실행되어야 할 작업을 위해서 사용된다.

장점

  • 간단하고 직관적인 방법으로 객체를 생성할 수 있다.
  • 필수 변수들를 명시적으로 지정할 수 있다.

단점

  • 매개변수 자료형이 같은 경우 순서를 혼동할 수 있다.
  • 매개변수가 많아지면 가독성이 떨어진다.
  • 다양한 객체 생성 방식에 대응할 수 없다.

"다양한 객체 생성 방식에 대응할 수 없다." 라는 단점 때문에 점층적 생성자 패턴을 사용하기도 한다.

빌더

빌더 패턴은 각 메서드 호출은 빌더 객체 자신을 반환하므로, 이후에 다른 메서드를 계속해서 호출할 수 있다.

장점

  • 객체 생성 과정을 단계별로 구성하고 조립할 수 있어 유연성이 높다.
  • 선택적인 매개변수를 사용할 때 가독성이 뛰어나고 명시적이다.
  • 복잡한 객체 생성을 처리하기에 적합하다.

단점

  • 추가적인 코드 작성이 필요하므로 코드의 양이 증가한다.
  • 빌더 클래스를 따로 정의해야 하기 때문에 클래스의 개수가 늘어날 수 있다.

정적 팩토리

생성자 대신 정적 메서드를 사용하여 객체를 생성하고 반환하는 패턴이다.

장점

  • 메서드의 이름을 통해 객체의 역할과 의도를 명확하게 표현할 수 있다.
  • 객체 생성 로직을 외부로부터 숨길 수 있다.
  • 객체를 캐싱하거나 재활용할 수 있다.

단점

  • 모든 객체 생성 시나리오를 다루기 어렵다.
  • 생성자와 달리 직접적인 객체 초기화를 할 수 없으므로 일부 상황에서 제한적일 수 있다.

마무리

유연성, 가독성등 의 많은 사람이 빌더패턴을 권장한다. 나의 생각은 조금 다르다.

정말 빌더가 좋은가?

빌더의 장점은 유연성과 가독성인데 지금까지 개발을 하면서 유연한 생성이 필요한 객체가 그렇게 많지 않았다.
또한 필드에 null이 들어가는 객체는 엔티티의 id를 제외하고 있지 않았기에 빌더 패턴의 장점인 유연성은 오히려 실수를 낳을 여지라고 생각했다.

또한 IDE 에서 매개변수로 어떤게 들어가는지 모두 알려주기 때문에 생성자를 사용하며 불편함은 없었다.

정적 팩토리의 캐싱

객체 캐싱은 동일한 매개변수로 객체를 반복해서 생성하는 경우, 이미 생성된 객체를 캐시에 저장하고 재사용함으로써 성능을 향상시킬 수 있다.

캐싱은 주로 불변 객체에서 사용되며, 객체를 생성하는 데 비용이 많이 드는 경우에 특히 유용하다.

실제로 Integer의 valueOf() 메서드에서 -128 ~ 127 까지의 값을 캐싱해 사용하고 있는데, 이런 특수한 상황을 제외하면 사용할 수 없다.

결론

본인은 위와 같은 이유로 빌더와 정적 팩토리의 장점을 크게 못느껴 생성자로 객체를 생성하는 방법이 대체로 좋다고 생각한다.
IDE에서 매개변수 힌트를 주고, 빌더 패턴을 사용하며 코드가 많아지고, 실수의 여지도 생기니 말이다.

profile
봄은 영어로 스프링

0개의 댓글