JAVA

[JAVA]Singleton 패턴

당고개 2023. 11. 17. 20:16

Singleton Pattern은 인스턴스 생성 패턴 중 하나로 인스턴스를 한 번 생성하고 인스턴스의 내용을 여러 메서드에서 공유하여 사용할 수 있는 패턴입니다.

public class Configuration {

    private static Configuration configuration;

    private Configuration() {
    }
 
    public static Configuration getInstance() {
        if (null == configuration) {
            configuration = new Configuration();
        }
        return configuration;
    }
}

Singleton Patternnew 키워드로 인스턴스를 생성하지 못하게 함과 동시에 인스턴스를 생성할 수 있는 특정 정적 메서드를 통해서만 인스턴스를 생성하도록 하고 생성된 인스턴스는 정적 변수에 저장하여 인스턴스에 접근할 수 있도록 합니다.

인스턴스를 생성하는 방법은 Configuration.getInstance() 를 통해서만 생성할 수 있으며 configuration 정적 변수null일 경우 생성자를 통해 인스턴스를 생성합니다.

Configuration configuration1 = Configuration.getInstance();
System.out.println(configuration1);
// 동일한 해시코드 Configuration@610455d6

Configuration configuration2 = Configuration.getInstance();
System.out.println(configuration2);
// 동일한 해시코드 Configuration@610455d6

여러번의  Configuration.getInstance() 호출에도 동일한 인스턴스의 참조 값을 반환하기 때문에 인스턴스를 생성함에 따른 메모리 공간을 절약할 수 있습니다.

singleton 클래스

public 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;
    }
}
Configuration configuration1 = Configuration.getInstance();
System.out.println(configuration.getCafeName());
// 출력 "카페"

System.out.println(configuration.getCafeAddress());
// 출력 "저 먼나라 주소"

인스턴스 변수를 선언하여 사용하거나 메서드를 정의하여 일반적인 클래스처럼 사용할 수 있습니다.

singleton아닌 클래스

public class Configuration {

    private static String cafeName = "카페";
    private static String cafeAddress = "저 먼나라 주소";

    public static String getCafeName() {
        return cafeName;
    }

    public static String getCafeAddress() {
        return cafeAddress;
    }
}
System.out.println(Configuration.getCafeName());
// 출력 "카페"

System.out.println(Configuration.getCafeAddress());
// 출력 "저 먼나라 주소"

결과만 놓고 보면 Singleton Pattern 으로 만들어진 인스턴스와 정적 변수, 정적 메서드와 큰 차이가 없어보입니다.

다만 차이점은 인스턴스 지연 생성(Lazy Load) 입니다.

정적 변수와 정적 메서드는 Method Area에 저장되며 프로그램 시작 시 메모리에 할당되고 적재된다고 했었습니다. 그 말은 해당 정적 변수나 정적 메서드를 프로그램에서 사용하지 않는다 하더라도 메모리 공간을 차지하게 됩니다.

그러나 Singleton Pattern은 호출 하지 않는다면 최소 인스턴스의 참조 값을 저장하는 configuration 정적 변수와 인스턴스를 생성하기 위한 Configuration.getInstance() 정적 메서드만 메모리에 할당됩니다.

진짜 필요할 때 Configuration.getInstance() 를 호출 하여 최초 메모리에 할당하는 지연 생성(Lazy Load) 이라는 차이점이 있습니다.

또한 이렇게 까지는 하지 않지만 configuration 정적 변수에 저장된 인스턴스의 참조 값을 null로 바꾸어 Heap 메모리에 저장된 Configuration 인스턴스를 Garbage Collector가 수집할 수 있도록 할 수 있습니다.

Singleton 인스턴스 해제

public class Configuration {

    private static Configuration configuration;

    …

    public void free() {
        configuration = null;
    }

    …
}
Configuration configuration = Configuration.getInstance();
…

configuration.free();

Singleton Pattern 클래스로 좀 더 유동적으로 메모리를 사용할 수 있기 때문에 정적 변수와 정적 메서드와는 차이가 있습니다.

 

 

 

 

출처 : https://www.codelatte.io/courses/java_programming_basic/EF27ZVVHZZI7SKWY

'JAVA' 카테고리의 다른 글

[JAVA]Collection - List  (0) 2023.11.23
[JAVA]<제네릭>  (0) 2023.11.17
[JAVA]enum  (0) 2023.11.15
[JAVA]예외처리  (0) 2023.11.10
[JAVA]null  (0) 2023.11.09