앱 전체에서 단일 객체만을 유지하고 사용하기 위한 디자인 패턴
특정 클래스의 객체(인스턴스)가 단 한 번만 생성되고, 이후에는 해당 객체를 여러 곳에서 공유하여 사용하는 디자인 패턴.
객체의 중복 생성을 피하고 공유 리소스를 효율적으로 관리하는 데 사용됩니다.
주로 앱의 상태 관리, 리소스 공유, 설정 데이터, 효율성 등을 유지하기 위해 사용됩니다.
앱 전체에서 상태를 공유해야 하는 경우, 상태를 단일 객체에 저장하여 간편한 접근과 관리를 가능하게 합니다.
ex) 앱의 테마, 로그인 정보 등을 Singleton에 저장하여 다른 화면이나 위젯들에서 공통적으로 사용.
앱 전체에서 단일 객체를 유지하므로, 여러 곳에서 해당 객체에 접근하여 데이터를 공유하고 사용할 수 있습니다.
이는 데이터나 객체 등을 중복으로 생성하지 않기에 자원 낭비를 방지하고, 메모리 사용을 최적화할 수 있습니다.
일반적으로 처음 사용될 때 객체를 생성하며, 이후에는 생성된 객체를 재사용하므로 반복적인 생성으로 인한 오버헤드를 줄여줍니다.
지나치게 많은 데이터를 Singleton을 통해 저장하면 메모리 누수나 부하가 발생할 수 있으며, 코드의 복잡성이 증가할 수 있으니 적절하게 사용하는 것이 중요합니다!
또한 Singleton이 아니어도 Flutter에서는 Provider, BLoC 패턴 등 다양한 상태 관리 패키지가 있으므로 상황에 따라 상태 관리 패키지 사용을 고려 후 필요에 따라 적용하는 것이 좋습니다.
class SingletonTest {
// 유일한 객체를 저장하는 private 변수
static final SingletonTest _instance = SingletonTest._internal();
// 단일 객체 반환을 위해 factory 키워드 사용
factory SingletonTest() => _instance;
// 테스트를 위한 변수
String text = "Singleton Text";
SingletonTest._internal(){
print("생성되었습니다.");
}
}
클래스 생성
객체가 한 번만 생성되도록 구현합니다.
Instance 생성 및 반환
클래스에서 유일한 객체를 생성하고, 필요할 때마다 해당 객체를 반환하는 정적 메서드를 구현합니다.
void main() {
// Singleton 객체 생성
SingletonTest singleton1 = SingletonTest();
SingletonTest singleton2 = SingletonTest();
// 두 객체가 동일한지 확인
print(identical(singleton1, singleton2)); // true
// 데이터 변경과 접근
print(singleton1.text); // "Singleton Text"
singleton2.text = "text Change!!";
print(singleton1.text); // "text Change!!"
}
사용 예제를 통해 SingletonTest
클래스를 두 번 생성하여 비교 시 같은 객체임을 알 수 있으며 변수 값이 공유됨을 확인할 수 있습니다!