Dart 언어에서 factory
키워드는 생성자를 정의할 때 사용되며, 이를 통해 생성자가 항상 새 객체를 생성하는 것이 아니라, 조건에 따라 기존 객체를 반환하거나 다양한 로직을 통해 객체를 생성할 수 있습니다. 이는 특히 싱글턴 패턴 같은 디자인 패턴을 구현할 때 유용하거나, 객체 생성 비용이 높은 경우에 객체를 재사용할 필요가 있을 때 사용됩니다.
factory
생성자의 특징:factory
생성자를 사용하면 인스턴스를 새로 생성하지 않고, 이미 생성된 인스턴스를 재사용할 수 있습니다. 이는 메모리 사용을 최적화하고, 성능을 개선할 수 있습니다.class Singleton {
static Singleton? _instance;
Singleton._internal(); // private 생성자
factory Singleton() {
if (_instance == null) {
_instance = Singleton._internal(); // 인스턴스 생성
}
return _instance!; // 기존 인스턴스 반환
}
}
위 예제에서 Singleton
클래스는 factory
생성자를 사용하여 싱글턴 패턴을 구현합니다. Singleton()
생성자는 처음 호출될 때 객체를 생성하고, 이후 호출되면 처음 생성된 객체를 재사용합니다.
factory
생성자는 반드시 클래스의 인스턴스를 반환해야 합니다. 따라서 생성자 내부에서 다른 타입을 반환하려고 하면 오류가 발생합니다.factory
키워드는 Dart에서 객체 생성을 더 유연하게 관리할 수 있게 해주며, 객체의 생성과 관리를 보다 효율적으로 할 수 있도록 도와줍니다.
Dart에서 factory
생성자와 명명된 생성자(named constructor)는 객체를 생성하는 방법을 다양화하지만, 그 사용 목적과 방식에 차이가 있습니다. 이 두 가지 방식은 객체 지향 프로그래밍에서 객체 생성을 제어하는 데 사용됩니다.
명명된 생성자는 클래스 내에서 여러 개의 생성자를 정의할 수 있게 해주는 기능입니다. 이를 통해 다양한 방법으로 객체를 초기화할 수 있습니다. 명명된 생성자는 항상 새로운 인스턴스를 생성하며, 다양한 초기화 로직을 가질 수 있습니다.
특징:
예제:
class Car {
String model;
int year;
Car(this.model, this.year);
// 명명된 생성자
Car.fromData(Map<String, dynamic> data)
: model = data['model'],
year = data['year'];
}
위 예제에서 Car.fromData
는 명명된 생성자로, 맵 구조에서 데이터를 읽어 객체를 초기화합니다.
factory
생성자는 반드시 새 객체를 생성하지 않고, 기존 객체를 반환하거나 조건에 따라 다양한 타입의 객체를 반환할 수 있습니다. 이는 객체의 재사용, 싱글턴 패턴 구현, 복잡한 생성 패턴에 유용합니다.
특징:
예제:
class Logger {
static Logger? _cache;
Logger._internal();
// 팩토리 생성자
factory Logger() {
if (_cache == null) {
_cache = Logger._internal();
}
return _cache!;
}
}
위 예제에서 Logger
클래스는 _cache
라는 정적 필드를 사용하여 인스턴스를 캐시하고, factory
생성자는 이 캐시된 인스턴스를 반환합니다.
두 생성자는 서로 다른 사용 케이스와 요구 사항에 따라 선택하여 사용할 수 있습니다.