Christmas Pikachu 싱글톤 패턴 구현 방법
개발일지/디자인 패턴

싱글톤 패턴 구현 방법

ZI_CO 2024. 11. 18.

프로그래밍을 하다 보면 다양한 소프트웨어 디자인 패턴을 접하게 됩니다. 그 중에서도 싱글톤 패턴(Singleton Pattern)은 프로그램 개발에서 자주 사용되는 디자인 패턴 중 하나입니다. 이번 글에서는 자바(Java)에서 싱글톤 패턴이 무엇인지, 어떻게 구현할 수 있는지에 설명하겠습니다.

싱글톤 패턴이란?

싱글톤(Singleton)은 객체를 단 하나만 생성하여 사용하는 디자인 패턴입니다. GoF의 디자인 패턴 중 생성(Creational) 패턴에 해당하며, 프로그램에서 하나의 인스턴스를 공통으로 사용하는 경우에 자주 사용됩니다. 간단히 말해, 싱글톤 패턴은 어떤 클래스가 오직 하나의 인스턴스만 갖도록 보장하는 방식입니다.

싱글톤 패턴을 사용하는 이유

  1. 메모리와 성능 측면에서의 효율
    싱글톤을 사용하지 않으면, 특정 객체를 호출할 때마다 인스턴스를 새로 생성해야 합니다. 이렇게 하면 메모리를 많이 사용하게 되고, 생성과 소멸 과정이 반복되면서 성능에도 영향을 미칠 수 있습니다.
  2. 하지만 싱글톤 패턴을 사용하면 인스턴스를 처음에 한 번만 생성하고 이후에는 이 인스턴스를 재사용하기 때문에 메모리와 성능 측면에서 효율적입니다.
  3. 데이터 공유의 용이
    싱글톤 패턴을 사용하면 클래스 간 데이터를 공유하기가 용이해집니다. 예를 들어, 애플리케이션 전반에서 네트워크 요청을 담당하는 네트워크 관리 클래스나 설정을 저장하는 설정 관리 클래스를 싱글톤으로 만들어 사용하면 여러 클래스에서 쉽게 접근하고 데이터를 공유할 수 있습니다.

자바에서 싱글톤 패턴 구현하기

자바에서 싱글톤을 구현하는 방법은 여러 가지가 있지만, 가장 기본적인 방법을 아래에서 살펴보겠습니다.

1. 간단한 싱글톤 예시

public class Singleton {
    // 유일한 인스턴스를 저장하기 위한 정적 변수
    private static Singleton instance;

    // 생성자는 외부에서 호출할 수 없도록 private으로 설정
    private Singleton() {
        // 추가 초기화 작업이 필요하다면 여기에 작성
    }

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

위 코드에서 중요한 점은 생성자(Constructor)가 private으로 선언되어 있어 외부에서 직접 인스턴스를 생성할 수 없다는 것입니다. 오직 getInstance() 메서드를 통해서만 인스턴스를 가져올 수 있습니다. 이 방식으로 싱글톤 패턴을 구현하면 항상 하나의 인스턴스만 사용하게 됩니다.

2. Thread Safe한 싱글톤 구현

멀티 스레드 환경에서는 여러 스레드가 동시에 getInstance() 메서드를 호출해 인스턴스를 여러 개 생성할 위험이 있습니다. 이를 방지하기 위해 synchronized 키워드를 사용해 Thread Safe한 싱글톤을 구현할 수 있습니다.

public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 추가 초기화 작업이 필요하다면 여기에 작성
    }

    // Thread Safe한 싱글톤 구현
    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

synchronized 키워드를 사용하면 여러 스레드가 동시에 접근해도 인스턴스가 두 번 생성되지 않도록 보장합니다. 하지만, 이 방식은 성능에 약간의 부하가 생길 수 있다는 단점이 있습니다.

3. 이른 초기화(Eager Initialization)를 사용한 싱글톤

성능 부하를 줄이기 위해 이른 초기화(Eager Initialization) 방식을 사용할 수도 있습니다. 이 방식은 클래스가 로드될 때 인스턴스를 미리 생성해두는 방법입니다.

public class Singleton {
    // 인스턴스를 클래스가 로드될 때 생성
    private static final Singleton instance = new Singleton();

    private Singleton() {
        // 추가 초기화 작업이 필요하다면 여기에 작성
    }

    public static Singleton getInstance() {
        return instance;
    }
}

이 방식은 간단하고 Thread Safe합니다. 하지만 인스턴스가 실제로 필요하지 않더라도 클래스가 로드될 때 무조건 생성된다는 점을 유의해야 합니다.

4. 이중 검사 잠금(Double-Checked Locking)을 사용한 싱글톤

성능과 안전성을 동시에 고려한 방식으로 이중 검사 잠금(Double-Checked Locking)을 사용할 수 있습니다.

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {
        // 추가 초기화 작업이 필요하다면 여기에 작성
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

이 방식은 먼저 인스턴스가 null인지 확인한 후, synchronized 블록 안에서 다시 한 번 null인지 확인하여 필요할 때만 인스턴스를 생성합니다. 이로 인해 성능 저하를 최소화하면서도 Thread Safe한 싱글톤을 구현할 수 있습니다.

싱글톤 패턴의 장점과 주의점

장점

  1. 메모리 절약: 하나의 인스턴스만 생성하므로 메모리를 절약할 수 있습니다.
  2. 데이터 공유: 여러 클래스가 동일한 인스턴스를 공유하므로 데이터 일관성을 유지하기가 쉽습니다.

주의점

  1. 단일 책임 원칙 위반 가능성: 싱글톤이 너무 많은 역할을 담당하게 되면 단일 책임 원칙을 위반하게 될 수 있습니다.
  2. 테스트의 어려움: 싱글톤 패턴은 전역 상태를 가지므로, 테스트 환경에서 Mock 객체로 대체하기 어렵습니다.

자바에서의 싱글톤 사용 예시

자바의 여러 라이브러리에서도 싱글톤 패턴이 많이 사용됩니다. 대표적인 예로 Runtime 클래스가 있습니다.

public class SingletonExample {
    public static void main(String[] args) {
        // Runtime 클래스는 싱글톤 패턴으로 구현되어 있음
        Runtime runtime = Runtime.getRuntime();
        System.out.println("Available Processors: " + runtime.availableProcessors());
    }
}

마무리

이번 글에서는 자바에서 싱글톤 패턴을 사용하는 이유와 다양한 구현 방법에 대해 알아보았습니다. 싱글톤 패턴은 효율적인 메모리 관리와 데이터 공유의 용이성 때문에 널리 사용되지만, 잘못 사용할 경우 유지보수와 테스트가 어려워질 수 있으므로 신중히 사용하는 것이 좋습니다. 여러 구현 방식을 비교하면서 상황에 맞는 최적의 방법을 선택하는 것이 중요합니다.

'개발일지 > 디자인 패턴' 카테고리의 다른 글

싱글톤 패턴  (0) 2023.12.17

댓글