싱글톤 패턴(Singleton pattern)이란?
개념
: 애플리케이션이 시작될 때, 어떤 클래스가 최초 한 번만 메모리를 할당(static)하고 해당 메모리에 인스턴스를 만들어 사용하는 패턴
즉, '하나'의 인스턴스만 생성하여 사용한는 디자인 패턴이다.
싱글톤 패턴 왜 쓸까 ?
- 지정한 클래스의 인스턴스가 절대로! 1개밖에 존재하지 않는 것을 보증하고 싶을 때
- 인스턴스가 1개밖에 존재하지 않는 것을 프로그램 상에서 표현하고 싶을 때
- 싱글톤으로 구현한 인스턴스는 '전역'이므로, 다른 클래스의 인스턴스들이 데이터를 공유하는 것이 가능한 장점이 있다.
많이 사용하는 경우
- 주로 공통된 객체를 여러개 생성해서 사용해야하는 상황
데이터베이스에서 커넥션풀, 스레드풀, 캐시, 로그 기록 객체 등
안드로이드 앱 : 각 액티비티 들이나, 클래스마다 주요 클래스들을 하나하나 전달하는게 번거롭기 때문에 싱글톤 클래스를 만들어 어디서든 접근하도록 설계함
- 또한 인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 때 사용함
싱글톤 패턴의 장단점
장점
- 고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다.
- 싱글톤으로 만들어진 클래스의 인스턴스는 전역이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.
- 인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 경우 사용한다.
- 두 번째 이용시 부터는 객체 로딩 시간이 줄어 성능이 좋아지는 장점이 있다.
단점
- 싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우에 다른 클래스의 인스턴스들 간에 결합도가 높아져 객체 지향 설계 원칙 중에"
개방-폐쇄 원칙
"을 위배하게 된다.
[개방 폐쇄 원칙 (Open-Closed Principle) ]
: 객체를 다룸에 있어서 객체의 확장은 개방적으로, 객체의 수정은 폐쇄적으로 대하는 원칙
즉, 보여줄건 보여주고 숨길건 숨긴다.
- 이는 객체 지향 설계에 어긋나기 때문에 수정이 어려워지고 유지보수의 비용이 높아진다.
- 멀티 쓰레드 환경에서 동기화 처리를 안하면 인스턴스가 2개가 생성될 가능성이 생기게 된다.
이러한 이유로 싱글턴 패턴이 꼭 필요한 경우가 아니라면 지양해야 한다.
Reference & Additional Resources