정적 팩토리 메서드

2023. 10. 31. 18:18JAVA

2주차 미션을 수행하며 String으로 받은 자동차 이름들로 List<Car>를 만드는 매서드가 필요했습니다. 처음에는 CarsGenerator을 이용해 구현을 했습니다. 하지만 List<Car>을 Cars라는 일급 컬렉션로 만들면서 CarsGenerator라는 클래스에 대해 의문이 생기게 되었습니다. 따라서 해당 메서드를 Cars안에서 만들고자 했고 그 과정에서 정적 팩토리 메서드를 공부하게 되었다.

 

정적 팩토리 메서드에 대해 공부한 내용들을 정리하고자 합니다.

 

참고한 글은 다음과 같습니다.

 

https://tecoble.techcourse.co.kr/post/2020-05-26-static-factory-method/

 

정적 팩토리 메서드(Static Factory Method)는 왜 사용할까?

tecoble.techcourse.co.kr

 

 

정적 팩토리 메서드


정적 팩토리 메서드객체 생성의 역할을 하는 클래스 메서드.

 

이는 직접적으로 생성자를 통해 객체를 생성하는 것이 아닌 메서드를 통해 객체를 생성하는 것을 의미한다. enum의 valueOf도 정적 팩토리 메서드의 일종이다. 물론 미리 생성된 객체를 조회하는 것이기 때문에 팩토리의 역할을 한다고는 볼 수 없지만, 외부에서 원하는 객체를 반환해주고 있으므로 결과적으로는 정적 팩토리 메서드라고 간주할 수 있다.

 

그렇다면 왜 굳이 정적 팩토리 메서드를 따로 만들어서 객체를 생성하는 것인가?

 

1. 이름을 가질 수 있다.

객체는 생성 목적과 과정에 따라 생성자를 구별해서 사용할 필요가 있다. new 라는 키워드를 통해 객체를 생성하는 생성자는 내부 구조를 잘 알고 있어야 목적에 맞게 객체를 생성할 수 있다. 하지만 정적 팩토리 메서드를 사용하면 메서드 이름에 객체의 생성 목적을 담아 낼 수 있다.

 

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

enum은 자주 사용되는 요소의 개수가 정해져 있어, 해당 개수만큼 미리 생성해 놓고 조회(캐싱)하는 구조로 만들어져 있다. 정적 팩토리 메서드와 캐싱 구조를 함께 사용하면 매번 새로운 객체를 생성할 필요가 없어진다. 예를 들어 클래스 내에서 Cache목적을 위한 Collection을 가지고 있다고 해보자. 그럼 이때 정적 팩토리 메소드를 사용해 Collection 안에 있는 값을 반환할 수 있다. 이런 경우에 매번 새로운 객체를 생성하지 않아도 된다.

 

 

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

하위 자료형 객체를 반환은 상속에 의해 이루어 진다. 이는 생성자 역할을 하는 정적 팩토리 메서드가 반환값을 가지고 있기 때문에 가능한 특징이다. 예를 들면, Level이라는 클래스에서 정적 팩토리 메서드를 이용할 때 반환값인 Level을 상속하는 다른 하위 자료형 객체의 반환이 가능하다. 

 

 

4. 객체 생성을 캡슐화 할 수 있따.

캡슐화란 데이터의 은닉을 말한다. 풀어 설명하면, 생성자를 클래스의 메서드 안으로 숨기면서 내부 상태를 외부에 드러낼 필요없이 객체 생성 인터페이스를 단순화 시킬 수 있다는 것을 의미한다. 이는 DTO와 Entity간의 예시로 쉽게 살펴볼 수 있다. DTO를 생성할 때, DTO와 Entity의 내부 요소들에 맞추어 생성자를 만드는 것이 아닌 Entity 자체를 인자로 받는 정적 팩터리 메서드를 사용할 수 있다. 이는 앞서 말했던 내부 구현을 몰라도 쉽게 변환이 가능해 진다.

 

 


 

정적 팩토리 메서드 네이밍 컨벤션

 

정적 팩토리 메서드에도 네이밍 컨벤션이 존재한다.

 

from : 하나의 매개 변수를 받아서 객체를 생성

of : 여러개의 매개 변수를 받아서 객체를 생성

getInstance | instance : 인스턴스를 생성, 이전에 반환했던 것과 같을 수 있다.

newInstance | create : 새로운 인스턴스 생성

get[OtherType] : 다른 타입의 인스턴스 생성. 이전에 반환했던 것과 같을 수 있다.

new[OtherType] : 다른 인스턴스 생성