안녕하세요
오늘은 Singleton에 대해서 알아보려고 합니다!
이름부터 Single로 시작을 합니다. 그럼 뭔가 하나라는 뜻이겠죠?
Singleton Pattern은 한 개의 클래스로 만드는 객체는 단 한개여야만 합니다.
무슨말이나면.. 클래스의 인스턴스를 하나만 생성하고 프로퍼티를 static으로 지정하여 전역에서 참조할 수 있도록 하는 편의를 제공합니다.
그럼 어떻게 만드는 것인지 한번 보겠습니다.
Sinlgleton 클래스
class AppSetting {
static let shared = AppSetting()
private init { }
var isMute: Bool = false
}
사용
AppSetting.shared.isMute = true
전역으로 공유할 클래스를 만들어 줍니다.
그리고 나서 자기 자신의 인스턴스를 Static let
으로 생성합니다.
그렇게 되면 사용 예제 처럼 자기 자신의 인스턴스를 생성한 프로퍼티인 shared
을 통해서 다른 프로퍼티와 메서드에 접근할 수 있습니다.
private init { }
을 한 이유는 해당 클래스의 인스턴스를 생성하지 못하도록 init을 private 처리를 해준 것입니다.
iOS에서 Singleton을 활용하는 예를 찾아보았습니다.
UIScreen.main
UserDefaults.standard
UIApplication.shared
FileManager.default
NotificationCenter.default
URLSession.shared
위와 같이 공통된 객체를 여러개 생성해서 사용해야하는 경우에 Singleton하나만 생성해서 공유하도록 할 때 사용하면 좋을 것 같습니다!
Singleton Pattern의 장단점입니다!
Swift이전의 Objective-C에서의 Singleton은 dispatch_once
를 이용해 한번만 불리도록 하는 작업을 해야합니다.
왜냐하면, MultiThread 환경에서는 Singleton을 생성할 때 Thread-Safe하지 않기 때문에 여러 쓰레드가 동시에 Singleton을 생성할 수도 있게 됩니다.
하지만!!
Swift에서는 static
을 사용하여 타입프로퍼티로 Instance를 생성하게 되면 dispatch_once가 자동으로 적용되기 때문에 별도의 코드가 없어도 Thread-Safe하게 Singleton을 생성할 수 있습니다.
또한, static
을 사용하면 lazy
한 효과가 있어 사용 시점에 초기화가 되기 때문에 사용하지 않는다면 메모리에 올라가지 않고 처음 사용하는 시점에 메모리에 올라가게 됩니다.
애플문서를 보게 되면..
NOTE
Unlike stored instance properties, you must always give stored type properties a default value. This is because the type itself doesn’t have an initializer that can assign a value to a stored type property at initialization time.
Stored type properties are lazily initialized on their first access. They’re guaranteed to be initialized only once, even when accessed by multiple threads simultaneously, and they don’t need to be marked with the lazy modifier.
타입 프로퍼티로 선언하게되면 lazy하게 되는지는 지금 처음 알게 된 것 같습니다..!
Singleton을 공부하면서 SOLID에 대해서도 다시 한 번 보게 되었네요..!
다음에는 SOLID에 대해서 포스팅 하겠습니다.
감사합니다.