싱글톤 패턴이란?
애플리케이션이 시작될 때, 클래스가 최초 한 번만 메모리를 할당(static)하고 해당 메모리에 인스턴스를 만들어 사용하는 패턴.
간단히 말하면 하나의 인스턴스만 생성하여 사용하는 디자인 패턴이다. 인스턴스가 필요할 때, 똑같은 인스턴스를 만들지 않고 기존의 인스턴스를 활용하는 것이다.
구현 방법
생성자가 설령 여러번 호출되더라도, 실제로 생성되는 객체는 하나이며 최초로 생성된 이후에 호출된 생성자들은 이미 생성한 최초의 객체를 반환시키도록 만들어야 한다. (보통 생성자를 private으로 선언해 다른 곳에서 생성하지 못하도록 만들고, public으로 get()함수를 만들어 이를 통해 최초의 객체를 받아 사용하도록 구현한다.)
쓰는 이유는?
객체는 생성할 때마다 메모리 영역을 할당받아야 한다. 하지만 단 한번의 new를 통해 객체를 생성한다면 메모리 낭비를 방지할 수 있다. 또한 싱글톤으로 구현한 인스턴스는 '전역'이므로, 다른 클래스의 인스턴스들이 데이터를 공유하는 것이 가능하다.
그렇다면 어디에 쓰일까?
이러한 특성으로 인해 주로 공통된 객체를 여러개 생성해 사용해야 하는 상황에 많이 쓰인다. 예를 들면 데이터베이스에서 커넥션풀, 스레드풀, 캐시, 로그 기록 객체 등에 쓰이고 인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 때에도 사용한다.
단점은 무엇일까?
만약 싱글톤 인스턴스가 혼자 너무 많은 일을 하거나, 많은 데이터를 공유시키면 다른 클래스들 간의 결합도가 높아지게 되고 객체 지향의 설계 원칙 중 개방-폐쇄 원칙이 위배될 수 있다. 또한 멀티 스레드 환경에서 동기화 처리를 하지 않았을 때 인스턴스가 2개 생성되는 문제도 발생할 수 있다. 따라서 싱글톤을 확실히 이해하고 체계적으로 설계할 자신이 없다면 사용을 지양하라는 의견이 많다.
# 멀티스레드 환경에서 안전한 싱글톤 만드는 법은 크게 3가지가 존재하는데 이는 다음 블로그를 참조하자.
https://gyoogle.dev/blog/design-pattern/Singleton%20Pattern.html