반응형

Flutter에서 싱글톤 패턴을 사용하는 방법은 보통 특정 클래스의 인스턴스를 하나만 유지하기 위해 사용됩니다. 싱글톤은 앱 전체에서 동일한 인스턴스를 유지할 때 유용하며, 특히 설정값이나 네트워크 클라이언트 등에서 많이 사용됩니다. 아래는 Dart에서 싱글톤 패턴을 구현하는 몇 가지 방법을 소개하겠습니다.

방법 1: 기본적인 싱글톤 패턴

가장 단순한 방식으로 싱글톤을 구현할 수 있습니다. 이 방식에서는 factory 생성자를 사용하여 클래스의 인스턴스를 하나만 생성하도록 합니다.

class Singleton {
  // 내부에서 사용할 정적 인스턴스
  static final Singleton _instance = Singleton._internal();

  // 외부에서 접근할 수 있는 factory 생성자
  factory Singleton() {
    return _instance;
  }

  // 프라이빗 생성자
  Singleton._internal();

  // 싱글톤 클래스의 메서드 및 변수
  String data = "Hello, Singleton!";

  void printData() {
    print(data);
  }
}

이제 이 클래스를 사용할 때, 항상 같은 인스턴스를 사용하게 됩니다:

void main() {
  var singleton1 = Singleton();
  var singleton2 = Singleton();

  singleton1.data = "New Data";
  singleton1.printData(); // New Data
  singleton2.printData(); // New Data (같은 인스턴스를 사용하기 때문)

  // 같은 객체임을 확인
  print(identical(singleton1, singleton2)); // true
}

방법 2: static 키워드를 사용한 싱글톤 (Lazy Initialization)

때로는 클래스 인스턴스가 실제로 필요할 때까지 초기화되지 않도록 lazy 초기화를 사용할 수도 있습니다. 이를 위해 static 변수를 null로 두고, 필요한 경우에만 초기화합니다.

class LazySingleton {
  // 내부에서 사용할 정적 변수 (초기값 null)
  static LazySingleton? _instance;

  // 외부에서 접근할 수 있는 factory 생성자
  factory LazySingleton() {
    _instance ??= LazySingleton._internal();
    return _instance!;
  }

  // 프라이빗 생성자
  LazySingleton._internal();

  String data = "Lazy Singleton Data";

  void printData() {
    print(data);
  }
}

이제 이 클래스를 사용할 때, 인스턴스가 처음 요청될 때 생성됩니다:

void main() {
  var lazySingleton1 = LazySingleton();
  var lazySingleton2 = LazySingleton();

  lazySingleton1.data = "Updated Lazy Data";
  lazySingleton1.printData(); // Updated Lazy Data
  lazySingleton2.printData(); // Updated Lazy Data

  print(identical(lazySingleton1, lazySingleton2)); // true
}

방법 3: get 메서드를 사용한 싱글톤

다음은 get 메서드를 사용하여 싱글톤 인스턴스를 반환하는 방식입니다. 이는 일반적으로 getter를 통해 인스턴스를 얻도록 합니다.

class GetterSingleton {
  static final GetterSingleton _instance = GetterSingleton._internal();

  GetterSingleton._internal();

  static GetterSingleton get instance => _instance;

  String data = "Getter Singleton";

  void printData() {
    print(data);
  }
}

사용 방법은 아래와 같습니다.

void main() {
  var getterSingleton1 = GetterSingleton.instance;
  var getterSingleton2 = GetterSingleton.instance;

  getterSingleton1.data = "Updated Getter Singleton Data";
  getterSingleton1.printData(); // Updated Getter Singleton Data
  getterSingleton2.printData(); // Updated Getter Singleton Data

  print(identical(getterSingleton1, getterSingleton2)); // true
}

정리

이렇게 하면 Flutter/Dart에서 싱글톤 패턴을 구현하는 다양한 방법을 사용할 수 있으며, 주로 상황에 맞는 방식으로 구현하여 코드의 일관성과 효율성을 높일 수 있습니다.

반응형

+ Recent posts