singleton 패턴

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

인스턴스가 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) {

             // TODO Auto-generated method stub

             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;

       }

}

 

 

 

 

블로그 이미지

가카리

프로그래밍, 취업 및 직장생활, 주식 부동산 재테크 전문 블로그

댓글을 달아 주세요