생성자 대신 정적 팩토리 메서드를 고려하라!
정적 팩토리 메서드란?
객체의 생성을 담당하는 클래스 메서드
정적 팩토리 메서드의 특징
1. 생성 목적에 대한 이름 표현 가능
public final class Money {
private final long amount;
private Money(long amount) {
this.amount = amount;
}
public long amount() { return amount; }
public static Money of(long amount) { return new Money(amount); } // 정적 팩토리 메서드
public static Money won(long amount) { return new Money(amount); } // 정적 팩토리 메서드
// equals / hashCode 생략
}
Money price1 = Money.won(18000);
Money price2 = Money.of(5000);
2. 인스턴스에 대한 통제 및 관리 가능
- 예시 1) Singleton 디자인 패턴
class Singleton {
private static Singleton instance;
private Singleton() {}
// 정적 팩토리 메서드
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 예시 2) 캐싱(caching) : 인스턴스에 대해서 캐싱하여 재사용함
public final class Money {
private final long amount;
private static final Money ZERO = new Money(0); // 캐싱
private Money(long amount) {
this.amount = amount;
}
public long amount() { return amount; }
public static Money of(long amount) { return new Money(amount); }
public static Money won(long amount) { return new Money(amount); }
public static Money zero() { return ZERO; } // 캐싱
// equals / hashCode 생략
}
Money poketMoney = Money.zero(); // 매번 새로 만들지 않고 캐싱
3. 하위 자료형 객체를 반환 가능
public class Rider implements DeliveryAgent{
@Override
public void deliver(Order order) {
// 라이더 배달
}
}
public class Robot implements DeliveryAgent{
@Override
public void deliver(Order order) {
// 로봇 배달
}
}
public class Drone implements DeliveryAgent{
@Override
public void deliver(Order order) {
// 드론 배달
}
}
public interface DeliveryAgent {
void deliver(Order order);
static DeliveryAgent forDistance(int km) {
if (km < 3) return new Rider(); // 3km 이하는 라이더
if (km < 15) return new Robot(); // 15km 이하는 로봇
return new Drone(); // 그 이상은 드론
}
}
DeliveryAgent agent = DeliveryAgent.forDistance(20);
agent.deliver(order); // Drone.deliver() 실행
정적 팩토리 메서드 네이밍 규칙
- of : 여러 인자를 받아 만든다. ( List.of(1,2,3) )
- valueOf : 다른 타입에서 변환 ( Integer.valueOf("42") )
- from : 하나의 매개 변수 ( Date.from(instant) )
- parse : 문자열 파싱 ( LocalDate.parse("2025-01-25") )
- getInstance, instance : 인스턴스 생성 (이전에 반환했던 것과 같을 수 있음) (싱글톤 등)
- newInstance, create : 항상 새로운 인스턴스 생성
정적 팩토리 메서드 주의점
private 생성자일 경우 상속 불가능
- 상속(Inheritance)보다는 합성(Composition)을 유도하거나 불변(Immutable) 객체로 만들고 싶을 때, 생성자를 private로 지정
'Java > 객체 지향' 카테고리의 다른 글
| Enum의 객체 지향적 활용 방법 (0) | 2026.07.21 |
|---|---|
| SOLID 원칙 (0) | 2026.07.14 |
| 상속(Inheritance) VS 합성(Composition) (0) | 2026.06.15 |
| 방어적 복사 (0) | 2026.06.15 |
| 값 객체(Value Object)와 불변성 (0) | 2026.06.12 |