개발자의 무지개

싱글톤 패턴 (Singletone Pattern) 본문

소프트웨어 아키텍처/디자인패턴

싱글톤 패턴 (Singletone Pattern)

파란막대 2022. 7. 9. 16:37

개념

싱글톤 패턴은 생성 패턴 중 하나로써 객체가 단일 인스턴스를 가지도록 구현한다.

멀티쓰레드 환경에서 자원의 동시 접근을 막아 정합성을 보장하고, 리소스를 절약하는 용도로 사용된다.

 

구현방법

1. 생성자의 접근제한자를 private 으로 선언하여 직접 생성을 막는다.

2. static 멤버 변수를 만들어 인스턴스 생성 여부를 저장한다.

3. getInstance() 메서드를 public으로 만들어 인스턴스가 생성되지 않은 경우에 자신을 생성하여 리턴한다.

 

상황

프로그램 로그를 파일에 저장하는 기능이 필요하다.  Log파일을 읽고 쓰는 LogController를 만들어 로그를 저장해보자.

 

코드 작성

    package Singleton;

    public class LogController {
        private static LogController instance;
        private String logFileContents;

        private LogController() {

            //log file을 디스크에서 읽어온다.
            logFileContents = "Log file opened. \n";
        }

        public static LogController getInstance() {
            if(instance == null) {
                instance = new LogController(); 
            }

            return instance;
        }

        public void write(String newLog) {
            //log file에 로그 내용을 저장한다.
            logFileContents += newLog + "\n";
        }

        public void print() {
            System.out.print(logFileContents);
        }
    }

LogController는 생성자가 private으로 선언되어 있으므로 직접 생성할 수 없다.

getInstance()를 호출하게 되면 instance가 생성되지 않은 경우 인스턴스를 생성하여 저장하고, 이미 생성되어 있는 경우 기존 인스턴스를 반환한다.

logFileContents는 실제로는 파일에 저장해야 하며 다른 쓰레드의 호출시 임계영역(Critical Section)에 진입하는 공유 영역이므로, 프로세스 동기화 기법을 이용하여 보호해야 한다.

여기서는 편의상 문자타입 변수로 간단히 작성하였다. 

 

이제 getInstance() 를 호출하여 LogController의 인스턴스를 사용할 수 있다.

    LogController logController1 = LogController.getInstance();
    LogController logController2 = LogController.getInstance();
    LogController logController3 = LogController.getInstance();

    logController1.write("first log");
    logController2.write("second log");
    logController3.print();

getInstance 를 통해 단일 인스턴스가 반한되기에 logController1, logController2, logController3은 같은 인스턴스가 된다.

 

실행결과는 아래와 같다.