1. Singleton 패턴
인스턴스 생성 패턴 중 하나로 인스턴스를 한 번 생성하고
인스턴스의 내용을 여러 메서드에서 공유하여 사용할 수 있는 패턴입니다.
(1) new 키워드로 인스턴스를 생성하지 못하게 함과
동시에 인스턴스를 생성할 수 있는 특정 정적 메서드를 통해서만 인스턴스를 생성하도록 하고
생성된 인스턴스는 정적 변수에 저장하여 인스턴스에 접근할 수 있도록 합니다.
(2) 인스턴스를 생성하는 방법은 Configuration.getInstance() 를 통해서만 생성할 수 있으며
configuration 정적 변수가 null일 경우 생성자를 통해 인스턴스를 생성합니다.
(3) 여러번의 Configuration.getInstance() 호출에도
동일한 인스턴스의 참조 값을 반환하기 때문에 인스턴스를 생성함에 따른 메모리 공간을 절약할 수 있습니다.
* Singleton 패턴 형식 코드
class Configuration {
private static Configuration configuration;
private Configuration() { }
public static Configuration getInstance() {
if (null == configuration) {
configuration = new Configuration();
}
return configuration;
}
}
public class Main {
public static void main(String[] args) {
Configuration configuration1 = Configuration.getInstance();
Configuration configuration2 = Configuration.getInstance();
System.out.println(configuration1);
System.out.println(configuration2);
}
}
* 결과
setup17.Configuration@1d251891
setup17.Configuration@1d251891
2번의 Configuration.getInstance() 호출을 했지만 동일한 인스턴스의 참조 값을 반환해주었다.
2. 예시
class Configuration {
private static Configuration configuration;
private String cafeName = "카페";
private String cafeAddress = "저 먼나라 주소";
private Configuration() { }
public static Configuration getInstance() {
if (null == configuration) {
configuration = new Configuration();
}
return configuration;
}
public String getCafeName() {
return cafeName;
}
public String getCafeAddress() {
return cafeAddress;
}
}
public class Main {
public static void main(String[] args) {
Configuration configuration = Configuration.getInstance();
System.out.println(configuration.getCafeName());
System.out.println(configuration.getCafeAddress());
}
}
* 결과
카페
저 먼나라 주소
3. Singleton 패턴을 사용했을 때 장점
결과만 놓고 보면
Singleton Pattern으로 만들어진 인스턴스와 정적 변수, 정적 메서드와 큰 차이가 없어보입니다.
(1) 다만 차이점은 인스턴스 지연 생성(Lazy Load) 입니다.
정적 변수와 정적 메서드는 Method Area에 저장되며 프로그램 시작 시 메모리에 할당되고 적재된다.
그 말은 해당 정적 변수나 정적 메서드를 프로그램에서 사용하지 않는다 하더라도 메모리 공간을 차지하게 됩니다.
그러나 Singleton Pattern은 호출 하지 않는다면
최소 인스턴스의 참조 값을 저장하는 configuration 정적 변수와 인스턴스를 생성하기 위한Configuration.getInstance() 정적 메서드만 메모리에 할당됩니다.
진짜 필요할 때 Configuration.getInstance()를 호출 하여 최초 메모리에 할당하는 지연 생성(Lazy Load) 이라는 차이점이 있습니다.
(2) 또한 이렇게 까지는 하지 않지만
configuration 정적 변수에 저장된 인스턴스의 참조 값을 null로 바꾸어 Heap 메모리에 저장된 Configuration 인스턴스를 Garbage Collector가 수집할 수 있도록 할 수 있습니다.
댓글