[싱글톤 패턴]
소프트웨어 디자인 패턴 중 하나인 #싱글톤 패턴 은,
생성자가 여러차례 호출되어도 실제로 생성되는 객체는 하나이며,
최초 생성 이후 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴하는 것.
즉, 하나의 클래스에 하나의 객체를 생성하도록 하는 패턴.
[장점]
1. 메모리 측면의 이점
> 1개의 인스턴스만을 고정 메모리 영역에 생성하므로, 메모리 낭비를 방지 가능
2. 객체의 유일성을 보장
3. 속도 측면의 이점
> 생성된 인스턴스를 사용할 때는 이미 생성된 인스턴스를 활용하므로 속도에 있어서 빠르다.
4. 데이터 공유의 이점
> 싱글톤이 적용된 클래스의 인스턴스는 #전역 인스턴스라 다른 클래스의 인스턴스들과 데이터 공유가 쉽다.
[단점]
1. #전역 인스턴스 이므로 다른 클래스의 인스턴스와 의존성이 높아진다.
2. 수정, 테스트가 어렵고, 유지보수 비용이 높아진다.
3. 멀티쓰레드 환경에서 동시성 문제가 발생할 수 있다.
> 대비책
A. static을 사용하여 싱글톤 인스턴스 및 메서드 생성.
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
위의 예제 코드처럼 static 을 사용하여 변수를 생성하고 static 메서드를 생성하면
static 변수는 객체가 생성되기 전, 클래스가 메모리에 로딩될 때 생성되어
프로그램이 종료될 때 까지 유지되어 모든 객체에서 참조할 수 있기 때문에
#멀티쓰레드 환경에서도 다른 객체를은 getInstance() 메서드를 통해 동일한 인스턴스를 공유할 수 있다.
B. synchronized 처리
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronzied Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
1. private static으로 인스턴스 변수를 생성.
2. private으로 생성자를 만들어 외부에서의 생성을 방지.
3. static 메서드를 생성할 때 synchronized 동기화를 활용해 스레드를 안전하게 만듬.
하지만 동기화의 경우 Thread-safe를 보장하기 위해 성능 저하를 유발하여 권장되지 않음.
[결론]
#싱글톤 패턴의 경우 메모리, 속도, 데이터 공유 측면에서의 이점이 있지만,
#멀티쓰레드 환경에서는 동시성 문제가 발생할 수 잇기 때문에,
#싱글톤 패턴을 적용하기 전,
"해당 객체의 인스턴스는 반드시 1개만 존재해야하나?" 와 "사용했을 때, 동시성 문제가 발생하지 않는가?"
를 잘 체크해보고 사용을 해야한다.
'백엔드 기술 > Java' 카테고리의 다른 글
Optional<T> 클래스란 ? (0) | 2023.04.21 |
---|---|
Multi-Thread & Multi Process (0) | 2023.04.20 |
컴파일(Compile)과 런타임(Runtime) (0) | 2023.04.20 |
Java - Generic 제네릭이란 ? (0) | 2023.04.20 |
컬렉션과 스트림의 차이 (0) | 2023.04.19 |