Search
Duplicate

Singleton(싱글톤) 패턴

생성일
2023/08/07 13:01
태그
Pattern

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
복사
어느 클래스에서든 sharedstatic 프로퍼티 로 접근하면, 하나의 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
복사

 Reference