객체의 인스턴스를 생성할때마다 메모리에 할당을 한다.
하지만 공통되는 기능을 수행하는 객체를 매번 생성한다면 메모리의 낭비가 심해진다.
예를들어 요청이 들어올때마다 로그를 기록해야 하고, 그 로그를 기록해주는 객체가 있다고 가정해보자.
100명에 대한 요청이 들어오고, Singleton 패턴을 사용하지 않는다면, 100개의 Log객체가 생성이 될것이다. 생성이 되는 시간도 오래 걸리고, 로그하나 찍자고 객체를 100개 생성하니 메모리 낭비가 심해진다.
Singleton 패턴을 사용한다면, 이미 생성된 하나의 객체를 참조받기때문에 메모리 낭비를 방지할 수 있고, 객체를 생성하는 시간을 아낄 수 있다.
public class Singleton {
private static Singleton instance=new Singleton();//Heap영역에 인스턴스 한개만 생성해둠.
private Singleton(){}//생성자는 private으로 새로운 인스턴스 생성을 막음
//이 인스턴스를 사용하고싶으면 getInstance 메서드를 이용해서 객체의 참조값 반환
public static Singleton getInstance(){
if(instance == null){
instance = new Singleton();//혹시모를 객체 소멸을 대비해서 체크
}
return instance;
}
public void display(){
System.out.println("Hello Singleton!");
}
}
public class Main {
public static void main(String[] args) {
Singleton instance1=Singleton.getInstance();//인스턴스를 참조받음
Singleton instance2=Singleton.getInstance();//인스턴스를 참조받음
instance1.display();//인스턴스의 메서드 실행
instance2.display();//인스턴스의 메서드 실행
System.out.println(instance1==instance2);//인스턴스가 같은 인스턴스인지
}
}
/*
결과값:
Hello Singleton!
Hello Singleton!
true
*/