본문 바로가기
Programming/DesignPattern

[디자인 패턴] 싱글턴(Singleton) 패턴

by Blemish 2021. 5. 13.

Goal

  • 싱글턴(Singleton) 패턴을 이해한다.

 

싱글턴(Singleton) 패턴

 싱글턴(Singleton) 패턴은 인스턴스가 오직 하나만 생성되는 것을 보장하고 어디에서는 인스턴스에 접근할 수 있도록 하는 디자인 패턴

 

※싱글턴은 하나의 원소만을 가지는 집합을 의미

Singleton

 

  • Singleton : 하나의 인스턴스만을 생성하는 책임이 있으며 getInstance() 메서드를 통해 모든 클라이언트에게 동일한 인스턴스를 반환하는 작업을 수행
  • 싱글톤 클래스는 생성자를 Private으로 함으로써 외부에서 객체를 생성할 수 없도록 하고 instance를 전역(Static)으로 구현한다.
  • 외부에서는 GetInstance() 함수를 사용하여 접근할 수 있도록 한다.

 

▷싱글턴 패턴 장점

  • 고정된 메모리영역을 얻으면서 한 번의 new()로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다.
  • 싱글톤으로 만들어진 클래스는 전역 인스턴스로 설계되었기 때문에 다른 클래스에서 접근이 용이함

▷싱글턴 패턴 단점

  • 싱글톤을 너무 많이 사용하거나 너무 많은 것을 수행하게 되면 다른 클래스와 결합도가 높아진다.                         -> OCP를 위배함
  • 멀티스레드 환경에서 동기화 처리 작업을 해주지 않으면 여러 개의 인스턴스가 생성되는 현상이 발생할 수 있다     -> 싱글턴은 하나의 인스턴스만 보장

 

싱글턴(Singleton) 구현

 

 

  • Singleton 클래스를 생성할 때 instance 전역변수는 private로 선언한다.
  • paylock 오브젝트와 lock()을 사용한 이유는 멀티 스레드 환경에서 하나의 인스턴스만 생기는 게 아니라 두 개 이상의 인스턴스가 생기지 않도록 하기 위해서 사용한다.
  • lock()을 사용함으로써 쓰레드가 순서대로 동기화되도록 한다.
  • instance가 없을 경우에만 인스턴스를 생성
  • Linq 구문을 사용하여 class 와 new()만 사용할 수 있도록 설계
  • 위의 Singleton 클래스에서는 GetInstance()에 대해서 표기를 했지만 실제 코드에서는 GetInstance 함수 대신에 Instance라는 프로퍼티를 만들어서 사용하였다.

다중 쓰레드에서 문제가 될 수 있는 부분을 해결함과 동시에 인스턴스가 오직 하나만 생성되는 것을 보장하도록 구현

 

 

싱클턴 디자인패턴을 사용하여 프린터 사용하는 프로그램을 구현해보자.

Singleton

 

 

Singleton 클래스를 상속받는 LGPrinter와 SamsumPrinter를 구현하고 Printer가 할 수 있는 행위(Print)를 캡슐화하는 인터페이스(Printable)를 구현하였다. 또한 사용자(Client)가 PrinterRoom을 통해서 원하는 프린트 기계를 사용하여 Print를 할 수 있도록 설계하였다. 사실 PrinterRoom에서는 Printerable를 활용하면 LGPrinter와 SamsungPrinter를 모두 접근하여 Print할 수 있기 때문에 Singleton을 굳이 사용할 필요는 없지만 간단하게 어떻게 사용되는지 보기 위해서 싱글턴 패턴 또한 사용하였다.

 

Print

 

PrinterRoom 클래스에서 UseSamsumPrint를 보면 SamsumPrinter.Instance에 접근해서 Print 함수를 호출하도록 하였다.

싱글톤을 만들 때 Instance를 사용해도 되고 I, O와 같이 줄여서 사용하여도 된다. 그리고 싱글톤은 Manager급 클래스에서 많이 사용된다.

 

댓글