factory vs named constrructor

샤워실의 바보·2024년 4월 12일
0
post-thumbnail

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)는 객체를 생성하는 방법을 다양화하지만, 그 사용 목적과 방식에 차이가 있습니다. 이 두 가지 방식은 객체 지향 프로그래밍에서 객체 생성을 제어하는 데 사용됩니다.

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 Constructor (팩토리 생성자)

factory 생성자는 반드시 새 객체를 생성하지 않고, 기존 객체를 반환하거나 조건에 따라 다양한 타입의 객체를 반환할 수 있습니다. 이는 객체의 재사용, 싱글턴 패턴 구현, 복잡한 생성 패턴에 유용합니다.

특징:

  • 새 객체를 생성하지 않고 기존 객체를 반환할 수 있습니다.
  • 다른 생성자를 호출하거나 다른 클래스의 인스턴스를 반환할 수도 있습니다.
  • 싱글턴 또는 유사한 디자인 패턴 구현에 적합합니다.

예제:

class Logger {
  static Logger? _cache;

  Logger._internal();

  // 팩토리 생성자
  factory Logger() {
    if (_cache == null) {
      _cache = Logger._internal();
    }
    return _cache!;
  }
}

위 예제에서 Logger 클래스는 _cache라는 정적 필드를 사용하여 인스턴스를 캐시하고, factory 생성자는 이 캐시된 인스턴스를 반환합니다.

요약

  • 명명된 생성자: 다양한 초기화 옵션을 제공하며 항상 새 인스턴스를 생성합니다.
  • 팩토리 생성자: 객체의 재사용을 가능하게 하며, 필요에 따라 기존 인스턴스를 반환하거나 조건에 따라 다양한 객체를 생성할 수 있습니다.

두 생성자는 서로 다른 사용 케이스와 요구 사항에 따라 선택하여 사용할 수 있습니다.

profile
공부하는 개발자

0개의 댓글