---
# System prepended metadata

title: Untitled

---

### 싱글턴 디자인 패턴은 언제 활용하면 좋을까?
    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
```