본문 바로가기
Dart/Dart Programming language

[중급] Dart 클래스 심화/ 팩토리 생성자와 Singleton 패턴 활용법

by Maccrey Coding 2024. 9. 6.
반응형

 

Dart에서는 객체 생성과 관리에 대한 다양한 패턴을 제공합니다.

이 글에서는 팩토리 생성자와 Singleton 패턴을 통해 객체 생성과 관리를 어떻게 효율적으로 할 수 있는지 설명하고, 이를 Dart 코드에서 어떻게 구현할 수 있는지 살펴보겠습니다.

1. 팩토리 생성자 (Factory Constructor)

팩토리 생성자는 객체의 인스턴스를 직접 생성하지 않고, 특정 조건에 따라 객체를 반환하는 특수한 형태의 생성자입니다.

팩토리 생성자는 객체 생성의 논리를 중앙에서 관리할 수 있게 하며, 여러 객체의 재사용, 캐싱 등의 작업을 수행할 수 있습니다.

1.1 팩토리 생성자 정의 및 사용

팩토리 생성자는 factory 키워드를 사용하여 정의합니다. 팩토리 생성자는 실제 객체를 생성하거나 캐시된 객체를 반환할 수 있습니다.

class DatabaseConnection {
  // 실제 객체를 저장할 변수
  static DatabaseConnection? _instance;

  // private 생성자
  DatabaseConnection._internal() {
    print('DatabaseConnection created');
  }

  // 팩토리 생성자
  factory DatabaseConnection() {
    _instance ??= DatabaseConnection._internal();
    return _instance!;
  }

  void query(String sql) {
    print('Executing query: $sql');
  }
}

void main() {
  var db1 = DatabaseConnection();
  var db2 = DatabaseConnection();

  db1.query('SELECT * FROM users');

  print(identical(db1, db2)); // true, db1과 db2는 동일한 인스턴스입니다.
}

위 예제에서 DatabaseConnection 클래스는 _instance라는 정적 변수를 사용하여 단일 인스턴스를 유지합니다.

팩토리 생성자 DatabaseConnection()는 객체가 이미 생성되어 있는 경우, 기존 객체를 반환합니다.

그렇지 않으면 새로운 객체를 생성합니다.

2. Singleton 패턴

Singleton 패턴은 특정 클래스의 인스턴스가 하나만 존재하도록 보장하는 디자인 패턴입니다.

이 패턴은 주로 전역적인 접근이 필요한 객체를 생성할 때 사용됩니다.

2.1 Singleton 패턴 구현

Dart에서는 Singleton 패턴을 팩토리 생성자와 결합하여 쉽게 구현할 수 있습니다.

Singleton 패턴을 구현할 때는 클래스의 생성자를 private으로 선언하여 외부에서 직접 객체를 생성하지 못하도록 합니다.

class Singleton {
  // Singleton 인스턴스를 저장할 변수
  static Singleton? _instance;

  // private 생성자
  Singleton._internal() {
    print('Singleton instance created');
  }

  // 팩토리 생성자
  factory Singleton() {
    _instance ??= Singleton._internal();
    return _instance!;
  }

  void doSomething() {
    print('Singleton doing something');
  }
}

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

  singleton1.doSomething();

  print(identical(singleton1, singleton2)); // true, singleton1과 singleton2는 동일한 인스턴스입니다.
}

위 예제에서 Singleton 클래스는 단일 인스턴스를 보장하며, Singleton() 팩토리 생성자를 사용하여 클래스의 인스턴스를 관리합니다. identical() 함수는 두 객체가 동일한 인스턴스인지 확인하는 데 사용됩니다.

3. 팩토리 생성자와 Singleton 패턴의 차이점

  • 팩토리 생성자: 객체의 생성 논리를 제어할 수 있으며, 필요에 따라 새로운 객체를 생성하거나 기존 객체를 재사용할 수 있습니다. 객체의 생성과 관리를 유연하게 제어할 수 있습니다.

  • Singleton 패턴: 특정 클래스의 인스턴스가 단 하나만 존재하도록 보장합니다. 전역적으로 접근 가능한 단일 인스턴스를 제공하며, 객체의 재사용을 보장합니다.

4. 사용 사례

4.1 팩토리 생성자 사용 사례

  • 객체 캐싱: 자주 사용되는 객체를 캐싱하여 성능을 개선할 때 사용합니다.
  • 조건부 객체 생성: 특정 조건에 따라 다양한 객체를 생성할 때 유용합니다.

4.2 Singleton 패턴 사용 사례

  • 전역 상태 관리: 전역적으로 접근 가능한 상태를 관리할 때 사용합니다. 예를 들어, 설정 관리, 데이터베이스 연결 등에서 유용합니다.
  • 자원 관리: 자원의 단일 인스턴스를 보장하여 자원 낭비를 줄이는 데 사용합니다.

 

Dart에서 팩토리 생성자와 Singleton 패턴은 객체 생성과 관리를 효율적으로 제어할 수 있는 강력한 도구입니다.

팩토리 생성자는 객체 생성의 논리를 중앙에서 관리할 수 있게 하며, Singleton 패턴은 전역적으로 접근 가능한 단일 인스턴스를 보장합니다.

이 두 패턴을 적절히 활용하여 코드의 유지보수성과 성능을 개선할 수 있습니다.

구독!! 공감과 댓글은 저에게 큰 힘이 됩니다.

Starting Google Play App Distribution! "Tester Share" for Recruiting 20 Testers for a Closed Test.

 

Tester Share [테스터쉐어] - Google Play 앱

Tester Share로 Google Play 앱 등록을 단순화하세요.

play.google.com

 

 

반응형