Singleton (싱글톤)
싱글톤 패턴이란?
특정 용도로 객체를 하나만 생성하여, 공용으로 사용하고 싶을 때 사용하는 디자인 유형
예를 들면, User의 정보를 저장하는 클래스를 만든다면
class UserInfo {
var id: String?
var password: String?
var name: String?
}
Swift
복사
그리고 A ViewController에서는 id를, B ViewController에서는 password를, C ViewController에서는 name을 입력 받아, 이를 UserInfo라는 클래스에 저장해야 한다고 생각해보자
// A ViewController
let userInfo = UserInfo()
userInfo.id = "HJ"
Swift
복사
// B ViewController
let userInfo = UserInfo()
userInfo.password = "123"
Swift
복사
// C ViewController
let userInfo = UserInfo()
userInfo.name = "HJ"
Swift
복사
만약 이런 식으로 A, B, C ViewController에서 각각 UserInfo 객체를 만들어서 저장하면,
각각의 Instance의 프로퍼티에만 저장될 것이다. 하지만 우리가 원하는 것은 한 Instance에 모든 정보가 저장되게 하고 싶다.
이 클래스에 대한 Instance는 최초 생성될 때 딱 한번만 생성해서 전역에 두고, 그 이후로는 이 Instance만 접근 가능하게 하고 싶다.
→ Singleton Pattern
이런 식으로 한 Instance에 어디 클래스에서든 접근 가능하게 하는 것이다.
Singleton Class 만드는 방법
1. static 프로퍼티로 Instance 생성하기
class UserInfo {
static let shared = UserInfo()
var id: String?
var password: String?
var name: String?
}
Swift
복사
먼저 전역으로 저장될 것이니, static 을 이용해 Instance를 저장할 프로퍼티를 하나 생성해준다.
2. init 함수 접근제어자를 private로 지정하기
class UserInfo {
static let shared = UserInfo()
var id: String?
var password: String?
var name: String?
private init() { }
}
Swift
복사
혹시라도 init 함수를 호출해 Instance를 또 생성하는 것을 막기 위해, init() 함수 접근 제어자를 private로 지정해주면 된다.
그러면 외부에서 어떻게 접근할까?
3. Singleton Class 접근하는 방법
static 프로퍼티를 이용하면 된다.
// A ViewController
let userInfo = UserInfo.shared
userInfo.id = "HJ"
Swift
복사
// B ViewController
let userInfo = UserInfo.shared
userInfo.password = "123"
Swift
복사
// C ViewController
let userInfo = UserInfo.shared
userInfo.name = "HJ"
Swift
복사
어느 클래스에서든 shared 란 static 프로퍼티 로 접근하면, 하나의 Instance를 공유하는 것이다.
Singleton의 장단점
장점
•
한 번의 Instance만 생성하므로, 메모리 낭비를 방지할 수 있다.
•
Singleton Instance는 전역 Instance로 다른 클래스들과 자원 공유가 쉽다.
•
DBCP(DataBase Connection Pool)처럼 공통된 객체를 여러개 생성해서 사용 해야하는 상황에서 많이 사용한다 (쓰레드풀, 캐시, 대화상자, 사용자 설정, 레지스트리 설정, 로그 기록 객체 등)
단점
•
Singleton Instance가 너무 많은 일을 하거나, 많은 데이터를 공유시킬 경우, 다른 클래스의 Instance들 간 결합도가 높아져 “개방 = 폐쇄” 원칙을 위배한다 (객체 지향 설계 원칙이 어긋남)
•
따라서 수정과 테스트가 어려워진다.
Swift의 Singleton
스위프트는 별도의 작업을 해주지 않더라도, static 을 사용해 타입 프로퍼티로 인스턴스를 생성하면, 사용 시점에 초기화(lazy)가 된다.
따라서 Singleton Instance가 최초 생성되기 전까진 메모리에 올라가지 않고, Dispatch_once도 자동으로 적용된다.
그래서 별 코드 없이도 Instance가 여러 개 생성되지 않는, Thread-Safe한 방법이 되는 것이다!
(’싱글톤 생성’ 에 한정해서 Thread-Safe)
iOS에서 Singleton을 언제 쓰냐면
let screen = UIScreen.main
let userDefault = UserDefaults.standard
let application = UIApplication.shared
let fileManager = FileManager.default
let notification = NotificationCenter.default
Swift
복사