---
# System prepended metadata

title: Untitled

---

보이시나요?

```swift
struct name {
    static let name: String = "feafew"
}

enum name {
    static let name: String = "reafe"
}
```



## 싱글턴 디자인 패턴은 언제 활용하면 좋을까?
- 주로 공통된 객체를 여러개 생성해서 사용해야하는 상황
- 앱 내부에서 사용되는 사용자 id, 이름
## 내 프로젝트에 적용한다면 어디에 적용하는게 좋을까?

쥬스집들이 과일저장소를 공통으로 하나만 사용한다는 개념이라 과일저장소를 싱글턴 패턴을 사용하는게 좋을 것 같다.

## 싱글턴 디자인 패턴의 장점과 단점은 무엇이 있을까?
- 장점
    1. 메모리 낭비를 방지한다 
    2. 데이터 공유가 쉽다
    3. 두번째 이용부터 객체 로딩 시간이 줄어 성능이 좋아진다. 
    4. 인스턴스가 절대적으로 한개만 존재함을 보증한다.

- 단점: 
    1. 싱글톤 인스턴스가 너무 많은 일을 하거나 많은데이터를 공유시킬 때객체지향의"개방-폐쇄 원칙"을 위반한다. 
    2. 객체간 독립성이 떨어지므로 수정과 테스트가 어려워질 수 있다.
    3. 멀티 스레드 환경에서 동시에 싱글턴 객체를 참조할 경우 원치 않은 결과를 가져올 수 있다.
 
## 코코아터치 프레임워크에서 싱글턴이 활용된 사례는 무엇이 있을까?

- NSFileManager
- NSWorkspace
- UIKit
    - UIApplication
    - UIAccelerometer. 
- sharedFileManager
- sharedWorkspace

코코아 터치에서 shared 붙은 컨벤션을 사용하는 애들은 싱글턴 디자인패턴을 사용했다.



## 싱글턴 디자인 패턴을 구현할 때는 어떤 방식(열거형, 구조체, 클래스 등)을 활용하여 타입을 구현하는 것이 좋을까? 그 이유는?

클래스를 사용하는 것이 좋다. 열거형과 구조체와 같은 값 타입으로 싱글턴 패턴을 사용할 경우, 변수에 할당할 때 값 자체가 새로운 인스턴스에 복사돼 사실상 하나의 인스턴스가 아니게 된다.


인스턴스는 변하지 않고 인스턴스가 가지는 프로퍼티만 변해야 하기때문에 let을 사용해야한다. 이때 struct를 사용하게 되면 내부에서 새로운 인스턴스 값을 만들게 되므로 공통된 인스턴스를 가지지 않아 값을 변경해도 모두 변경되지 않는다.


```swift
// 쥬스 메이커 타입
struct JuiceMaker {
    let fruitStore = FruitStore.shared
}
var a = Singleton()
Singleton.shared = a
class FruitStore {
    static let shared = FruitStore()
    
    private init() {}
}
```