용어
- 디자인 패턴: 프로그램을 설계할때 발생했던 문제점들을 객체 간 상호관계 등을 통해 해결할 수 있도록 하나의 '규약'형태로 만들어 놓은 것
개념
- 싱글톤(Singleton) 패턴 : 하나의 클래스에 오직 하나의 객체 인스턴스만 가지는 패턴
- 공통된 객체를 여러 개 생성해서 사용하는 DBCP (Database Connection Pool)와 같은 데이터베이스 연결 모듈에 많이 사용

사용 이유
- 메모리 절약
- 최초 한번의 new 연산자를 통해서 고정된 메모리 영역을 사용하기 때문에 추후 해당 객체에 접근할 때 메모리 낭비를 방지
- static을 사용하여 별도의 메모리 영역을 얻으면서 한번의 new 연산자로 인스턴스를 사용하기 때문에 메모리 낭비를 방지
- 뿐만 아니라 이미 생성된 인스턴스를 활용하니 속도 측면에서도 이점
- 데이터 공유
- 다른 클래스 간에 데이터 공유가 쉽다 -> 싱글톤패턴으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 접근하여 사용
문제점
- 싱글톤 패턴을 구현하는 코드 자체가 많이 필요. 정적 팩토리 메서드에서 객체 생성을 확인하고 생성자를 호출하는 경우에 멀티스레딩 환경에서 발생할 수 있는 동시성 문제 해결을 위해 syncronized 키워드를 사용해야 함
- 테스트하기 어렵다. 싱글톤 인스턴스는 자원을 공유하고 있기 때문에 테스트가 결정적으로 격리된 환경에서 수행되려면 매번 인스턴스의 상태를 초기화시켜주어야 함.그렇지 않으면 어플리케이션 전역에서 상태를 공유하기 때문에 테스트가 온전하게 수행되지 못한다.
- 의존 관계상 클라이언트가 구체 클래스에 의존하게 됨. new 키워드를 직접 사용하여 클래스 안에서 객체를 생성하고 있으므로, 이는
SOLID 원칙
중 DIP
를 위반하게 되고 OCP
원칙 또한 위반할 가능성이 높다.
- 자식클래스를 만들수 없다
- 내부 상태를 변경하기 어렵다