어떤 클래스에서 만들 수 있는 인스턴스 수를 하나로 제한 하는 패턴
다음과 같은 조건을 충족하는 객체에 적합
- 프로그램 실행중 최대 하나만 있어야함.
- 프로그램 설정, 파일 시스템 등..
- 이 객체에 전역적으로 접근이 가능해야함.
특징
- private 생성자
- static 메서드를 통해서만 객체를 얻어올 수 있음.
- 아직 객체가 없는 경우
- 객체를 생성한 후 static변수에 저장
- static 변수에 저장된 객체를 반환
- 객체가 있는 경우
- static 변수에 저장된 객체를 반환.
예시 코드
public class Singleton{
private static Singleton instance;
private Singleton(){
//private이기에 여기서 new 생성자를 하지 못함. get메서드를 통해야 생성 가능
}
public static Singleton getInstance(){
if(instance == null){ // 싱글톤 객체가 생성되지 않고 null이라면
instance = new Singleton(); //스태틱 변수에 싱글톤 객체를 대입
return instance; //객체로 생성된 싱글톤을 반환한다
}
/* 이 과정에서 단 하나의 객체만 생성된다.
* 새로 getInstance해도 static변수가 null이 아니기에 이미 존재하는 싱글톤 객체를 반환함
*/
}
}
create
delete
으로 생성,호출,삭제를 지정할 수 있음.
-----------------------------
public static Singleton ceateInstance(){
if(instance == null){
instance == new Singleton(); //싱글톤 객체의 생성만함
}
public static Singleton getInstance(){
return instance; // 싱글톤 객체를 반환만 함.
}
public static Singleton deleteInstance(){
if(instance != null){
instance = null; //싱글톤 객체가 존재한다면 싱글톤 객체를 null로 만들어버림.
}
}
----------------------------------
public static void main(String[] args) {
SingletonExample singletonExample = new SingletonExample();
singletonExample.createInstance(); //생성 따로
SingletonExample s1 = singletonExample.getInstance(); //호출따로
SingletonExample s2 = singletonExample.getInstance();
System.out.println(s1 == s2); // 주소를 비교해봤더니 true 출력이 된다. 같은 객체라는뜻
System.out.println("s1의 주소 : "+s1+" // s2의 주소 : "+s2);
//s1의 주소 : singleton.SingletonExample@1b6d3586 // s2의 주소 : singleton.SingletonExample@1b6d3586
singletonExample.deleteInstance();
}
위와 같이 create,get,delete를 따로 지정할때의 특징
- 사용자가 어떠한 객체를 사용 후 종료를 해야하는 경우가 있다(예를들어 시스템 설정같은 객체 등..)
- 이럴때 객체 생성시점과 삭제 시점을 지정할 수 있다는점은 큰 이점
- 또 명백하게 어느 시점에서 싱글톤 객체를 생성하고 호출하고 삭제하는점을 알 수 있기에
디버깅할때 문제 파악에 큰 도움이 된다.
싱글톤의 나머지 특징들….
- 싱글톤을 생성하는 메서드만 스태틱이여야한다.
- 나머지는 일반 메서드()
'공부 > OOP' 카테고리의 다른 글
상속 (0) | 2023.12.13 |
---|---|
Static (0) | 2023.12.13 |
개체 모델링 가이드라인. (0) | 2023.12.13 |
getter,setter (0) | 2023.12.13 |
OOP의 특성 (0) | 2023.12.13 |