본문 바로가기
Java/객체 지향

정적 팩토리 메서드

by 정구정구 2026. 6. 15.

생성자 대신 정적 팩토리 메서드를 고려하라!

 

정적 팩토리 메서드란?

객체의 생성을 담당하는 클래스 메서드

 

 

정적 팩토리 메서드의 특징

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