달달한 스토리

728x90
반응형

 

요 며칠 동안 행복한 플러터 세상에 살아가는 중이다.

 

예전에 코틀린이나 자바를 사용할 때도

 

싱글톤 패턴이라는 말을 익히 들었지만,

 

무지한 상태에서 싱글톤이라는 단어는 나에겐

 

이해하기 어려운 단어였다.

 

그래도 지금은 실무에서 사용했고, 어느 정도 이해하였기 때문에 포스팅을 해보려고 한다.

 

참고 자료

 

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

 

[dart] what is factory? | 싱글톤 패턴 singleton pattern class

what is factory? flutter에서 모델 클래스를 만들 때 아래 같은 코드가 자주 사용된다. 그런데 factory라는 것을 dart에서 처음 봤다. factory 키워드는 무엇이고 어떤 역할을 할까? class Book { final String..

another-light.tistory.com

 


싱글톤(SingleTon)이란?

 

보통 객체를 인스턴스화 하면 하나의 인스턴스가 생기게 되는데,

 

생성자를 호출할 때마다

 

인스턴스 1, 인스턴스 2, 인스턴스 3....

 

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

 

같은 객체이지만, 인스턴스 안에 멤버 변수들은 이름은 같아도 각각 다른 값을 부여받을 수 있다.

 

이를 방지하기 위해 (공유를 하기 위해, 혹은 여러 클래스의 혼동을 방지하기 위해)

 

하나의 인스턴스 만을 만들어서 그 안에 멤버 변수들의 값을 공유하는 것이다.

 

더 자세히 말하자면 새로운 생성자를 또 만들지 않고,

 

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

 

이런 점에서 마치 그것과 비슷하다. => Provider

 

사실 프로바이더와 값을 공유한다는 점? 에서 사용목적이 같을 수 있지만,

 

프로바이더는 또 하나의 프로바이더 클래스를 만들어 주고,

 

싱글톤은 해당 클래스 안에서 만들어 주는 개념이라 사용 목적에 따라

 

더 적합한 것을 고르면 되겠다.

 

약간 ViewModel과 비슷하게 공유하는 느낌이지만,

 

이 역시 아예 다른 개념이다.. (이건 개인적인 견해이다.)

 

더 사용하다 보면 차이점을 알게 될 거이라고 생각한다.

 

 

 

싱글톤 패턴 

 

말 그대로 싱글톤을 이용해서 싱글톤 디자인 패턴을 사용하는 것, 생성자가 여러 번 호출되더라도,

 

결국엔 최초에 생성된 단 하나의 생성자만 사용되고, (값이 있으면 생성자 호출 시 원래 값으로 리턴)

 

이를 이용한 디자인 패턴이 바로 싱글톤 패턴이다.

 

factory

 

싱글톤 패턴을 사용할 때 쓰는 예약어이다.

 

factory.. 이름 그대로 해석하면 공장이라는 개념 같은데,

 

무언가 계속 만들어주는 공장 느낌이 강하지만,

 

사실 값을 저장해주고 있는 창고와 더 비슷한 개념이라고 보면 된다.

 

dart 공식 문서를 살펴보면, 새로운 인스턴스를 생성하지 않는 생성자를 구현할 때,

 

factory 키워드를 사용하라고 명시되어 있다.

 

팩토리의 특징은 다음과 같다.

 

1. 전에 이미 생성된 인스턴스가 있다면 원래 값을 return 하여 재사용한다.

 

2. 하나의 클래스에서 하나의 인스턴스만을 사용한다.

 

3. 서브 클래스를 리턴할 때 사용할 수 있다.

 

4 factory 생성자에서는 this에 접근할 수 없다.

 

좋다 그러면 간단한 예제를 살펴보자.

 

예제

 

class Singleton {
  int count; //증가해주는 변수
  
  static final Singleton _instance = Singleton._internal();
  
  //_instance 값을 반환한다.
  // 값이 있으면 원래 값을 반환한다.
  factory Singleton() => _instance;
  
  Singleton._internal() {
  //처음 인스턴스를 만들어 주어 실행하는 코드를 여기에 넣어준다.
    //초기화 코드
    count = 0;
    print('Singleton was created.');
  }
}

void main() {

  var one = Singleton(); //첫 싱글톤 클래스 생성  

	// 한번더 생성자를 호출한다고 해도
  	// 위에 첫 생성자를 호출하여, 같은 인스턴스만 넘겨 받게 된다. 
    // 인스턴스를 공유하게 되는 것이다.
  var two = Singleton(); 
  
  // 각 클래스의 count값 1씩 증가
  one.count++;
  two.count++;
  
  print(${one.count} + ${two.count});

}

 

위에 값을 print로 찍어 보면,

 

2 2

 

가 나온다.

 

원래 일반 클래스를 만들고 저런식으로 다른 생성자를 호출하여

 

똑같이 값을 증가하게 했다면,

 

각각 

 

1 1

 

이 나왔을 것이다.

 

싱글톤은 같은 인스턴스를 공유하고,

 

일반 클래스는 서로 다른 생성자를 만들어 각각의 인스턴스를 가지기 때문에

 

위와 같이 공유된 값과 공유되지 않은 값이 나오는 것이다.

 

보통 싱글톤의 정석 형식은 이런 식으로 생겼다.

 

class Singleton {
  static final Singleton _instance = Singleton._internal();

  factory Singleton() {
    return _instance;
  }

  Singleton._internal() { //클래스가 최초 생성될때 1회 발생
    //초기화 코드    
  }
}

static final Singleton _instance = Singleton._internal();

 

처음에 _instance 변수에 Singleton._internal() 값을 넣어준다.

 

Singleton._internal() 메서드 안에 

 

클래스가 생성자로 인해 호출되어 생성될 때

 

최초 1회만 실행해줄 메서드나 값을 넣어 주면 되는 것이다.

 

그러면 그 값은 _instance에 담기고,

 

factory 예약어로 쓰인 Singleton 생성자를 호출하면,

 

_instance 값을 반환하게 되는 것이다.

 

factory로 인해 인스턴스는 단 한 번만 생성이 되고,

 

값이 있을 때는 원래 있었던 값을 넘겨주고,

 

값이 없으면 새로 만든 값을 반환해 주는 것이다.

 

이렇게 설명하니 정말 어렵게 설명한 느낌이 든다.

 

하지만 찬찬히 예제를 따라 하면서 글을 천천히 읽다 보면,

 

무슨 이야기인지 천천히 깨닫게 될 것이다.

 

지금 당장 이해하지 못하더라도 괜찮다.

 

분명 싱글톤을 사용할 날이 올 수 있기 때문에 그때 배우는 게

 

오히려 습득력이 좋을 수 있다고 생각이 든다.

 

오늘은 여기까지...

728x90
반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading