Sua Blog

Single Ton 패턴과 Equatable

싱글톤 (Single Ton)이란

객체를 인스턴스화하면 하나의 인스턴스가 생기게 되는데 생성자를 호출할 때 마다

인스턴스1, 인스턴스2, 인스턴스3.. 이런식으로 여러 인스턴스가 생기게 된다.

인스턴스에 안에 변수들은 이름은 같아도 각각 다른 값을 부여 받을 수 있다.

이를 방지하기 위해(공유하거나 여러 클래스의 혼동을 방지하기 위해) 하나의 인스턴스만을 만들어 그 안에 멤버 변수들의 값을 공유하는 것이다.

딱 하나의 인스턴스를 사용하여 하나의 생성자 값 만을 가질 수 있는 것이다.

싱글톤 패턴

싱글톤을 이용해서 디자인 패턴을 사용하는 것.

생성자가 여러 번 호출되더라도, 결국 최초에 생성된 단 하나의 생성자만 사용되고, 이를 이용한 디자인 패턴이 싱글톤 패턴이다.

factory

싱글톤 패턴을 사용할 때 쓰는 예약어이다. 이름을 보면 공장같지만 사실 값을 저장해주고 있는 창고와 더 비슷한 개념이다.

dart 공식문서에는 새로운 인스턴스를 생성하지 않는 생성자를 구현할 때, factory 키워드를 사용하라고 명시되어있다.

factory의 특징

  • 전에 이미 생성된 인스턴스가 있다면 원래 값을 return 하여 재사용한다.
  • 하나의 클래스에서 하나의 인스턴스만을 사용한다.
  • 서브 클래스를 리턴할 때 사용할 수 있다.
  • factory 생성자에서는 this에 접근할 수 없다.

Dart Single Ton

https://dartpad.dev/?id=783d34dee0280e2d1c0d75bfbbcbe6d0

class KakaoManager {
  static final KakaoManager _manager = KakaoManager._internal();

  factory KakaoManager() {
    return _manager;
  }

  KakaoManager._internal() {
    initializeKakaoSDK();
  }

  void initializeKakaoSDK() {
    KakaoSdk.init(nativeAppKey: dotenv.get('KAKAO_CLIENT_ID'));
  }
}

객체 비교

객체는 하나의 인스턴스를 가지는데 같은 객체를 두 개 생성 하더라도 두 객체는 각각의 인스턴스를 가지게 된다.

두 객체 비교

https://dartpad.dev/?id=77802cf47b6dade5457ad9bdf87c3f94

Equatable

위에 객체 비교를 위해 사용한 operator 함수와 hashCode 함수를 통해 했던 값 비교를 자동화 해주는 패키지이다.

https://pub.dev/packages/equatable

import 'package:equatable/equatable.dart';

class Person extends Equatable {
  final int id;
  final String name;
  final int age;

  const Person({required this.id, required this.name, required this.age});

  @override
  List<Object?> get props => [id, name, age];
}

void main() {
  final person1 = Person(id: 1, name: 'sua', age: 28);
  final person2 = Person(id: 1, name: 'no', age: 27);
  print(person1.id == person2.id); // true
  print(person1.name == person2.name); // false
  print(person1.age == person2.age); // false
  print(person1 == person2); //true
}
참고

https://daldalhanstory.tistory.com/240

https://daldalhanstory.tistory.com/264

https://another-light.tistory.com/77