싱글톤
싱글톤 개념
- 싱글톤은 하나의 클래스 인스턴스를 전역적으로 공유하기 위한 디자인 패턴으로, 해당 클래스의 인스턴스가 오직 하나만 생성되고 어디서든 접근 가능하도록 보장한다.
- 클래스 내부에서 생성자를 private으로 선언하고, 유일한 인스턴스를 반환하는 정적 메서드를 제공한다.
- 다수의 객체 생성을 피하고 공유 리소스를 효율적으로 활용하는 패턴이다.
※디자인 패턴: 소프트웨어를 보다 모듈화하고 확장가능하며 유지보수가 쉽도록 만드는 해결책을 정리한 것이다
싱글톤 생성
예제 -> 문제점 -> 새로운 예시를 드는 방식으로 설명하겠다
public class Singleton {
private static Singleton uniqueInstance; //하나뿐인 정젹 변수로 객체 선언
private Singleton(){} //생성자 private으로 선언해서 외부에서 못만들게함
public static Singleton getInstance(){
if(uniqueInstance == null){ //객체가 없으면 싱글톤 객체 생성
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
⇒ 문제점: 멀티 쓰레드 상황에서 문제가 생기는데 이유는 만일 2개의 쓰레드가 getInstance() 메서드에 접근했는데 둘다 null이 반환되어 생성하게 되면 2개의 객체가 생성되어버린다.
⇒ 멀티쓰레드 해결법: 메서드에 synchronized를 추가하게되면 한 스레드가 메소드 사용을 끝내기 전까지 다른 스레드는 기다려야한다.
public class Singleton {
private static Singleton uniqueInstance; //하나뿐인 정젹 변수로 객체 선언
private Singleton(){} //생성자 private으로 선언해서 외부에서 못만들게함
public static synchronized Singleton getInstance() {
if (uniqueInstance == null) { // 객체가 없으면 싱글톤 객체 생성
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
}
⇒ 문제점: 동기화할때 시간이 더 걸려버림
=>동기화문제점 해결법: 미리 정적 초기화부분에서 인스턴스 생성
public class Singleton {
//private static Singleton uniqueInstance; //하나뿐인 정젹 변수로 객체 선언
private static Singleton uniqueInstance = new Singleton(); //정적 초기화 부분에서 Singleton 인스턴스를 생성한다.
private Singleton(){} //생성자 private으로 선언해서 외부에서 못만들게함
public static Singleton getInstance(){ //위에 객체 생성했으므로 synchronized 삭제가능
/*
if(uniqueInstance == null){ //객체가 없으면 싱글톤 객체 생성
uniqueInstance = new Singleton();
}
*/
return uniqueInstance;
}
}
궁금한 점과 결론
궁금했던 것
- 모든 메소드와 변수가 static으로 선언한 클래스를 만들어도 되지 않나요?
- 부분적으로는 맞을 수 있다. 필요한 내용이 클래스에 모두 들어있고, 복잡한 초기화가 필요없는 경우면 가능하다
- ‘느슨한 결합’ 싱글톤은 느슨한 결합 원칙에 위배되지 않나요?
- 싱글턴 패턴의 문제점으로 종종 제기되는 내용이다. 싱글턴을 바꾸면 연결된 모든 객체도 바꿔야 될 가능성이 높다.
결론
- 멀티스레딩 환경에서 전통적인 형태의 싱글턴 구현은 문제가 생길 수가 있다.
- 따라서 정적 변수를 활용했고, 정적 변수 선언시에 값을 할당해서 활용한다
- 복수개의 스레딩이 접근하는 부분을 synchrized를 활용해서 해결한다
- DCL(Double-checked Locking)방식을 통해 동기화되는 부분을 줄인다
'디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 템플릿 메서드 패턴 (1) | 2023.12.01 |
---|---|
[디자인패턴] 데커레이터 패턴 (0) | 2023.12.01 |
[디자인패턴] 옵저버 패턴 (0) | 2023.10.31 |
[디자인패턴] 커맨드 패턴 (0) | 2023.10.29 |
[디자인패턴]빌더 패턴 (0) | 2023.10.12 |