text/Java

싱글턴 패턴 (Singleton pattern) 간단 정리

hoonzii 2023. 3. 14. 00:30
반응형

싱글턴 패턴 정리

목차
1. 싱글턴 패턴이 뭔지?
2. 왜 쓰나요? 언제 쓰나요?
3. 어떤 문제가 있나요?
4. 코드로 살펴보자
5. 해당 singleton 패턴을 사용하는 java library 소개
6. 참고

싱글턴 패턴이 뭔지?

싱글턴 패턴은 객체 지향 디자인 패턴 중 하나로,

어떤 클래스의 인스턴스가 오직 하나임을 보장하는 패턴이다.

이 패턴은 전역 변수를 사용하여 클래스의 인스턴스를 저장하고,

해당 클래스의 인스턴스를 생성하는 메소드를 제공,

이렇게 하면 언제 어디서든지 해당 클래스의 인스턴스에 접근할 수 있다.

 

왜 쓰나요? 언제 쓰나요?

  1. 왜 쓰나요?
    1. 전역 변수를 사용하지 않고도 하나의 인스턴스만 생성
    2. 다수의 스레드에서 동시에 접근하더라도 안전하게 사용
    3. 인스턴스를 생성하는 비용이 큰 경우, 프로그램의 성능을 향상
  2. 언제 쓰나요?
    1. 어떤 클래스의 인스턴스가 오직 하나만 존재해야 하는 경우 (ex. 데이터베이스 연결, 로깅, 캐시 등의 용도)

 

어떤 문제가 있나요?

  1. 프로그램 구조를 복잡하게 만들 수 있음…(인스턴스가 생성되기 전까지는 다른 클래스에서 접근할 수 없으므로)
  2. 전역 변수와 마찬가지로 인스턴스가 계속해서 메모리를 차지하고 있으므로, 메모리 누수가 발생 가능
  3. 단일 책임 원칙 위배 (전역으로 사용되기에 변화에 민감)
  4. 해당 객체의 유닛 테스트 수행이 어렵다. (역시, 전역으로 설정되어 사용되기 때문에!)
  5. 다중 스레드 환경에서 객체 생성 시 주의 필요

 

코드로 살펴보자

  • 싱글턴 패턴을 구현하는 방법은 여러 가지가 있지만, 가장 기본적인 방법은 아래와 같다.
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}
  • 위 코드에서는 Singleton 클래스의 인스턴스를 저장하는 전역 변수인 instance를 private static으로 선언,
    이렇게 선언하면 Singleton 클래스의 인스턴스는 getInstance() 메소드를 통해서만 접근 가능하다.
  • getInstance() 메소드는 전역 변수 instance가 null인 경우에만 인스턴스를 생성하고,
    그렇지 않은 경우에는 기존의 인스턴스를 반환한다.

위 코드의 경우, 멀티 스레드 환경에서 객체 생성이 단 1개만 된다는 보장이 없다는 문제점이 있다.

단 한 개의 instance를 보장하기 위해 코드를 고쳐보자면

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

synchronized 키워드를 사용해 스레드 동기화를 시키는 방법이 있다.

 

또 다른 예시로는 아예 처음부터 초기화 후, (이땐 JVM이 관리) 사용하는 방법도 있다.

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {}

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

 

해당 singleton 패턴을 사용하는 java library 소개

(나는 안 써봤고, 써보기 전까지 찾아보지 않을 테야…)

  1. java.lang.Runtime#getRuntime()
  2. java.awt.Desktop#getDesktop()
  3. java.lang.System#getSecurityManager()

 

참고

반응형