Singleton Pattern

Groot·2022년 6월 7일
0

TIL

목록 보기
7/153
post-thumbnail

TIL

🌱 난 오늘 무엇을 공부했을까?

📌 Singleton Pattern

📍 싱글톤이란?

  • 싱글톤 클래스는 애플리케이션이 요청한 횟수와 상관없이 동일한 인스턴스를 반환합니다.
  • 싱글톤 클래스에서는 프로세스당 클래스의 인스턴스가 하나만 있을 수 있습니다.
  • 싱글톤 개체는 해당 클래스의 리소스에 대한 전역 액세스 지점을 제공합니다.
  • 싱글톤은 일반적인 서비스나 리소스를 제공하는 클래스와 같이 이 단일 제어 지점이 필요한 상황에서 사용됩니다.

📍 싱글톤 디자인 패턴은 언제 활용하면 좋을까?

  • 클래스의 인스턴스가 하나만 존재하는 것을 보장하고 싶을 때
    • 여러 모듈에서 하나의 값을 유지하고 싶을 때

📍 내 프로젝트에 적용한다면 어디에 적용하는게 좋을까?

  • 과일의 수량을 결정하는 부분에서 과일가게의 객체를 하나만 만들 수 있도록 해주면 과일가게의 타입을 구조체로 변경하고 쥬스메이커를 여러개 만들어도 과일의 수량은 하나로 이어지지 않을까?라고 생각한다.

  • 클래스 싱글톤

class FruitStore {
    static let fruitStore = FruitStore()
    private var fruitInventory = ["apple": 10]
    private init() {}
    
    func reduceFruit(fruit: String) {
        guard ((fruitInventory[fruit]? -= 1) != nil) else {
            return
        }
    }
    
    func printFruit() {
        print(fruitInventory)
    }
}

var juiceMaker1 = FruitStore.fruitStore
juiceMaker1.reduceFruit(fruit: "apple")
juiceMaker1.printFruit() // ["apple": 9]

var juiceMaker2 = FruitStore.fruitStore
juiceMaker2.reduceFruit(fruit: "apple")
juiceMaker2.printFruit() // ["apple": 8]

var juiceMaker3 = juiceMaker2
juiceMaker3.reduceFruit(fruit: "apple")
juiceMaker3.printFruit() // ["apple": 7]

var juiceMaker4 = FruitStore.fruitStore
juiceMaker4.reduceFruit(fruit: "apple")
juiceMaker4.printFruit() // ["apple": 6]
  • 같은 코드를 구조체로 변경
var juiceMaker1 = FruitStore.fruitStore
juiceMaker1.reduceFruit(fruit: "apple")
juiceMaker1.printFruit() // ["apple": 9]

var juiceMaker2 = FruitStore.fruitStore
juiceMaker2.reduceFruit(fruit: "apple")
juiceMaker2.printFruit() // ["apple": 9]

var juiceMaker3 = juiceMaker2
juiceMaker3.reduceFruit(fruit: "apple")
juiceMaker3.printFruit() // ["apple": 8]

var juiceMaker4 = FruitStore.fruitStore
juiceMaker4.reduceFruit(fruit: "apple")
juiceMaker4.printFruit() // ["apple": 9]

📍 싱글톤 디자인 패턴의 장점과 단점은 무엇이 있을까?

  • 장점
    • 나의 인스턴스로 메모리를 공유하여 메모리 절약이 된다.
    • 데이터 공유가 쉽다.
    • 인스턴스가 하나임을 보장할 수 있다.
  • 단점
    • 인스턴스가 너무 많은 일을 하면 결합도가 높아진다.
    • 멀티 스레딩 환경에서 동시에 하나의 인스턴스에 접근하여 동시성 문제가 발생할 수 있다.

📍 코코아터치 프레임워크에서 싱글턴이 활용된 사례는 무엇이 있을까?

  • FileManager
    • 애플리케이션 파일 시스템을 관리하는 클래스입니다.
    • FileManager.default
  • URLSession
    • URL 세션을 관리하는 클래스입니다.
    • URLSession.shared
  • NotificationCenter
    • 등록된 알림의 정보를 사용할 수 있게 해주는 클래스입니다.
    • NotificationCenter.default
  • UserDefaults
    • Key-Value 형태로 간단한 데이터를 저장하고 관리할 수 있는 인터페이스를 제공하는 데이터베이스 클래스입니다.
    • UserDefaults.standard
  • UIApplication
    • iOS에서 실행되는 중앙제어 애플리케이션 객체입니다.
    • UIApplication.shared

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

  • 클래스
    • 참조 타입
    • 주소 값을 참조해서 가짐
    • 인스턴스가 동일한 주소를 가짐 -> 싱글턴으로 구현하기 적합
  • 구조체, 열거형
    • 값 타입
    • 값을 복사해서 가짐
    • 새로운 인스턴스를 만들었을 때 다른 주소를 가짐 = 값을 공유하지 않음 -> 싱글톤의 역할을 하지 못함
profile
I Am Groot

0개의 댓글