### 싱글턴 디자인 패턴은 언제 활용하면 좋을까?
1. 프로세스 내에서 단 하나의 인스턴스만 존재해야 하는 경우
2. 전역변수랑 비슷
- 내 프로젝트에 적용한다면 어디에 적용하는게 좋을까?
- 한 객체, 인스턴스를 전역에서 변경해야 되는 경우
- 쥬스 메이커 프로젝트에서 여러 FruitStore의 과일 재고를 사용하지 않고 단 하나의 FruitStore 인스턴스에서 과일의 재고가 전역으로 공유되도록 하기 위해 싱글턴을 사용했다.
### 싱글턴 디자인 패턴의 장점과 단점은 무엇이 있을까?
- 장점
1. 인스턴스를 생성할 때마다 메모리 영역을 할당받아야 하는데, 싱글톤을 활용하면 하나의 인스턴스만 사용하여 메모리를 낭비를 방지할 수 있다.
2. 전역에서 데이터 공유가 쉽다.
- 단점
1. 너무 많은 데이터를 공유할 경우, 타입 간의 결합도가 높아진다.
2. 멀티 스레드 환경에서 동기화 처리를 하지 않았을 때, 인스턴스가 2개가 생성되는 문제도 발생할 수 있다.

### 코코아터치 프레임워크에서 싱글턴이 활용된 사례는 무엇이 있을까?
- 파일 접근을 돕는 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
```