싱글톤 패턴(Singleton Pattern) 이란?
소프트웨어 디자인 패턴에서 싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다. 주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다.
즉, 프로그램에서 한 번만 객체가 생성되고 이후에는 최초 생성된 객체를 참조하는 형식의 디자인 패턴이다.
싱글톤 패턴을 사용하는 이유 및 문제점
사용하는 이유?
오직 하나의 인스턴스만 사용하므로 메모리적 측면에서 이득이 있다. 단 한 번만 new 연산자를 통해서 생성이 되므로 고정적인 메모리 영역을 사용하게 되고, 추가적으로 인스턴스 생성이 프로그램 전체에서 한 번만 일어나므로 약간의 속도적인 이득도 취할 수 있다.
다른 이점은 데이터 공유에 대한 이점이다. 싱글톤 패턴으로 생성된 인스턴스는 전역변수로 선언되어 있기 때문에 어떤 클래스에서든 쉽게 접근이 가능하다. 하지만 역으로 말하면 이러한 점 때문에 Concurrency Problem가 있을 수 있다. 간단한 예시로는 여러 쓰레드가 동시에 싱글톤 인스턴스의 변수에 접근하게 되는 경우가 생길 수 있다.
문제점
위에서 말했듯이 Concurrency Problem이 있다. 어디서든 접근이 가능하다 보니까 동시에 싱글톤 인스턴스의 변수에 접근하는 일이 생겨 프로그램에 문제가 있을 수 있다.
다른 문제로는 싱글톤 패턴을 남용하게 되면, 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시키게 되어서 다른 클래스의 인스턴스들 간에 결합도가 높아져 "개방-폐쇄 원칙" 을 위배하게 된다. (=객체 지향 설계 원칙에 어긋남)
따라서 수정 및 테스트하기 어려워 진다.
이러한 문제점들은 "잘" 사용하게 된다면 생기지 않고, 이점만을 챙길 수 있다.
사용법
싱글톤 패턴은 간단하게 인스턴스를 담을 전역변수(instance), 해당 전역변수에 반환하는 전역함수(getInstance())만 있으면 된다. 추가적으로 구현 방법에 따라서 instance값을 할당할 때 thread-safe하게 만든는 방법이 있다. 구현 방법은 언어마다 다르기 때문에 편한 방식으로 구현하면 된다.
Reference