처음 시작할 때는 싱글톤이라는 개념이 너무 어려워서 그냥 이해만하고 지나쳤지만 이제 내것으로 만들어야 하기때문에 다시 제대로 공부해보자!
싱글톤이란?
가끔 전체 프로그램에서 단 하나의 객체를 만들도록 보장해야 하는 경우가 있습니다.
그렇게 해서 단 하나만 생성된다고 해서 이 객체를 싱글톤이라고 합니다.
싱글톤을 만들려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다.
생성자를 호출한 만큼 객체가 생성되기 때문입니다.
생성자 앞에 접근제어자 private를 붙여주면 된다.
자신의 타입인 정적 필드를 하나 선언하고 자신의 객체를 생성해 초기화한다.
참고로 클래스 내부에서는 new연산자로 생성자 호출이 가능하다.정적필드도 private 접근제한자를 붙여 외부에서 필드값을변경하지 못하도록 막는다.
대신 외부에서 호출할 수 있는 정적 메서드인 getInstance()를 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 리턴해준다!
public class 클래스 {
//정적 필드
private static 클래스 singleton = new 클래스();
//생성자
private 클래스(){}
//정적 메서드
static 클래스 getInstace(){
return singleton;
}
}
package OOP;
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {
}
static Singleton getInstance(){
return singleton;
}
}
package OOP;
public class SingletonExample {
public static void main(String[] args) {
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
if(obj1 ==obj2){
System.out.println("같은 singleton 객체입니다.");
}else{
System.out.println("다른 singletone 객체입니다.");
}
}
}
애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인패턴.
생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나고 최초 생성 이후에 호출된 생성자는 최초에 생성한 객체를 반환한다.
고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있음
또한 싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.
DBCP(DataBase Connection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용.
인스턴스가 절대적으로 한개만 존재하는 것을 보증하고 싶을 경우 사용.
두 번째 이용시부터는 객체 로딩 시간이 현저하게 줄어 성능이 좋아지는 장점!