개발하는 뚝딱이

[Design Pattern] 싱글톤 패턴 본문

기타

[Design Pattern] 싱글톤 패턴

개발자뚝딱이 2020. 5. 15. 22:57

https://refactoring.guru/design-patterns/singleton

https://medium.com/@nimjea/singleton-class-in-swift-17eef2d01d88

정리하고 번역하여 작성하였습니다.

 

 

The Singleton Pattern

싱글톤 패턴은 클래스에서 하나의 인스턴스만이 생성되는 것을 보장하고, 그 인스턴스는 어디서든 접근할 수 있습니다.

 

싱글톤패턴의 예제로 StoreKit 프레임워크의 default payment queue가 있습니다. 애플리케이션에서는 SKPaymentQueue 클래스의 인스턴스를 생성하지 않지만, OS가 StoreKit를 이용하여 payment queue를 생성하고, 개발자는 defualt()메서드를 통해 사용이 가능합니다.

 

Note ; 애플에서도 싱클톤 패턴을 많이 사용합니다. UserDefaults.standard, UIApplication.shared, UIScreen.main, FileManager.default 모두 싱클톤 객체를 반환합니다.

 

 

 

싱글톤 패턴 사용법

싱글톤 객체가 하나라는 것을 보장하기 위해, 새로운 인스턴스가 만들어지는 것을 막아야 합니다. 스위프트에서 이니셜라이저를 private으로 만들어 새로운 인스턴스가 만들어지는 것을 막고, type property (static property) 로 shared instance를 생성할 수 있습니다.

 

예제1

- 싱글톤 패턴이 적용되지 않은 클래스

class LocationManager{

    func requestForLocation(){
        print("Location granted")
    }
    
}

let location = LocationManager() //initialization class
location.requestForLocation()    //Call function here 

 

예제2

- 싱글톤 패턴을 적용한 클래스

- LocationManager() 객체를 계속 생성할 수 있다

class LocationManager{
    
    static let shared = LocationManager()
    
    init(){}
    
    func requestForLocation(){
        //Code Process
        print("Location granted")
    }
    
}

LocationManager.shared.requestForLocation()
let location = LocationManager() //Still you can use your class like this
location.requestForLocation()

 

예제3

- 더 나은 방법으로 작성하는 싱글톤 패턴

- initializer를 private으로 선언해줘서 class 인스턴스를 생성하는데 제한을 둠

class LocationManager{
    
    static let shared = LocationManager()
    
    var locationGranted: Bool?
    
    //Initializer access level change now
    private init(){}
    
    func requestForLocation(){
        //Code Process  
        locationGranted = true     
        print("Location granted")
    }
    
}

LocationManager.shared.requestForLocation() //Access class function in a single line

 

 

정리

싱글톤 패턴을 과도하게 사용하기 쉽습니다. 전역변수 대신에 사용한다던가, 뷰 컨트롤러 간에 정보를 주고받기 위해 사용할 때는 다른 방법을 쓰는게 좋습니다. 다중 쓰레드에서도 관리가 어려운 등 단점이 있으므로 필요할 때 적절하게 사용하는 것이 좋습니다.