[Java] 정적 팩토리 메소드 장단점

민지·2023년 11월 17일
0

Java

목록 보기
20/20

REST API 를 구현하다보면 DTO 를 통해서 값을 전달받은 후, Entity 에 해당하는 value 로 변환하여 필요한 서비스와 로직을 처리해준 후, 다시 DTO 를 통해서 값을 반환해주는 순서로 많이 구현한다.


정적 팩토리 메소드

생성자 기법과는 별도로 생성만을 담당하는 클래스 메소드를 의미한다.
직접적인 생성자가 아닌 메소드를 통해 객체를 생성한다.
외부에서 요청이 들어오면 이에 맞게 객체를 생성하거나, 단순반환해주는 것이 주된 역할이다.

장점

1. 이름을 가질 수 있다.

new 를 통하여 새로운 객체를 생성하는 기존 생성자 방식과 다르게
static method 로 객체를 생성하기 때문에 이름을 가지게 할 수 있다.
new 를 통해서 만든 객체는 어떠한 목적으로 만들어진 것인지 new 만 봐서는 쉽게 판단할 수 없었다.
from 과 of 같은 정적 팩토리 메서드 네이밍 규칙을 따를수도 있고, from 과 of 대신 적절한 이름을 갖는 메소드 명을 통해서 보다 객체 생성의 의도와 사용의 목적을 명확히 구분할 수 있다.

2. 객체 생성을 할 때 내부 구조를 캡슐화할 수 있다.

DTO 변환 시 정적 팩토리 메소드를 사용한다면
from 이나 of(외부객체를 해당 객체로 변환)를 사용하기만 하면 되지만,
인스턴스 메소드 사용시 생성자 자체와 그의 내부를 전부 노출시키게 된다.

// 인스턴스 메소드 사용시
CarDto carDto = new CarDto(car.getCarName,car.getCarDistance)

// 정적 팩토리 메소드 사용시
 CarDto carDto = CarDto.from(car)

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

생성자는 매개변수의 갯수가 정해지면 또 다른 생성자를 만들기 좀 애매하다.
오버로딩을 이용해서 추가로 생성할 수는 있겠지만
이러면 다른 개발자가 생성자를 이해하기 어려워지기 때문이다.
도메인 바깥에서 보면 도메인 이름만 있고 어떤 파라미터가 필요한지는 도메인까지 가서 들여다봐야 한다. 왜 생성자가 다중으로 있는지 작성자의 의도를 파악하기가 어렵다.

만약에 특정 객체에 대해 사용하는 수가 정해져 있다면, static의 팩토리 메서드를 통해서 새로운 객체를 생성할 필요가 없고 생성해준 객체만을 사용할 수 있다. 생성자를 private로 설정하여 다른 외부의 접근을 막아두고, 이후 팩토리 메서드를 통해서 정해진 객체만을 사용하도록 구현하는게 가능해진다. 또한 이를 통해서 불필요한 객체 생성을 막을 수 있다.

4. 하위 타입 반환이 가능하다.

해당 객체의 자식 클래스 객체를 생성 및 반환할 수 있다.
A 라는 클래스를 B, C 가 상속 받는 경우일 때 A 의 정적 팩토리 메서드를 통해서 B C 의 객체를 생성하여 반환할 수 있다.
하위 타입으로 리턴을 해줄 수 있다는 장점을 가진다.



단점

1. 상속 불가능

정적 팩토리 메서드를 사용할 시 생성자는 접근 제어자가 private 으로 한정되어 있기 때문에 해당 클래스는 부모 클래스가 될 수 없다.

2. 상대적으로 생성자를 찾기가 쉽지 않음

정적 팩토리 메서드를 쓰면 생성자도 일반적인 메소드와 같은 형식이여서
상대적으로 찾기가 좀 어렵다.



정적 팩토리 메서드 네이밍 규칙

from : 하나의 매개 변수를 받아서 객체를 생성
of : 여러개의 매개 변수를 받아서 객체를 생성
valueOf : from 과 of 보다 자세하게 사용
getInstance | instance : 인스턴스를 생성. 이전에 반환했던 것과 같을 수 있음
newInstance | create : 새로운 인스턴스를 생성
get[OtherType] : 다른 타입의 인스턴스를 생성. 이전에 반환했던 것과 같을 수 있음
new[OtherType] : 다른 타입의 새로운 인스턴스를 생성.




https://velog.io/@ljinsk3/%EC%A0%95%EC%A0%81-%ED%8C%A9%ED%86%A0%EB%A6%AC-%EB%A9%94%EC%84%9C%EB%93%9C%EB%8A%94-%EC%99%9C-%EC%82%AC%EC%9A%A9%ED%95%A0%EA%B9%8C

profile
개발일지

0개의 댓글