티스토리 뷰
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
'Swift > Clean Code' 카테고리의 다른 글
[Swift] 보기 좋게? UIViewController 만들어 보기 (0) | 2021.01.10 |
---|
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- database
- Cleancode
- permission error
- UIBarButtonItem
- Realm
- TDD
- AVKit
- Closure
- UIControl
- BaseViewController
- Coordinator
- UIButton
- RECORDING
- http live streaming
- xib
- IOS
- pagingView
- AVFoundation
- Video
- testing
- NIB
- ssh
- Swift
- m3u8
- carousel
- Design Pattern
- HLS
- AssociatedObject
- customAlertView
- CollectionView
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함