본문 바로가기

이펙티브 자바

[이펙티브 자바] 아이템 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

싱글턴(Singleton) : 인스턴스를 오직 하나만 생성할 수 있는 클래스

싱글턴 패턴 : 특정 클래스의 인스턴스가 오직 하나만 생성되어서 전역적으로 접근 가능하도록 보장하는 패턴이다.

이 패턴은 전역 상태를 관리하거나, 자원 관리, 로깅, 드라이버 객체 등 한 번의 인스턴스 생성으로 충분한 경우에 주로 사용된다. 

싱글턴을 만드는 방식은 크게 2가지가 있다.

1. Private 생성자를 이용한 방식

2. Enum(열거형)을 이용한 방식

 

열거 타입을 이용한 방식의 예시 : 

public enum Singleton {
    INSTANCE;

    public void doSomething() {
        // 싱글턴 인스턴스가 할 작업 구현
    }
}

 

더 자세한 예시 : 

public enum DatabaseConnection {
    INSTANCE; // Enum 싱글턴의 인스턴스 선언. JVM은 이 인스턴스를 유일하게 관리합니다.

    private Connection connection; // 데이터베이스 연결 객체를 저장할 변수.

    // Enum의 생성자. Enum 인스턴스가 생성될 때 (즉, JVM이 시작할 때) 한 번만 호출됩니다.
    DatabaseConnection() {
        // 여기에서 데이터베이스 연결을 설정합니다. 실제 환경에서는 이 부분에
        // 데이터베이스 연결을 위한 JDBC URL, 사용자 이름 및 비밀번호 등이 포함됩니다.
        try {
            // DriverManager.getConnection을 사용하여 데이터베이스 연결을 초기화합니다.
            // 이 예제에서는 연결 정보를 가정하고 있으며, 실제 정보로 대체해야 합니다.
            this.connection = DriverManager.getConnection("jdbc:yourDatabaseUrl", "username", "password");
        } catch (SQLException e) {
            // 데이터베이스 연결 설정 중 예외가 발생한 경우, 예외를 던집니다.
            // 이를 통해 초기화 실패를 알리고, 애플리케이션 시작을 중단할 수 있습니다.
            throw new RuntimeException("Database connection setup failed", e);
        }
    }

    // 데이터베이스 연결 객체를 반환하는 메서드.
    // 이 메서드를 통해 어디서든 데이터베이스 연결을 사용할 수 있습니다.
    public Connection getConnection() {
        return this.connection;
    }

    // 데이터베이스 연결을 안전하게 닫는 메서드.
    // 애플리케이션 종료 시 또는 더 이상 데이터베이스 연결이 필요 없을 때 호출합니다.
    public void closeConnection() {
        if (this.connection != null) {
            try {
                this.connection.close();
            } catch (SQLException e) {
                // 연결 닫기 시도 중 예외 처리.
                // 예외 처리 로직에 따라 로깅 또는 다른 조치를 취할 수 있습니다.
            }
        }
    }
}

 

결론 : 대부분의 상황에서는 원소가 하나뿐인 열거 타입이 싱글턴을 만드는 가장 좋은 방법이다.