[DesignPattern] Singleton Pattern
싱글톤 패턴! 단 하나만 존재하는 유일무이한 객체를 만들기 위한 패턴!
싱글톤 패턴을 정의하면 아래와 같습니다.
세상에서 단 하나뿐인 특별한 객체
단 하나뿐인 객체와 왜 필요하냐고 물으실 수 있으십니다. 하지만 용도는 무궁무진합니다.
디바이스를 위한 디바이스드라이버나 로그 기록용 객체, 대화상자, 스레드 풀 등등... 이런 형식의 객체는 2개 이상 만들게 되면 무엇인가 문제가 생기지요. 프로그램 상의 문제나 아니면 불필요하게 메모리만 덩그러니 차지하게 되는 그런 상황 말입니다.
사람들은 묻습니다. 그럼 전역변수를 쓰면 되지 않냐고요.하지만 싱글톤 패턴을 사용하는것이 전역변수를 사용하는 것보다 훨씬! 프로그램에 좋습니다. 전역변수를 사용하게 되면 프로그램이 시작되자마자 메모리 상에 생성되게 됩니다. 하지만 사용하지 않을때도 계속 메모리 상에 존재하게 되는 것은 분명 불필요한 것입니다. 누군가는 말하겠죠? PC 성능이나 요즘 모바일의 성능 등 CPU, 메모리 등의 스펙이 좋은데 왜 그런거까지 신경써야 하냐구요. 하지만 이 말은 분명 잘 못된 생각입니다. 이런식으로 만들어진 프로젝트는 나중에 큰 문제가 발생할 수 있으니까요.
그럼 싱글턴 패턴의 개요에 대해 한번 보겠습니다.
해당 클래스의 인스턴스를 하나만 만들고 어디서든지 접근할 수 있도록 한다라.. 왠지 쉬워보이지 않나요? 하지만 한번 생각해보시고, 저 방법에 대해 구현해 보세요! 그렇게 만만치는 않을겁니다. 하하;;
그럼 하나만 생성하게 할려면 어떻게 해야 할까요.. 잘 생각해봅시다! 딱 하나만 생성해 놓고 해당 객체를 생성하지 못하게 막으면 되는건가요?
자, 그럼 시작해 보겠습니다.생성자를 public으로 선언되어 있다면, 모든 클래스에서 객체를 생성할 수 있습니다. 하지만 이건 우리가 원하는 방식이 아닙니다. 그럼 private로 선언을 한다면요? 그럼 인스턴스를 만들 수 없는건가요? 생성자를 호출할려면 일단 그 클래스의 인스턴스가 있어야 하는데 인스턴스를 만들수가 없습니다! 음..그럼 static으로 선언된 정적 메소드를 사용하면 어떻게 되나요? 그건 인스턴스 없이도 호출이 가능함을 알 수 있습니다.
싱글톤의 설계를 봅시다 ! Singleton 우측에 1이란 숫자는 단 하나의 객체만을 만들수 있다는 것입니다.
보시면 위에서 설명한대로 생성자는 private이고, Singleton 클래스의 객체를 얻기위한 Instance 메소드가 있음을 알 수 있습니다.
그럼 싱글톤 패턴의 구현을 보면서 하나씩 알아가 보겠습니다.먼저 C#으로 구현된 싱글톤 패턴입니다.
알아 보시겠나요?최초 Instance 메소드 호출에 한하여 클래스 내부에서 객체를 생성하고 있습니다. 그 이외에는 가지고 있는 객체는 전달해주는 방식으로 단 1개의 객체를 생성하여 사용하는 방식이죠.
하지만 여기서는 위험성이 잠재해 있습니다. 만약 멀티스레딩 환경에서 싱글톤 패턴을 사용하여 객체를 얻는다고 생각해보시면, 만약 정말 만약에 각 스레드에서 거의 동시에 객체를 얻기 위해 Instance 메소드를 호출하게 된다면요? 정말 안타깝지만 가끔씩 여러개의 객체가 생성되는 불운을 만들어 낸답니다. 그래서 어떻게 막느냐?
이런 방식으로 C#에서는 멀티스레딩 환경에서 싱글톤패턴을 보호할 수 있습니다. ^^
Static Initializaion에만 할당할 수 있도록 하는 것은 클래스 로드시 new가 실행되게 되고 항상 1개의 인스턴스를 가지게 합니다.하지만 이 방법과 같은 초기화 방식은 권장하지 않는편이죠. 왜냐하면 정적 변수의 초기화 순서가 모호해 집니다.!
그리하여 최종적으로 나온 방법이 아래와 같습니다.
멀티스레드 싱글톤입니다. 정적 초기화 방식은 대부분의 경우에 알맞는 방식입니다 생성자를 사용하거나 인스턴스화 하기 전에 다른 작업을 수행하고, 다중 스레드 환경에서 작업해야 하는 경우 이러한 솔루션을 사용하면 간편해 집니다. 스레드에서의 안전을 보장하기 위해서 여러분들은 객체의 하나의 인스턴스가 여러 스레드에 존재하는지 확인해야 합니다.!!그러한 기능들은 여러 언어들에게 제공합니다 ^^ 위 방식은 하나의 초기화시 lock을 이용해서 잠구는 방법입니다. 이렇게 함으로써 두번 Check할 수 있고, 문제점을 막을 수 있습니다.!
다시 한번 정리해 보겠습니다!
싱글턴 패턴은 해당 클래스의 인스턴스가 하나만 만들어지고, 어디서든지 그 인스턴스에 접근할 수 있도록 하기 위한 패턴!
이제 어느 정도 정리가 되셨나요 ^^ 한번 싱글톤 패턴을 여러분들의 프로젝트에 적용해보세요 !
다른 언어에 관한 싱글톤 구현방식은 검색해 보시면 굉장히 많은 자료가 나온답니다 !!