Sua Blog
싱글톤 (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