728x90
반응형

생성자 대신 정적 팩토리 메서드 사용법과 사용하는 이유

생성자는 클래스에서 객체를 생성할 때 호출되는 메서드

정적 팩토리 메서드는 객체를 생성하기 위해 클래스에서 제공하는 정적 메서드

 


생성자와 정적 팩토리 메서드 사용법

생성자

public class Person {
    private int value;
    
    public Person(int value) {
        this.value = value;
    }
}

 

정적 팩토리 메서드

public class Person {
    private int value;

    private Person(int value) {
        this.value = value;
    }
    
    public static Person createPerson(int value) {
        return new Person(value);
    }
}

 


정적 팩토리 메서드 사용 이유?

이름을 가질 수 있음

생성자는 클래스의 이름과 동일한 이름을 사용함

정정 팩토리 메서드는 개발자가 원하는 이름을 사용할 수 있음

(이는 장점이자 단점이 될 수 있음)

 

호출할 때마다 새로운 객체를 생성하지 않아도 됨

정정 팩토리 메서드를 사용하면 객체를 매번 새로 생성하지 않아도 캐싱된 객체를 반환할 수 있음

이를 통해 메모리 사용량을 줄이고, 객체 생성 비용도 줄일 수 있음

 

아래와 같이 생성자를 사용하면 호출 시마다 새로운 객체 생성됨

Person person1 = new Person("nana", 30);
Person person2 = new Person("jerry", 30);

person1과 person2는 서로 다른 객체임

 

정적 팩토리 메서드를 통해 캐싱된 객체 사용

public class Person {
  private int value;

  private static final Map<Integer, Person> cache = new HashMap<>();

  private Person(int value) {
    this.value = value;
  }

  public static Person from(int value) {
    if (cache.containsKey(value)) {
      System.out.println("캐싱되었습니다.");
      return cache.get(value);
    } else {
      Person person = new Person(value);
      System.out.println("새로 생성되었습니다.");
      cache.put(value, person);
      return person;
    }
  }
}

 

하위 클래스의 객체를 반환할 수 있음

생성자는 반드시 현재 클래스의 객체를 반환해야 함

정적 팩토리 메서드는 하위 클래스의 객체를 반환할 수 있음

interface OS {
    public static OS getLinux() {
        return new Ubuntu();
    }

    public static OS getWindows() {
        return new WindowsEleven();
    }

    public static Os getMac() {
        return new MacOSMonterey();
    }
}

 

API 변경이 용이함

생성자를 사용하면 클래스의 인터페이스를 변경할 때 API를 변경해야함

하지만 정적 팩토리 메서드를 사용하면 API를 변경하지 않고도 새로운 기능을 추가할 수 있음

반응형
복사했습니다!