-> 소프트웨어를 설계할 때, 특정 맥락에서 자주 발생하는 고질적인 문제들이 발생했을 때 재사용할 수 있는 해결책.
- 프로그램 내의 여러곳에서 반복적으로 사용되어야 하는 객체에 대해 전역적인 범위를 갖도록 객체를 생성하고,
이 객체를 여러 곳에서 공유하기 위한 클래스 작성 패턴.
-> 이러한 패턴을 통해 생성된 객체를 싱글톤객체라고 한다.
1. 프로그램의 전역에서 활용할 재료로 사용되는 공유기능을 하나만 생성하여,
여러곳에서 재사용함으로써 메모리를 효율적으로 사용할 수 있다.
2. 단 한번만 객체를 생성하면 다시 객체를 생성할 필요가 없기 때문에,
해당 기능을 사용할 때마다 객체를 일일이 생성해야 하는 번거로움을 피할 수 있다.
public class Calc{
private static Calc current;
public static Calc getInstance(){ -> 객체가 할당되지 않은 경우에나 할당하도록 하여
if(current == null) { 중복 할당을 방지한다.
current = new Calc();
}
return current;
}
public static void frrInstance(){ -> 객체에 null을 대입하면 메모리에서 삭제된다.
current = null;
}
private Calc() {} -> 기본생성자를 private 형태로 정의하면 객체 생성자가 은닉처리되어
외부에서 new 연산자를 사용한 객체 할당이 금지된다.
} // Calc class
-> static이 적용된 자원은 메모리의 고정영역에 생성되기 떄문에,
클래스 자체의 객체, 멤버변수, 메소드와는 메모리 상에서 구별된다고 볼 수 있다.
-> 그러므로 Calc 클래스 안에 static형태로 Calc 클래스의 객체를 정의하더라도
코드상의 논리적인 연관관계를 위해 하나의 파일에서 정의하는 것일 뿐,
실제로는 Calc 클래스 자체에서 독립된 객체가 되는 것이다.
-> Calc 클래스 이외의 여러곳에서 new 연산자를 사용하여 객체 할당이 가능하다면
Singleton이라는 개념 자체가 성립되지 않으므로,
외부에서 이 객체에 직접적인 접근을 못하도록 은닉시킨다.
Calc c = Calc.getInstance();
-> getInstance() 메소드를 사용하여 객체를 리턴 받는 형식으로 사용한다.
-> 여러 객체를 리턴받더라도 모두 하나의 static 객체를 참조하게 되기 때문에,
전역 객체 하나만이 메모리에 할당되게 된다.