정적 팩토리 메소드(Static factory method)
Java의 정적 팩토리 메소드는 클래스의 인스턴스를 생성하는 메서드로, 해당 클래스의 생성자 대신 사용할 수 있습니다.
메소드 이름을 구체적으로 작성하여 사용하는 입장에서 용도를 명확히 파악할 수 있다는 장점이 있습니다.
Static Factory Method 특징
명명 규칙
Static Factory Method는 일반적으로 of
, from
, valueOf,
getInstance
, newInstance
등으로 작성할 수 있습니다. 또는 구체적인 이름을 직접 작성하여 메소드 사용의 이해를 도울 수 있습니다.
다중 생성자 대체
생성자가 여러 개 있을 때, 각 생성자에 의미있는 이름을 부여하여 사용 가능한 생성자를 효과적으로 표현할 수 있습니다.
캐싱 및 재활용
이미 생성된 인스턴스를 캐싱하거나, 특정 조건에 따라 재활용할 수 있습니다.
상위클래스 반환
반환 타입은 인터페이스나 추상 클래스일 수 있으며, 실제 생성될 클래스는 하위 클래스에서 결정됩니다.
예시를 봅시다.
public class Car implements Vehicle {
private String brand;
private String model;
private int year;
// Private 생성자
private Car(String brand, String model, int year) {
this.brand = brand;
this.model = model;
this.year = year;
}
// 생성자 대신 사용 (명명 규칙)
public static Car createCar(String brand, String model, int year) {
// 추가적인 로직 수행 가능
// 캐싱 또는 재활용 등의 처리 가능
// 실제 생성은 private 생성자에서 이루어짐
return new Car(brand, model, year);
}
// 캐싱 및 재활용을 고려한 예시
private static final Map<String, Car> carCache = new HashMap<>();
public static Car getCachedCar(String brand, String model, int year) {
String key = brand + "-" + model + "-" + year;
// 캐시에 이미 있는 경우 재활용
if (carCache.containsKey(key)) {
return carCache.get(key);
} else {
// 없는 경우 생성하고 캐시에 저장
Car newCar = new Car(brand, model, year);
carCache.put(key, newCar);
return newCar;
}
}
// 인터페이스를 반환하는 예시
public static Vehicle createVehicle(String brand, String model, int year) {
return new Car(brand, model, year);
}
}
// 인터페이스 예시
interface Vehicle {
// 인터페이스 메서드 정의
}
위 예시에서 Car
클래스는 여러 정적 팩토리 메소드를 만들었습니다.
첫 번째 메서드는 생성자 대신 사용하여 자신이 하는 일을 구체적으로 메소드명에 명시하였습니다.
두 번째 메서드는 캐싱 및 재활용을 사용했습니다. 생성자에서는 항상 새로운 객체만 반환하므로, 위와 같이 할 수 없는 반면 정적팩토리 메소드에서는 위처럼 내가 원하는 로직을 집어넣을 수 있습니다.
세 번째 메서드는 인터페이스를 반환하여 사용하는 입장에서 다형성을 활용할 수 있도록 도울 수 있습니다. 이 외에도 필요하다면 상위 인터페이스가 아닌 다른 어떤 것이든 반환할 수 있습니다.
Last updated