자바의 생성자를 대체해, 개발자가 구성한 객체 생성의 역할을 하는 클래스 메서드.
우리가 잘 알고있는 of 를 통한 객체 생성 등이 대표적인 예시이다.
즉, 외부나 내부에서 직접적으로 생성자를 통해 객체를 생성하는 것이 아닌 메서드를 통해서 객체를 생성하는 것을 정적 팩토리 메서드라고 한다.
우리는 정적 팩토리 메서드를 통해 원하는 객체를 반환 받을 수 있다.
enum의 Enum.valueOf도 원하는 객체를 반환한다는 점에서 정적 팩토리 메서드라고 봐도 무방함!
흠터레스팅..
"객체를 생성하는 역할은 자바에서 이미 제공되는 "생성자"가 있는데?"
둘은 같은 역할을 하지만 정적 팩토리를 사용시에 이점이 굉장하다!
of, from이 가장 흔하게 쓰는 네이밍이지만 정적 팩토리 메소드는 new Class() 대신 다양한, 목적에 맞는 이름을 가질 수있다.
-> 메서드 이름만 보고도 객체를 만드는 목적, 유형을 파악 가능하다!
정적 팩터리 메서드와 캐싱구조를 함께 사용하면 매번 새로운 객체를 생성할 필요가 없어진다.
또, 정적 팩토리 메서드로만 객체 생성이 가능하도록 유도하여 안전한 객체 생성이라는 장점을 확보한다.
메서드를 통해 한단계 거쳐 간접적으로 객체를 생성하기 때문에, 객체 생성 및 통제 관리를 할 수 있게 된다. 즉, 필요에 따라 항상 새로운 객체를 생성해서 반환할 수도 있고, 아니면 객체 하나만 만들어두고 이를 공유하여 재사용하게 하여 불필요한 객체를 생성하는 것을 방지 할 수 있는 것이다.
(상속을 사용하는 경우) 생성자의 역할을 하는 정적 팩토리 메서드가 반환값을 가지고 있어 하위 자료형 객체를 반환할 수 있다.
상위 모듈에서의 생성자는, 조건에 따라 여러가지 하위 모듈을 생성하도록 분기될수 있다!
즉, 사용자(controller)는 도메인을 구체적으로 알 필요가 없게되고, 도메인 안으로 구체적인 처리를 숨길 수 있다.
- 인자에 따라 다른 객체를 반환하도록 분기하는 것 역시 가능하다!
캡슐화(Encapsulization)란?
데이터의 은닉을 말한다.
정적 팩토리 메서드는 생성자를 클래스의 메서드 안으로 숨기면서 내부 상태를 외부에 드러낼 필요없이 객체 생성 인터페이스 단순화 시킬 수 있다.
예를 들어 DTO<->Entity 간의 자유로운 형 변환에 정적 팩토리 메서드를 사용하면 내부 구현을 몰라도 변환이 가능하다!
⭕ 최대한 외부에서 생성자의 내부 구현을 숨기는 방향인 것!
from
: 하나의 매개 변수를 받아서 객체를 생성
of
: 여러개의 매개 변수를 받아서 객체를 생성
getInstance | instance
: 인스턴스를 생성. 이전에 반환했던 것과 같을 수 있음.
newInstance | create
: 새로운 인스턴스를 생성
get[OtherType]
: 다른 타입의 인스턴스를 생성. 이전에 반환했던 것과 같을 수 있음.
new[OtherType]
: 다른 타입의 새로운 인스턴스를 생성.
정적 팩토리 메서드는 생성자의 역할을 대신한다.
또한, 가독성 좋은 코드와 객체 지향적 프로그래밍을 돕는다
(단, 팩토리 메서드만 존재하는 클래스를 생성하는 경우에는 상속이 불가능)
✅ 객체간 형 변환이 필요하거나, 여러 번의 객체 생성이 필요한 경우라면 생성자보다는 정적 팩토리 메서드를 사용해보자.
참고
정적 팩토리 메서드(Static Factory Method)는 왜 사용할까?
정적 팩토리 메서드 패턴 (Static Factory Method)