본문 바로가기
디자인 패턴 DesignPattern

07.Singleton Pattern

by 질서정연_ 2020. 10. 14.

1. 싱글턴 패턴의 목적

클래스가 한 개의 인스턴스만을 만들 수 있도록 하고, 다른 곳에서 그 생성된 한개의 인스턴스에 접근할 수 있도록 한다.

 

2. 고전적 싱글턴 패턴의 구현 방법

  • private 디폴트 생성자 구현
  • 싱글턴 인스턴스를 저장하는 정적 멤버 변수(static 변수) 생성
  • 싱글턴 인스턴스를 반환하는 정적 팩토리 메소드(static 메소드) 구현
  • (그러나 멀티 스레드를 사용하는 프로그램에서는 이게 문제가 될 수 있다.)

즉 A a = new A(); 같은 형식으로 객체를 생성하지 않게 할 것이라는 뜻이다. 여기서는 한개의 인스턴스만을 만드는 것이 목적이기 때문이다. 그러므로 private 디폴트 생성자를 막아둔다. 

 

정적 메소드(static 메소드)에는 객체를 생성하지 않아도 사용할 수 있는 메소드가 정의되어야한다. 그래야 그 안에서 객체를 하나 생성하고 그걸 반환해주는게 가능해진다.  정적 메소드는 정적 멤버변수를 사용할 수 밖에 없다. 또한 일반 변수를 정적 팩토리 메소드에서 사용할 수 없다. 즉 일반 객체의 멤버 변수를 사용할 수 없다. 

정적 멤버변수(static 메소드)에는 정적 메소드에서 생성된 한개의 객체를 저장한다. 

 

3. 구현법

public class Singleton {
	//Singleton 클래스의 유일한 인스턴스를 저장한다.
    //정적 멤버변수가 자기자신을 가르키는데 주소값을 담는 개념이기 때문에 얘의 메모리 공간은 주소값이다.
    //공간의 크기가 미리 정해진다. 
    private static Singleton uniqueInstance;
    //기타 멤버변수가 필요하다면 삽입
    
    //private 디폴트 생성자가 바깥에서 사용될 수 없도록 막는다.
    private Singleton(){}
    
    public static Singleton getInstance(){
    	if(uniqueInstance == null) {
        //null인지 아닌지 확인하고 null이라면 이제 Singleton이라는 객체의 주소를 가진다.
        //이 방법이 내부적으로 객체를 생성하는 방법이다. 
        //uniqueInstance 에 초기값이 주어지지않으면 null이나 0이 들어가 있다.
        //이 static 메소드는 Singleton이 생성되지 않아도 사용이 가능하다. 
        	uniqueInstance = new Singleton();
        }
        return uniqueInstance;
	}
}

위 코드에서 볼 수 있듯이 Singleton getInstance에서 초기 uniqueInstanced은 null이기 때문에 uniqueInstance 에 Singelton이라는 객체의 주소가 들어가게 된다. 

그 이후로 다른 곳에서 Singleton S = Singleton.getInstance()를 하게 된다면 이미 uniqueInstance가 null이 아니기 때문에 기존에 생성 되었던 uniqueInstance가 리턴 되게 된다. 그러므로 이 방법을 쓰면 Singleton.getInstance()를 했을 때 반환하는 Instance가 같아 싱글턴 패턴의 목적을 달성한다. 

 

 

 

댓글