싱글톤(Singleton)
전역 변수를 사용하지 않고 객체를 하나만 생성 하도록 하고, 생성된 객체를 어디에서든지 참조할 수 있도록 하는 패턴
클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다.
주의사항
- 객체 인스턴스를 2개 이상 생성하지 못하도록 막아야 한다.
-> private 생성자를 사용해서 외부에서 임의로 new 키워드를 사용하지 못하도록 막아야 한다. - 다중 스레드에서 경합 조건(Race Condition)이 발생해 인스턴스가 2개 이상 생성되는 경우를 막아야 한다.
아래 코드는 위 주의사항을 잘 지킨 예시이다.
public class SingletonService {
private static final SingletonService instance = new SingletonService();
public static SingletonService getInstance() {
return instance;
}
private SingletonService() {}
}
- static 영역에 객체 'instance'를 미리 하나 생성해서 올려둔다.
- 이 객체 인스턴스가 필요하면 'getInstance()' 메서드를 통해서만 조회할 수 있다.
이 메서드를 호출하면 항상 같은 인스턴스를 반환한다. - 딱 1개의 객체 인스턴스만 존재해야 하므로, 생성자를 private으로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는것을 막는다.
싱글톤 패턴을 구현하는 방법은 여러가지가 있다.
위 코드에서는 객체를 미리 생성해두는 가장 단순하고 안전한 방법을 선택했다.
아래 코드는 주의사항을 잘 지킨 또 다른 예시 코드이다.
public class SingletonService {
private static SingletonService instance = null;
public static synchronized SingletonService getInstance() {
instance = new SingletonService();
return instance;
}
private SingletonService() {
}
}
- static 영역의 'instance' 객체를 null로 지정해둔다.
- 'getInstance()' 메서드로 'instance'객체를 가져올 수 있다.
이때 경합 조건의 발생을 막기위해 synchronized를 사용해서 메서드를 동기화 시켜준다. - 마찬가지로 생성자를 private으로 막아서 혹시라도 외부에서 new 키워드로 객체 인스턴스가 생성되는것을 막는다.
'Lang > Java' 카테고리의 다른 글
[Java] Lambda 특징과 활용 (1) | 2022.10.03 |
---|---|
함수형 프로그래밍과 Java #1 (6) | 2022.09.08 |
[Java] Runnable과 Thread의 차이 (0) | 2021.12.11 |
[Java] 추상 클래스와 인터페이스 (abstract class & interface) (0) | 2021.10.13 |
[Java] Call by Reference? Call by Value! (0) | 2021.08.31 |