2023. 4. 4. 13:52ㆍ모바일어플개발/Flutter
안녕하세요~ totally 개발자입니다.
Singleton (싱글톤)
저번 포스팅에서는 Factory(팩토리) 패턴에 대해 살펴보면서 싱글톤의 개념을 일부 언급했지만 이번 포스팅을 통해 조금 더 자세하게 살펴보고자 합니다. 물론 factory 키워드는 여기에서도 사용되기 때문에 저번 포스팅을 보시고 이번 포스팅을 보시면 더욱 이해가 될 것이라 생각합니다.
싱글톤의 특징
1) 클래스의 static 멤버를 선언하고 인스턴스를 할당해줍니다.
2) public으로 접근이 되지 않도록 생성자에 대한 접근을 private로 제한합니다.
3) 인스턴스를 return해줄 수 있는 메소드를 만들어줍니다.
4) 하나의 클래스에서 하나의 인스턴스만 생성하여 사용합니다.
5) factory 생성자에서는 this에 접근할 수 없습니다.
이를 기반으로 실습으로 들어가보도록 하겠습니다.
Step 1: 주석을 상세하게 달아놓았는데 먼저 처음으로 Singleton 클래스의 인스턴스에서 사용될 변수를 선언해줍니다. 저는 Map 형식으로 key와 value값을 담을 수 있는 변수를 선언하였습니다. 그 후에 Singleton 클래스의 인스턴스를 private 생성자 형태로 _internal()를 사용하여 선언합니다. 만약 이 작업이 없다면 public으로 자동 생성됩니다. 그리고 9번째 줄에서 factory 키워드를 사용하여 factory 생성자를 만들어주고 인스턴스가 아직 만들어지지 않았다면 생성해서 return하며 이미 존재하는 경우에는 기존의 인스턴스를 그대로 return하게 됩니다. 12~14번째 줄에서는 6번째 줄의 Singleton._internal() private 생성자를 통해 초기화 작업을 진행해줄 수 있습니다. 마지막으로 17, 18번째 줄의 set과 get 메소드를 통해 인스턴스의 변수인 _data에 접근 가능해서 데이터를 주고 받을 수 있도록 선언해줍니다.

Step 2: 메인 함수를 작성해줍니다. 여기에서 22~24번째 dataList1을 만들고 26-28번째 줄처럼 dataList2 변수를 만들어서 Singleton 인스턴스를 만들어주었습니다. 위에서 이해를 제대로 하셨다면 이 dataList1과 dataList2는 같은 인스턴스인 것을 알 수 있으며 dataList1에 set으로 데이터를 추가하던지 dataList2에 set으로 데이터를 추가하던지 같은 값이 리턴되는 것을 알 수 있습니다. 그것에 대한 확인은 30-32번째 라인을 통해 확인해볼 수 있습니다. 그리고 dataList1과 dataList2를 출력해보는 과정을 통해 그것을 정확하게 알 수 있습니다.

Step 3: 직접 실행해서 테스트해보도록 합니다. (dart Singleton.dart를 터미널에 입력)

위와 같이 나온다면 제대로 Singleton이 적용된 것입니다. 직접 실습을 해보시면 바로 이해가 될 것이라고 생각되며 memory 절약 및 성능 개선 등의 여러 장점이 있기 때문에 활용해보시는 것을 권장드립니다. 감사합니다.
[전체 소스 코드]
class Singleton { | |
// 싱글톤 클래스에 담을 변수 | |
static final Map<String, dynamic> _data = <String, dynamic>{}; | |
// 생성자를 private로 제한하기 위해 선언 | |
static final Singleton _singletonData = Singleton._internal(); | |
// 단일 인스턴스를 리턴하기 위해 factory 사용 | |
factory Singleton() => _singletonData; | |
// 인스턴스를 생성하여 실행을 위한 코드를 여기에 삽입 | |
Singleton._internal() { | |
print("싱글톤 클래스의 인스턴스가 생성되었습니다."); | |
} | |
// setter와 getter 메소드 추가 | |
set(String key, dynamic data) => _data[key] = data; | |
get(String key) => _data[key]; | |
} | |
void main() { | |
Singleton dataList1 = Singleton(); | |
dataList1.set('Job1', 'Student'); | |
dataList1.set('Name1', 'Andrew'); | |
Singleton dataList2 = Singleton(); | |
dataList2.set('Job2', 'Developer'); | |
dataList2.set('Name2', 'Paul'); | |
if (dataList1 == dataList2) { | |
print("같은 인스턴스입니다."); | |
} | |
print("dataList1 정보"); | |
print("Job1: ${dataList1.get('Job1')}, Name1: ${dataList1.get('Name1')}"); | |
print("Job2: ${dataList1.get('Job2')}, Name2: ${dataList1.get('Name2')}"); | |
print("dataList2 정보"); | |
print("Job1: ${dataList2.get('Job1')}, Name1: ${dataList2.get('Name1')}"); | |
print("Job2: ${dataList2.get('Job2')}, Name2: ${dataList2.get('Name2')}"); | |
} |
'모바일어플개발 > Flutter' 카테고리의 다른 글
[051] 플러터 (Flutter) 배우기 - sqflite 사용하여 단어장 만들기(로컬 데이터베이스) (4) | 2023.04.08 |
---|---|
[050] 플러터 (Flutter) 배우기 - Rest API 사용(GET, POST) (0) | 2023.04.05 |
[048] 플러터 (Flutter) 배우기 - Factory Pattern (팩토리 패턴) 이해하기 (0) | 2023.04.03 |
[047] 플러터 (Flutter) 배우기 - Carousel Slider + Indicator (자동 슬라이더 + 인디케이터 구현) (2) | 2023.04.01 |
[046] 플러터 (Flutter) 배우기 - ListView.builder + 스크롤 Pagination 적용 (4) | 2023.03.30 |