티스토리 뷰

JAVA

생성자 대신 정적 팩토리 메서드

세댕댕이 2022. 7. 15. 01:28

1. 생성자 대신 정적 팩토리 메서드를 사용할 수 없는지 생각해보자

 

일반적으로 클래스를 통해 객체를 만드는 것은 public으로 선언된 생성자(Constructor)로 이뤄진다.

하지만 이외에도 방법이 하나 더 있는데, 바로 public으로 선언된 정적 팩토리 메소드(static factory method)를 사용하는 것.

 

<장점>

1. 이름이 있다.

- 생성자 메서드의 이름은 클래스 이름으로 고정되기 때문에 이름 그 자체로 의미를 주기 어렵고, 생성자에 전달되는 파라미터만으로는 어떤 객체가 생성되는지를 설명할 수 없다.

- 정적 팩토리 메서드는 이름만 잘 지으면 사용하기도 쉽고 코드의 가독성도 좋아진다.

- 같은 시그니처(signature) 갖는 생성자를 여러개 정의할 필요가 있을 때는 생성자를 사용하기보다는 정적 팩토리 메서드를 이용해 메서드 이름만으로 차이가 드러나도록 해주자..(???)

 

위와 같은 경우?

 

* 메서드 시그니처: 메서드의 선언부에 명시되는 파라미터의 리스트.

- 두 메서드의 파라미터의 개수와 타입, 순서가 같은 경우에 두 메서드의 시그니처가 같다고 말한다.

 

* 메서드 오버로딩(Overloading): 같은 이름의 메서드를 중복해서 정의하는 것.

- 하나의 이름으로 다양한 시그니처를 갖는 메서드들을 만들 수 있다.

 

 

# 정적 팩토리 메소드의 명명 규칙 =======

valueOf: 파라미터로 주어진 값과 같은 값을 갖는 객체를 반환한다 (형변환 역할)

of: valueOf의 축약 (주로 여러 개의 매개변수를 받아서 객체 생성)

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

 

getInstance: 파라미터에 기술된 객체를 반환하고, 대개 싱글톤 객체를 받아올 때 사용.

* 항상 동일한 객체 반환을 보장하지는 않음!! 

* 싱글톤 패턴을 사용할 경우 파라미터 필요 없이 항상 같은 객체를 반환한다

 

newInstance: 호출할 때마다 다른 객체를 반환한다

=================================

 

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

이미 만들어진 객체를 활용할 수도 있고, 만든 객체를 캐시해놓고 불필요한 재생성 및 낭비를 방지할 수도 있다.

- 객체를 반복해서 반환할 수 있으므로 어떤 시점에 어떤 객체가 얼마나 존재할 지를 통제할 수 있다.

=> "개체 통제 클래스"

 

싱글톤 패턴을 따르도록 할 수 있고, 객체 생성이 불가능한 클래스를 만들 수 있고, 변경이 불가능한 클래스의 경우 두 개의 같은 객체가 존재하지 못하도록 할 수 있다.

--> '==' 인 경우에만 a.equals(b)가 성립하게 된다. -> '==' 연산자를 사용해 비교하므로 성능 향상

(Enum이 '==' 비교가 가능한 이유이다.)

 

 

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

- public으로 선언되지 않은 클래스의 객체를 반환해줄 수 있다.

- public 정적 팩토리 메서드가 반환하는 객체의 클래스가 public일 필요가 없다.

-> 구현 세부사항을 감출 수 있다. 캡슐화!

-> 인터페이스의 다형성을 적극 활용할 수 있다.

 

 

(+) DTO --> Entity 변환 시 꽤 유용하게 사용된다

- DTO 내에 public static toEntity() 메소드를 이용해 Entity를 반환해주도록 하는 메서드를 만들어두면 아주 편리하게 사용할 수 있음. 

 

(+) 단일 책임 원칙(SRP)에 따라 생성자는 오로지 객체를 생성하는 역할만 수행하도록 해줄 수 있다.

- 생성자는 객체의 생성이라는 단일 책임에만 집중하고, 정적 팩토리 메소드가 부가기능 추가 or 초기화 역할을 분담함으로써 단일책임 원칙을 지키도록 할 수 있다.

-> 단순히 객체 생성을 대신하는 것 뿐만 아니라, 객체지향적으로 프로그래밍 할 수 있도록 도움을 준다

 

 

<단점>

1. 생성자가 없으므로 하위 클래스를 만들 수가 없다. (상속 불가) -- 재사용성이 떨어짐

2. 메서드가 다른 정적 메서드와 확연히 구분되지가 않는다. 네이밍 컨벤션에 따라 작성되어야 함.

'JAVA' 카테고리의 다른 글

싱글톤은 Enum 타입으로 만들어라  (0) 2022.07.15
생성자 인자가 많을때는 빌더 패턴  (0) 2022.07.15
JAVA의 예외 처리란?  (1) 2021.11.26
인터페이스란?  (0) 2021.11.25
추상 클래스란?  (0) 2021.11.25
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함