Swift/Clean Code
[Swift] Singleton Pattern
진태우
2021. 2. 13. 19:33
Singleton Pattern에 대해 공부한 내용을 정리해 보려고 합니다.
- 정의
싱글톤 패턴은 클래스 객체가 하나만 인스턴스화 되도록 보장하는 디자인 패턴입니다.
- 특징
-
어플리케이션 내에 하나만 존재해야 하는 객체일 경우 사용
-
static 변수로 선언하기 때문에 lazy하게 생성됨. 즉 사용하기 전엔 메모리에 올라가지 않음.
-
생성되면 어플리케이션이 종료되기 전까지 메모리에 유지
-
상수값이기 때문에 값의 변화가 없어 thread-safe가 보장됨.
-
하나의 인스턴스를 사용하기 때문에 인스턴스 내부의 데이터를 공유할 수 있음.
어디서든 접근 및 수정이 가능하다는 의미.
- 코드
아래는 싱글톤을 구현하는 예제입니다.
class Singleton {
// static -> lazy하게 생성
// let -> thread-safe 보장
static let shared = SingleTon()
// private 권한을 설정하여 외부에서 인스턴스를 생성할 수 없게 함
private init() {}
}
아래와 같이 네트워크 관리 객체를 만들어 사용할 수 있습니다.
class NetworkManager {
static let shared = NetworkManager(baseURL: API.baseURL)
let baseURL: URL
private init(baseURL: URL) {
self.baseURL = baseURL
}
}
// 싱글톤 인스턴스 호출
print(NetworkManager.shared)
만약 싱글톤 객체 생성시 더 복잡한 설정이 필요하다면 아래와 같이 할 수 있습니다.
class NetworkManager {
private static var sharedNetworkManager: NetworkManager = {
let networkManager = NetworkManager(baseURL: API.baseURL)
// 필요한 초기화 코드
return networkManager
}()
let baseURL: URL
private init(baseURL: URL) {
self.baseURL = baseURL
}
class func shared() -> NetworkManager {
return sharedNetworkManager
}
}
// 싱글톤 인스턴스 호출
print(NetworkManager.shared())
Cocoa 프레임워크에서 많은 싱글톤 패턴을 사용하고 있습니다.
let application = UIApplication.shared
let sharedURLSession = URLSession.shared
let defaultFileManager = FileManager.default
let standardUserDefaults = UserDefaults.standard
let defaultNotification = NotificationCenter.default
let defaultPaymentQueue = SKPaymentQueue.default()
- 주의
싱글톤은 많이 사용되는 디자인 패턴입니다. 하지만 안티 패턴으로 간주되기도 합니다.
싱글톤 인스턴스를 어디서든 쉽게 접근하고 수정할 수 있기 때문에 많은 곳에서 사용할 경우, 부작용이 발생할 수 있습니다. 또한 적은 양의 코드 수정으로도 다른 요소에서 버그가 발생될 수 있습니다.
때문에 상황에 따라 잘 고려해서 사용해야 편리한 도구가 될 수 있습니다.
- Reference
https://cocoacasts.com/what-is-a-singleton-and-how-to-create-one-in-swift