본문 바로가기
프로그래밍/디자인 패턴

[java/Design Pattern] 싱글톤의 Early 초기화

by 사바라다 2020. 11. 29.

안녕하세요. 이전시간에 저희들은 싱글톤의 Lazy 초기화에 대해서 알아보는 시간을 가졌었습니다. 포스팅에서 싱글톤 객체의 초기화 시점에는 Lazy와 Early가 있다고 말씀드렸었는데요. 오늘은 Eager 시점의 초기화에 대해서 알아보는 시간을 가져보도록 하겠습니다. 먼저 저번 포스팅에서 말씀드린 객체 초기화 방법에 대해서 다시한번 보겠습니다.

  • Eager initialization: 클래스 인스턴스 생성을 실제로 사용되기전에 먼저 진행
    • Static block initialization
    • Enum singleton
  • Lazy initialization: 클래스 인스턴스의 생성을 처음 실제로 사용될 때 진행
    • Thread safe singleton
    • Bill Pugh singleton

Eager initialization

아래의 방법은 가장 쉽게 싱글톤으로 객체를 생성할 수 있는 방법입니다. 아래처럼 클래스를 구성하면 Government 클래스가 로드될 시점에 government 인스턴스가 메모리에 올라오며 싱글톤 객체가 됩니다. 이 방법은 싱글톤을 만들 수 있는 가장 간단한 방법입니다. 하지만 이렇게 인스턴스를 생성했을 때는 생성시 예외처리의 불가능, 경우에 따라 추가적인 설정 불가능 등의 단점을 가지고 있습니다.

public class Government {

    private static Government government = new Government();

    private Government() {}

    public static Government election() {
        return government;
    }
}

static block initialization

static block initialization은 기본적인 Eager Initialization의 단점이었던 인스턴스 생성에 대한 예외처리, 추가적인 설정 등을 할 수 있습니다. static block은 class가 메모리(Method)에 올랐을 때 1번 실행되게 됩니다. static block은 non-static 한 코드에는 접근 할 수 없으며 static 변수에는 접근할 수 있습니다. 사용방법은 아래와 같습니다.

public class Government {

    private static Government government;
    static {
        try {
            government = new Government();
        } catch (Exception e) {
            throw new RuntimeException("Exception occured in creating singleton instance");
        }
    }

    private Government() {}

    public static Government election() {
        return government;
    }
}

Enum singleton

Effective java로 유명한 Joshua Bloch 또한 싱글톤의 초기화에 대해서 제안을 한 것이 있습니다. 그게 바로 Enum을 이용한 싱글톤입니다. Java Enum은 어디서나 접근할 수 있고 한번만 초기화 된다는 점을 가져와 이에 적용한 것입니다. 사용방법은 아래와 같습니다.

public enum Government {

    government;

    public static void do() {
        // 메서드 내용
    }
}

마무리

오늘은 이렇게 싱글톤의 Eager 초기화에 대해서 알아보았습니다. 만약에 싱글톤 클래스가 많은 리소스를 요구하지 않는다고 하면 Eager 초기화 역시 괜찮습니다. 하지만 리소스가 많이 든다고하면 실제로 사용할때 까지는 초기화 하지 않고 기다리는게(Lazy) 성능적으로 이득이 많습니다.

사실 File System, Database connections 등등 싱글톤으로 많이 사용되는 것들은 대체로 무겁습니다. 따라서 이들은 보통 Lazy 하게 초기화를 많이 해주죠.

본인이 사용하려고 하는 용도와 리소스를 잘 파악해서 경우에 맞게 초기화해주시는게 베스트입니다.

감사합니다.

참조

journaldev_java-singleton-design-pattern-best-practices-examples

journaldev_static-keyword-in-java

댓글