text/Java
싱글턴 패턴 (Singleton pattern) 간단 정리
hoonzii
2023. 3. 14. 00:30
반응형
싱글턴 패턴 정리
목차
1. 싱글턴 패턴이 뭔지?
2. 왜 쓰나요? 언제 쓰나요?
3. 어떤 문제가 있나요?
4. 코드로 살펴보자
5. 해당 singleton 패턴을 사용하는 java library 소개
6. 참고
싱글턴 패턴이 뭔지?
싱글턴 패턴은 객체 지향 디자인 패턴 중 하나로,
어떤 클래스의 인스턴스가 오직 하나임을 보장하는 패턴이다.
이 패턴은 전역 변수를 사용하여 클래스의 인스턴스를 저장하고,
해당 클래스의 인스턴스를 생성하는 메소드를 제공,
이렇게 하면 언제 어디서든지 해당 클래스의 인스턴스에 접근할 수 있다.
왜 쓰나요? 언제 쓰나요?
- 왜 쓰나요?
- 전역 변수를 사용하지 않고도 하나의 인스턴스만 생성
- 다수의 스레드에서 동시에 접근하더라도 안전하게 사용
- 인스턴스를 생성하는 비용이 큰 경우, 프로그램의 성능을 향상
- 언제 쓰나요?
- 어떤 클래스의 인스턴스가 오직 하나만 존재해야 하는 경우 (ex. 데이터베이스 연결, 로깅, 캐시 등의 용도)
어떤 문제가 있나요?
- 프로그램 구조를 복잡하게 만들 수 있음…(인스턴스가 생성되기 전까지는 다른 클래스에서 접근할 수 없으므로)
- 전역 변수와 마찬가지로 인스턴스가 계속해서 메모리를 차지하고 있으므로, 메모리 누수가 발생 가능
- 단일 책임 원칙 위배 (전역으로 사용되기에 변화에 민감)
- 해당 객체의 유닛 테스트 수행이 어렵다. (역시, 전역으로 설정되어 사용되기 때문에!)
- 다중 스레드 환경에서 객체 생성 시 주의 필요
코드로 살펴보자
- 싱글턴 패턴을 구현하는 방법은 여러 가지가 있지만, 가장 기본적인 방법은 아래와 같다.
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 소개
(나는 안 써봤고, 써보기 전까지 찾아보지 않을 테야…)
- java.lang.Runtime#getRuntime()
- java.awt.Desktop#getDesktop()
- java.lang.System#getSecurityManager()
참고
- 정리 0) https://refactoring.guru/ko/design-patterns/singleton
- 3번 문제해결 시) https://gyoogle.dev/blog/design-pattern/Singleton Pattern.html
- 정리 1) https://tecoble.techcourse.co.kr/post/2020-11-07-singleton/
- when singleton pattern used?) https://stackoverflow.com/questions/228164/on-design-patterns-when-should-i-use-the-singleton
- oop 패턴에 따른 자바 라이브러리)https://stackoverflow.com/questions/1673841/examples-of-gof-design-patterns-in-javas-core-libraries/2707195#2707195
반응형