MisoBoy Blog...

Singleton Pattern (디자인 패턴) 본문

Java

Singleton Pattern (디자인 패턴)

misoboy 2011. 7. 27. 13:41

Singleton Pattern 은 언제 사용 할까요?


1. 어떤 클래스의 인스턴스가 반드시 1개만 존재하도록 하고 싶을때

2. 인스턴스가 1개밖에 존재하지 않을 것을 프로그램 상에서 표현하고 싶을 때


주로 위와 같은 조건일 때 사용 합니다. 

아래의 예제 코드를 참고 해보도록 합시다. 



public class Singleton {
       //클래스변수를 만들어서 딱 하나만 만들게 됩니다.
       private static Singleton singleton = new Singleton();
      
       //아래와같이 생성자가 private로 두어서 메인에서 생성할 수 없게 합니다.
       private Singleton(){
             System.out.println("인스턴스를 생성했습니다.");
       }
      
       //클래스 메소드로 딱 하나 만든 클래스변수를 반환하게 합니다.
       public static Singleton getInstance(){
             return singleton;
       }
      
}

public class Main {
 
       /**
        * @param args
        */
       public static void main(String[] args) {
             System.out.println("Start.");
             Singleton obj1 = Singleton.getInstance();
             Singleton obj2 = Singleton.getInstance();
             if(obj1  == obj2){
                    System.out.println("obj1과 obj2는 같은 인스턴스 입니다");
             }
             else{
                    System.out.println("obj1과 obj2는 다른 인스턴스입니다.");
             }
      
             System.out.println("End");
       }
 
}


결국 인스턴스는 하나만 만들어졌음을 알 수 있습니다.


public class Singleton{
       private static Singleton singleton = null;
       private static Singleton(){
             System.out.println("인스턴스를 생성했습니다.");
            
       }
      
       // 아래서 synchronized를 붙이는 이유는 한 쓰레드에 종속시키기 위해서이다.
       // 만약에 여러 쓰레드가 거의 동시에 Singleton 인스턴스를 만들경우 첫 if문에서 
       // 여러개가 null일 수도 있다.
       // 그러면 여러개의 인스턴스가 만들어지고 우리가 원하는 하나의 인스턴스를 생성하지 못한다
       // 그래서 synchronized를 붙여서 한 쓰레드가 실행하면 다른쓰레드가 
       // 접근을 못하게 해서 한 인스턴스가 만들어 지게 해야한다.
      
       public static synchronized Singleton getInstance(){
             if(singleton == null){
                    singleton = new Singleton();
             }
             return singleton;
       }
}r