### 싱글턴 디자인 패턴은 언제 활용하면 좋을까? 1. 프로세스 내에서 단 하나의 인스턴스만 존재해야 하는 경우 2. 전역변수랑 비슷 - 내 프로젝트에 적용한다면 어디에 적용하는게 좋을까? - 한 객체, 인스턴스를 전역에서 변경해야 되는 경우 - 쥬스 메이커 프로젝트에서 여러 FruitStore의 과일 재고를 사용하지 않고 단 하나의 FruitStore 인스턴스에서 과일의 재고가 전역으로 공유되도록 하기 위해 싱글턴을 사용했다. ### 싱글턴 디자인 패턴의 장점과 단점은 무엇이 있을까? - 장점 1. 인스턴스를 생성할 때마다 메모리 영역을 할당받아야 하는데, 싱글톤을 활용하면 하나의 인스턴스만 사용하여 메모리를 낭비를 방지할 수 있다. 2. 전역에서 데이터 공유가 쉽다. - 단점 1. 너무 많은 데이터를 공유할 경우, 타입 간의 결합도가 높아진다. 2. 멀티 스레드 환경에서 동기화 처리를 하지 않았을 때, 인스턴스가 2개가 생성되는 문제도 발생할 수 있다. ![](https://i.imgur.com/kxFvkXy.png) ### 코코아터치 프레임워크에서 싱글턴이 활용된 사례는 무엇이 있을까? - 파일 접근을 돕는 FileManager 클래스의 객체 : FileManager.default - 앱의 중앙 제어를 하는 UIApplication 클래스의 객체 : UIApplication.shared - 앱 설정 등 Key-value 형태의 데이터를 지속적으로 저장하는 UserDefaults 클래스의 객체 : UserDefaults.standard - 등록된 알림의 정보를 사용할 수 있게 해주는 NotificationCenter 클래스의 객체 : NotificationCenter.default - 하드웨어의 가속도 값을 알려주는 CMMotionManager 클래스 : 객체를 단 하나만 만들라고 명시되어있음. ### 싱글턴 디자인 패턴을 구현할 때는 어떤 방식(열거형, 구조체, 클래스 등)을 활용하여 타입을 구현하는 것이 좋을까? 그 이유는? 참조 타입인 class가 가장 적합할 것 같다. ``` swift class MyClassSingleton { static let sharedInstance = MyClassSingleton() private init(){} var state = 5 func helloClass() { print("hello from class Singleton: \(state)") } } struct MyStructSingleton { static let sharedInstance = MyStructSingleton() private init() {} var state = 5 func helloStruct() { print("hello from struct Singleton: \(state)") } } let csi = MyClassSingleton.sharedInstance csi.state = 42 MyClassSingleton.sharedInstance.helloClass() // 42 var ssi = MyStructSingleton.sharedInstance ssi.state = 42 MyStructSingleton.sharedInstance.helloStruct() // 5 ```