싱글톤 패턴

김지수·2023년 6월 30일

싱글톤 패턴은 객체 지향 소프트웨어 디자인 패턴 중 하나로,
어떤 클래스의 인스턴스가 하나만 생성되고, 그 인스턴스에 대한 전역적인 접근이 가능하도록 하는 패턴이다.

싱글톤 패턴의 특징


1. 인스턴스의 유일성

싱글톤 패턴은 클래스의 인스턴스가 하나만 생성되도록 보장한다.
이를 통해 어디서든 동일한 인스턴스에 접근할 수 있으며, 객체의 일관성을 유지할 수 있다.

2. 전역적인 접근 가능성

싱글톤 패턴을 사용하면 어디서든 인스턴스에 접근할 수 있다.
전역적인 접근을 가능하게 함으로써 객체의 상태를 공유하거나 중요한 자원에 대한 접근을 제어할 수 있다.

싱글톤 패턴 구현 방법


싱글톤 패턴을 구현하는 방법은 일반적으로 다음과 같은 단계를 따른다.

  1. 생성자의 접근 제한

    클래스의 생성자를 private으로 선언하여 외부에서의 인스턴스 생성을 막습니다.

  2. 인스턴스 변수 선언

    클래스 내부에 유일한 인스턴스를 저장할 private static 변수를 선언합니다.

  3. 인스턴스 생성 메서드 구현

    인스턴스를 생성하고 반환하는 public static 메서드를 구현한다.
    이 메서드는 내부에서 인스턴스가 이미 생성되었는지 확인하고,
    생성되어 있지 않은 경우에만 인스턴스를 생성하여 반환한다.

일반적으로 싱글톤 패턴은 다중 스레드 환경에서 안전한 방식으로 구현해야 한다.

동시에 여러 스레드가 싱글톤 인스턴스를 생성하려는 경우, 인스턴스가 중복 생성될 수 있으므로 동기화 처리나 초기화 순서 등에 주의해야 한다.

싱글톤 패턴은 객체의 인스턴스를 하나로 제한하고, 전역적인 접근이 가능하도록 하는 장점이 있지만, 오용될 경우 의존성과 테스트 등에 문제를 일으킬 수 있으므로 사용할 때 주의가 필요하다.

싱글톤 패턴 구현 예제

public class Singleton {
    private static Singleton instance;

    // private 생성자
    private Singleton() {
        // 생성자 내용
    }

    // 인스턴스 반환 메서드
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }

    // 기타 메서드
    public void showMessage() {
        System.out.println("Hello, World!");
    }
}

위의 예제에서는 Singleton 클래스를 싱글톤으로 구현했다.

클래스 내에 private static 변수 instance를 선언하여 유일한 인스턴스를 저장한다.

생성자인 private Singleton()은 외부에서의 인스턴스 생성을 막기 위해 private으로 선언되었다.
이로써 외부에서 new Singleton()으로 인스턴스를 생성할 수 없다.

public static Singleton getInstance() 메서드는 싱글톤 인스턴스를 반환하는 메서드다.

처음 호출되는 시점에서 instance 변수가 null인 경우에만 인스턴스를 생성하고 반환한다.
이미 인스턴스가 생성된 이후에는 기존의 인스턴스를 반환한다.

사용 예시

public class Main {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
        singleton.showMessage();
    }
}

Singleton.getInstance()를 통해 싱글톤 인스턴스를 얻고,
해당 인스턴스의 메서드인 showMessage()를 호출하고 있다.

이렇게 하면 Singleton 클래스의 인스턴스가 하나만 생성되고, 전역적으로 접근할 수 있게 된다.

Default Constructor


싱글톤 패턴에서는 디폴트 생성자(default constructor)가 외부에서 호출되지 않도록 막는 것이 일반적이다.

일반적인 싱글톤 패턴의 구현에서는 생성자를 private으로 선언하여 외부에서의 인스턴스 생성을 막는다.
이렇게 하면 외부에서 직접 생성자를 호출할 수 없고, 싱글톤 클래스 내부에서만 인스턴스를 생성할 수 있다.

따라서, 싱글톤 패턴에서는 1. 디폴트 생성자를 제공하지 않거나,
2. private으로 선언하여 외부에서 호출할 수 없도록 제한하는 것이 좋다.

이렇게 함으로써 싱글톤 객체의 유일성을 보장하고, 외부에서의 무분별한 인스턴스 생성을 방지할 수 있다.

그러나 예외적인 경우에는 매개변수가 없는 디폴트 생성자가 필요한 경우가 있을 수 있다.

예를 들어, 싱글톤 객체가 외부 라이브러리와 상호작용하거나, 테스트를 위해 객체를 모의(mock)하는 경우 등이다. 이런 경우에는 디폴트 생성자를 추가할 수 있지만, 일반적인 사용에서는 싱글톤 패턴에서는 디폴트 생성자를 피하는 것이 바람직하다.

싱글톤 패턴을 언제 사용할까?


1. 리소스 공유

여러 개의 객체가 동일한 리소스에 접근해야 할 때 싱글톤 패턴을 사용할 수 있다.
예를 들어, 데이터베이스 연결, 로깅 객체, 캐시 등의 리소스를 하나의 인스턴스로 관리하면 리소스의 중복 생성 및 낭비를 줄일 수 있다.

2. 전역 상태 관리

여러 객체가 공유 상태를 유지해야 하는 경우 싱글톤 패턴을 사용할 수 있다.
예를 들어, 애플리케이션 설정 정보, 사용자 세션 정보, 로그인 상태 등을 싱글톤 객체로 관리하면 여러 객체 간에 공유된 상태를 쉽게 접근하고 관리할 수 있다.

3. 중요한 자원의 제어

특정 클래스의 인스턴스가 하나만 존재해야 하는 경우 싱글톤 패턴을 사용할 수 있다.
예를 들어, 스레드 풀, 파일 시스템, 시스템 설정 등 중요한 자원을 싱글톤 객체로 관리하면 자원의 오용을 방지하고 일관된 제어를 할 수 있다.

요약

  • 싱글톤 패턴은 객체의 인스턴스를 하나로 제한하고, 전역적인 접근이 가능하도록 하는 디자인 패턴
  • 객체 생성과 관리에 대한 일관성과 효율성 제공 가능
  • 너무 남발되거나 부적절하게 사용될 경우 코드의 유지보수성이 감소할 수 있으므로, 주의 필요
profile
안녕하세요

0개의 댓글