ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [디자인패턴] 싱글톤 패턴 :: Singleton Pattern
    CS 2020. 8. 9. 23:53

    싱글톤 패턴 (Singleton Pattern)

     


    정의

    어플리케이션이 시작될 때

    인스턴스를 단 하나만 생성하도록 하며,

    생성된 인스턴스를 어디에서든지 참조할 수 있도록 한다.

    즉, 인스턴스가 필요할 때 똑같은 인스턴스를 만드는 것이 아니라 기존 인스턴스를 사용

     


    이유

     

    고정된 메모리 영역을 얻어 메모리 낭비 방지

    인스턴스가 절대적으로 한 개만 존재하는 것을 보증하고 싶을 경우 사용

     


    단점

    싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 

    다른 클래스의 인스턴스들 간의 결합도가 높아져 객체 지향 설계 원칙에 어긋난다.

    개방-폐쇄 원칙 위배

    변경에 유연하게 대처할 수 없어 수정이 어려워진다.

    멀티쓰레드 환경에서 동기화 처리를 안 하면 인스턴스가 두개 생성될 수도 있음


    JAVA

    하나의 인스턴스 유지하기 위해 인스턴스 생성에 제약을 걸어야 한다.

    new를 실행할 수 없도록 생성자에 private 접근제어자를 지정,

    유일한 단일 객체를 반환할 수 있도록 정적 메소드 지원.

    메소드를 동기화 시켜야 멀티스레딩 문제가 생기지 않음.

     

    고전적인 방법

    public class Singleton{
    
    	private static Singleton uniqueInstance;
    	
    	private Singleton(){}
    	
    	public static Singleton getInstance(){
    
    		if(uniqueInstance == null){
    			uniqueInstance = new Singleton();
    		}
    		return uniqueInstance;
    	}	
    	
    }

    하지만 이 코드는 멀티스레드 프로그램에서 인스턴스가 2개 이상 생성될 수 있음

    이걸 막아주기 위해서는

    게으른 초기화 방법으로 synchronized를 사용 ==> 성능저하가 너무 큼

    holder를 이용 ==> 가장 보편적으로 사용하는 방법


    SWIFT

    자바에서는 여러가지 멀티스레드환경에서 처리해주어야 할 것이 많은데, 

    swift에서는 비교적 간단하다.

    class Printer {
        static let shared = Printer()
        private init() {}
    
        func printDoc(_ doc: String) {
            print(doc)
        }
    }

    이렇게 해주고 클라단에서

    Printer.shared.printDoc("Print Document")

    이렇게 불러오면 멀티스레드 문제를 따로 다룰 필요 없이 동기화 처리가 가능하다.

    댓글

Maybe a whole cake ? 🎂 HAHA!