싱글톤 패턴은 특정 클래스에 대한 인스턴스를 단 한 번만 static 메모리 영역에 할당하고 해당 클래스에 대한 생성자를 여러 번 호출하더라도 최초에 생성된 객체를 반환하는 디자인 패턴입니다. 즉 어플의 특정 클래스에 대한 유일 객체를 보장하는 디자인 형태라고 볼 수 있습니다.
일반적으로 싱글톤 패턴이 적용된 클래스에 대한 new 연산을 수행하더라도 이미 한 번 할당된 메모리 영역의 인스턴스를 사용하기 때문에 무분별한 new 연산으로 인한 메모리 낭비를 방지할 수 있습니다.
장점
-한 번의 객체 생성으로 여러 클래스가 공유할 수 있기 때문에 메모리 낭비를 방지할 수 있으며, 다른 객체와 공유할 수 있다는 장점이 있습니다. 또한 두번째 호출부터는 객체 로딩 시간이 줄어들어 성능이 향상됩니다.
단점
-싱글톤을 남용하면 쓸데없이 자원을 차지하고, GC가 자원을 회수하지 못해 메모리 자원이 줄어든다. 또한 싱글톤 클래스에 과도한 데이터를 집어넣고 여러 클래스들이 공유하게 될 경우 결합도는 높아지게 되고, 객체지향의 원칙인 ‘개방,폐쇄의 원칙’을 위배하게 됩니다. 결합도가 높아진 싱글톤은 유닛 테스트에도 좋지 않습니다.
언제 사용하나?
여러 객체를 관리하는 역할의 객체를 하나의 인스턴스로 생성 후 사용하는 것이 좋습니다. ex) Connection Pool, Logging, Thread Pool 등....
간단한 예제입니다. 싱글톤 클래스를 만들고 객체가 같은지 비교하는 예제입니다.
public class Singleton {
private String name;
private static Singleton instance;
public static Singleton getInstance() {
if(instance==null) {
instance = new Singleton();
}
return instance;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name=name;
}
}
public class Main {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getInstance();
Singleton singleton2 = Singleton.getInstance();
//주소
System.out.println(singleton1);
System.out.println(singleton2);
if(singleton1==singleton2) System.out.println("같은 객체입니다.");
else System.out.println("다른객체입니다.");
//singleton1에서 setName으로 name을 변경하고
//singleton2 getName으로 name을 불러왔을 때
//싱글톤으로 출력된 것을 확인할 수 있습니다.
singleton1.setName("싱글톤");
System.out.println(singleton2.getName());
}
}
결과
싱글톤.Singleton@52cc8049
싱글톤.Singleton@52cc8049
같은 객체입니다.
싱글톤
참고
https://ikkison.tistory.com/29