✅ 단 하나의 객체만을 생성하게 강제하는 디자인 패턴. 즉, 클래스를 통해 생성할 수 있는 객체가 한 개만 되도록 만드는 것
✅ 어플리케이션이 시작될 때 어떤 클래스가 최초 한 번만 메모리를 할당(static)하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴
✅ 실제로 생성되는 객체는 하나이며 최초로 생성된 이후에 호출된 생성자는 이미 생성한 객체를 반환시키는 것
즉, 한 개의 객체만 생성하여 해당 인스턴스를 공유하여 사용할 수 있게 하여 설정값 변경등에 혼동이 없도록 도와줌
✅ 하나의 인스턴스를 만들어 놓고 해당 인스턴스를 다른 모듈들이 어디에서든 공유하며 접근, 사용할 수 있도록 함
✅ 주로 공통된 객체를 여러개 생성해서 사용해야 하는 상황에 사용
✅ 하나의 인스턴스 메모리에 등록해서 여러 쓰레드가 동시에 해당 인스턴스를 공유하여 사용할 수 있게끔 할 수 있기 때문에 요청이 많은 곳에서 사용하면 효율을 높일 수 있음
- 인스턴스가 하나이기 때문에 메모리 낭비를 줄일 수 있다.
- 싱글톤으로 만들어진 클래스의 인스턴스는 전역이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.
- 인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 경우 사용
- 두 번째 이용시 부터는 객체 로딩 시간이 줄어 성능이 좋아짐
- DBCP(DataBaseCommection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야 하는 상황에서 많이 사용됨
- 여러 클래스의 인스턴스에서 싱글톤 인스턴스의 데이터에 동시에 접근하게 되면 동시성 문제가 발생.
- 어플리케이션 전역에서 상태를 공유하기 때문에 해당 패턴을 테스트하려면 격리된 환경에서 수행하여야 함. 또한, 매번 인스턴스의 상태를 초기화시켜주어야하기 때문에 테스트하기 어렵다.
- 자식클래스를 만들수 없다는 점과, 내부 상태를 변경하기 어렵다.
public class SingleTon {
// 다른 클래스에서 생성할 수 없도록 생성자를 private으로 생성함!
private SingleTon() {
}
// static 선언으로 지정된 메모리 공간에만 존재하는 변수 선언
private static SingleTon one;
// one이 null 이면 새로운 객체 생성, null이 아니면 그대로 반환
public static SingleTon getInstance() {
if(one==null) {
one = new SingleTon();
}
return one;
}
}
package java_studying;
public class SingleTonSample {
public static void main(String[] args) {
// singletone 변수로 SingleTon타입 인스턴스를 불러옴
SingleTon singletone = SingleTon.getInstance();
// singletone1 변수로 SingleTon타입 인스턴스를 불러옴
SingleTon singletone1 = SingleTon.getInstance();
// 두 변수가 같다면 같은 객체, 다르다면 다른 객체
if(singletone==singletone1) {
System.out.println("두 객체는 같습니다.");
} else {
System.out.println("두 객체는 다릅니다.");
}
}
}
두 객체는 같습니다.
public class SingleTon1 {
// 다른 클래스에서 생성할 수 없도록 private으로 생성자 선언
private SingleTon1() {
}
// private static class에 final(변경할 수 없음)로 변수이름이 one인 싱글톤 객체를 생성함
private static class LazyHolder{
public static final SingleTon1 one = new SingleTon1();
}
// LazyHolder의 final로 선언된 변수 one을 반환해줌
public static SingleTon1 getInstance() {
return LazyHolder.one;
}
}
package java_studying;
public class SingleTonSample {
public static void main(String[] args) {
// singletone 변수로 SingleTon1타입 인스턴스를 불러옴
SingleTon1 singletone = SingleTon1.getInstance();
// singletone1 변수로 SingleTon1타입 인스턴스를 불러옴
SingleTon1 singletone1 = SingleTon1.getInstance();
// 두 변수가 같다면 같은 객체, 다르다면 다른 객체
if(singletone==singletone1) {
System.out.println("두 객체는 같습니다.");
} else {
System.out.println("두 객체는 다릅니다.");
}
}
}
두 객체는 같습니다.