정적 팩토리 메서드(Static Factory Method)는 객체를 생성할 때, 생성자를 직접 호출하는 대신 클래스의 정적(static) 메서드를 사용하여 객체를 생성하고 반환하는 방식을 의미한다.
이 방식은 일반적인 생성자 호출보다 더 유연하고 직관적으로 객체를 생성할 수 있는 장점을 제공한다.
정적 팩토리 메서드의 특징
- 정적 메서드를 사용해 객체를 생성
클래스의 정적 메서드를 호출해 객체를 생성한다.
Cell cell = Cell.of("X");
- 생성자를 은닉할 수 있음
정적 팩토리 메서드는 생성자를 private으로 숨기고, 외부에서는 오직 정적 메서드를 통해 객체를 생성하도록 강제한다. - 유의미한 메서드 이름을 사용할 수 있음
생성자와 달리 메서드 이름을 자유롭게 설정할 수 있어, 객체 생성의 목적을 명확히 드러낼 수 있다. - 유연한 반환 타입을 제공
생성된 객체의 반환 타입으로 인터페이스나 상위 클래스 타입을 사용할 수 있다.
정적 팩토리 메서드의 장점
메서드 이름을 통해 가독성을 향상
- 정적 팩토리 메서드는 이름을 통해 객체 생성의 의도를 명확히 전달한다.
LocalDate date = LocalDate.of(2024, 11, 19); // 특정 날짜를 생성
LocalDate now = LocalDate.now(); // 현재 날짜를 생성
- 객체 생성 과정을 통제할 수 있음
- 생성자를 숨기고 객체 생성 로직을 캡슐화하여 객체 생성 방식을 완벽히 제어할 수 있다.
- 예를 들어, 싱글톤 객체나 캐싱된 객체를 반환할 수 있다.
- 불변 객체를 생성하기에 유리함
- 생성 이후 상태가 변경되지 않는 불변 객체를 쉽게 구현할 수 있다.
- 유연한 반환 타입을 제공
- 반환 타입으로 인터페이스나 상위 클래스 타입을 사용해 구현 변경이 외부 코드에 영향을 미치지 않도록 설계할 수 있다.
public static List<String> createList() {
return new ArrayList<>();
}
정적 팩토리 메서드의 단점
- 상속이 어렵다
- 생성자를 private으로 선언하면 상속이 불가능하다.
- 하지만 이는 상속보다는 구성을 선호하는 설계 방식에 부합한다.
- 정적 메서드 방식에 익숙함이 필요
- 정적 메서드로 객체를 생성하는 방식이 초보 개발자에게는 직관적이지 않을 수 있다.
정적 팩토리 메서드 구현 예제
1. 단순 객체 생성
아래는 기본적인 정적 팩토리 메서드 구현 예제다.
public class Cell {
private final String sign;
private Cell(String sign) {
this.sign = sign;
}
public static Cell of(String sign) {
return new Cell(sign);
}
}
사용 예:
Cell cell = Cell.of("X");
System.out.println(cell.getSign()); // X
2. 의미 있는 이름 부여
정적 팩토리 메서드를 활용하면 객체 생성 목적을 명확히 표현할 수 있다.
public class Color {
private final int r, g, b;
private Color(int r, int g, int b) {
this.r = r;
this.g = g;
this.b = b;
}
public static Color fromRGB(int r, int g, int b) {
return new Color(r, g, b);
}
public static Color fromHex(String hex) {
// 간단히 HEX 값을 RGB로 변환
int r = Integer.valueOf(hex.substring(1, 3), 16);
int g = Integer.valueOf(hex.substring(3, 5), 16);
int b = Integer.valueOf(hex.substring(5, 7), 16);
return new Color(r, g, b);
}
}
사용 예:
Color red = Color.fromRGB(255, 0, 0);
Color blue = Color.fromHex("#0000FF");
3. 싱글톤 패턴 구현
정적 팩토리 메서드는 싱글톤 객체를 생성하는 데 유용하다.
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return INSTANCE;
}
}
사용 예:
Singleton singleton = Singleton.getInstance();
4. 캐싱과 객체 재사용
입력 값에 따라 동일한 객체를 재사용하거나 캐싱할 수 있다.
import java.util.HashMap;
import java.util.Map;
public class Cell {
private final String sign;
private static final Map<String, Cell> CACHE = new HashMap<>();
private Cell(String sign) {
this.sign = sign;
}
public static Cell of(String sign) {
if (CACHE.containsKey(sign)) {
return CACHE.get(sign);
}
Cell cell = new Cell(sign);
CACHE.put(sign, cell);
return cell;
}
}
Java 표준 라이브러리에서의 활용 예
1. java.util.Collections
List<String> emptyList = Collections.emptyList();
2. java.time.LocalDate
LocalDate date = LocalDate.of(2024, 11, 19);
LocalDate now = LocalDate.now();
3. Optional
Optional<String> optional = Optional.of("value");
Optional<String> empty = Optional.empty();
정적 팩토리 메서드 vs 생성자
특징 | 정적 팩토리 메서드 | 생성 |
이름 지정 가능 | 가능 (메서드 이름으로 목적 명시 가능) | 불가능 (클래스 이름과 동일) |
객체 재사용 | 가능 (캐싱 전략 등 활용 가능) | 항상 새로운 객체를 생성 |
상속 지원 여부 | 제한적 (생성자 숨기면 불가능) | 가능 |
반환 타입의 유연성 | 가능 (상위 타입이나 인터페이스 반환 가능) | 불가능 |
정적 팩토리 메서드 네이밍 컨벤션
- from : 하나의 매개 변수를 받아서 객체를 생성
- of : 여러개의 매개 변수를 받아서 객체를 생성
- getInstance | instance : 인스턴스를 생성. 이전에 반환했던 것과 같을 수 있음.
- newInstance | create : 새로운 인스턴스를 생성
- get[OtherType] : 다른 타입의 인스턴스를 생성. 이전에 반환했던 것과 같을 수 있음.
- new[OtherType] : 다른 타입의 새로운 인스턴스를 생성.
결론
정적 팩토리 메서드는 객체 생성의 유연성을 제공하며, 가독성, 유지보수성, 성능 최적화 등 많은 장점을 가진다.
객체 생성 로직을 캡슐화하고, 명확한 생성 목적을 전달할 때 유용하게 사용할 수 있다.
불변 객체나 싱글톤 패턴 구현이 필요한 경우, 정적 팩토리 메서드를 적극 활용하는 것을 추천한다.
https://tecoble.techcourse.co.kr/post/2020-05-26-static-factory-method/
정적 팩토리 메서드(Static Factory Method)는 왜 사용할까?
…
tecoble.techcourse.co.kr
정적 팩토리 메서드(Static Factory Method)
정적 팩토리 메서드란 무엇인가?
velog.io
💠 정적 팩토리 메서드 패턴 (Static Factory Method)
Static Factory Method Pattern 정적 팩토리 메서드(Static Factory Method) 패턴은 개발자가 구성한 Static Method를 통해 간접적으로 생성자를 호출하는 객체를 생성하는 디자인 패턴이다. 우리는 지금까지 객체
inpa.tistory.com
'지식저장소' 카테고리의 다른 글
엔티티 매니저에 대하여 (0) | 2025.03.28 |
---|---|
Spring Data JPA에서 새로운 Entity인지 판단하는 방법은? (0) | 2025.03.26 |
카프카 알아보기 (0) | 2025.02.17 |
OAuth 2.0 이란 무엇일까.2 (0) | 2022.03.25 |
OAuth 2.0 이란 무엇일까.1 (0) | 2022.03.25 |