[Design Pattern] 싱글턴 패턴 (Singleton Pattern)

2021. 2. 17. 21:59프로그래밍/디자인 패턴

반응형

📚 싱글턴 패턴이란?

 - 클래스가 오직 하나만 생성되도록 하고 클래스 외부에서의 잘못된 접근을 없애는 방법.

 - 이를 위해 클래스에 다음과 같은 제약을 준다.

    1) 객체를 여러 곳에서 만들 수 없도록 한다.

    2) 객체가 하나뿐이여야 한다.

 

🔔 싱글턴 패턴 사용하기

 - 프로그램에서 프린터 객체를 사용해야한다.

 - 한대 밖에 없는 자원으로 객체를 하나만 만들어서 재사용한다.

 - 위의 제약사항을 참고하여 다음과 같이 구현할 수 있다.

 

    1) 객체를 여러 곳에서 만들 수 없도록 생성자의 접근제한자를 private 으로 둔다.

        private CPrinter()

 

    2) 생성자 대신에 외부에서 객체를 쓸 수 있도록 하는 함수를 만든다.

        public static CPrinter GetInstance()

        외부에서 접근이 가능하도록 GetInstance() 함수의 접근제한자를 public 으로 두고, 

        외부에서 CPrinter클래스 객체를 생성할 수 없으므로 GetInstance() 함수를 static 함수로 만든다.

       

        외부에서 사용할 때 다음과 같이 사용할 수 있다.

        CPrinter.GetInstance()  

 

    3) CPrinter 클래스의 객체를 만들기 위해서는 CPrinter클래스의 생성자를 호출해야 한다.

       그러기 위해서는 CPrinter 클래스의 객체 인스턴스를 만들어야 한다. 

       외부에서 CPrinter 객체에 접근할 수 있는 방법은 static함수인 GetInstance()뿐이고, static멤버 함수에서는 static변수밖에 접근하지 못한다. 

       따라서 다음과 같이 static 변수를 만든다.

       private static CPrinter instance;

 

 위의 3가지 코드를 취합해 다음과 같이 CPrinter 클래스를 만들 수 있다.

       

public class CPrinter
{
    // 싱글턴 패턴
    private CPrinter() { }
    private static CPrinter instance;
    public static CPrinter GetInstance()
    {
        if (instance == null) instance = new CPrinter();
        return instance;
    }
    
    // 사용할 함수
    public void TestPrinter()
    {
    	// ...
    }
}

 

// 외부에서 다음과 같이 사용

CPrinter.GetInstance();

CPrinter.GetInstance().TestPrint();

 

🐾 정리

- 싱글턴패턴은 시스템에 하나밖에 존재하지 않는 객체의 생성과 접근을 제어하기 위해 사용된다.

 

- 싱글턴이 가지는 가장 큰 책임은 함부로 접근되어서는 안되는 자원을 보호하는 것이다.

 

- 접근을 제어할 필요가 없는 자원을 싱글턴으로 작성하는 것은 쓸데 없이 객체 접근에 대한 부하만 높이는 꼴이 되니 잘 판단해서 사용해야한다.

 

- 싱글턴 객체는 어디서 생성됐는지, 또 누가 생성하는지 명확하지 않다는 것도 유의할 것!

 

 

 

 

 

 

※ 해당 포스팅은「패턴 그리고 객체지향적 코딩의 법칙(문우식 저)책을 읽고 공부한 내용을 바탕으로 작성하였습니다.

반응형