적당한 고통은 희열이다

- 댄 브라운 '다빈치 코드' 중에서

Swift iOS 앱 개발/Swift

[Cocoa Design Pattern] Singleton Pattern

hongssup_ 2022. 12. 22. 17:33
반응형
싱글톤 패턴이란 인스턴스를 하나만 생성하여 어디에서든지 참조할 수 있도록 하는 객체 생성 패턴.
오디오북 앱에서 뮤직 플레이어를 싱글톤으로 하나만 생성하여 재생 관련 메서드들을 처리한 경험이 있는데,
이처럼 앱 내에서 공용으로 사용하고 싶은 기능이나 리소스를 싱글톤으로 만들어 인스턴스를 공유할 수 있고, 여러번 호출하더라도 인스턴스가 처음 생성될 때에만 메모리에 할당되기 때문에 메모리도 절약할 수 있다는 장점이 있다. 

 

싱글톤 패턴이란?

Provide access to a shared resource using a single, shared class instance.

어떤 기능이나 리소스를 앱 내에서 공용으로 사용하고 싶을 때, 해당 인스턴스를 하나만 생성하여 어디에서든지 참조하고 공유할 수 있도록 하는 객체 생성 패턴 

싱글톤 왜 사용?

- 인스턴스 공유 

: to provide a globally accessible, shared instance of a class

애플리케이션 내 어디서든 하나의 인스턴스를 공용으로 참조하여 공유하기 위해

- 메모리 절약 

: 싱글톤을 사용하면 인스턴스가 처음 생성될 때에만 메모리에 할당이 되고, 그 후에 여러번 호출하더라도 해당 인스턴스를 참조만 하기 때문에 메모리가 낭비되지 않음.

사용 예시?

오디오북 앱에서 오디오 플레이어 만들 때 싱글톤으로 만들어서 오디오 재생 관련 메서드들을 처리. 

로딩 indicator 팝업

 

iOS 개발에서 주로 사용하는 싱글톤 패턴의 객체 예시

let screen = UIScreen.main
let userDefaults = UserDefaults.standard
let application = UIApplication.shared
let fileManager = FileManager.default
let notification = NotificationCenter.default

사용 방법?

일반적으로 shared 라는 이름의 상수를 만들어 사용. 

static 키워드를 붙임.

이니셜라이저를 private으로 만들어서, 외부에서 생성을 못하게?

class Singleton {
    static let shared = Singleton()
}
class Player {
    static let shared: Player = {
        let instance = Player()
        // setup code
        return instance
    }()
    
    func play() { ... }
}

Player.shared.play()

 

+ AppDelegate 싱글톤 패턴으로 사용할 때

static let shared = UIApplication.shared.delegate as! AppDelegate

iOS 시스템에서 이미 생성된 AppDelegate 인스턴스를 가져와서 참조(재사용)하므로 앱 전반에 걸쳐 동일한 인스턴스를 사용하게 된다. 이렇게 이미 존재하는 AppDelegate 인스턴스를 참조하는 것이 올바르고 권장되는 방법. 

static let shared = AppDelegate()

이런 식으로 AppDelegate 의 새로운 인스턴스를 생성하면, UIApplecation 에 의해 관리되는 AppDelegate와 다른 별개의 객체이므로 중복 생성 및 동일 인스턴스 참조해야하는 경우 문제가 발생할 수 있다. 

 

 

 

디자인 패턴이란? 

general, reusable solution to a commonly occurring problem within a given context in software design. 

특정 컨텍스트 내에서 일반적으로 발생하는 문제를 해결하는 데 사용할 수 있는 재사용 가능한 솔루션. 

- Creational patterns 생성 패턴 : 객체 생성

- Structural patterns 구조적 패턴 : 더 큰 구조를 형성하고 새로운 기능 제공 위해 다양한 클래스와 객체를 구성

- Behavioral patterns 행동 패턴 : 객체 간 공통적인 의사 소통 패턴 식별하고 구현

참고 : Wikipedia - software design pattern, gmlwjd - 디자인패턴종류

 

싱글톤 패턴이란?

 

디자인 패턴 중, 객체 생성에 관련된 Creational (생성) 패턴의 하나로, 

singleton pattern ensure a class has only one instance, and provide a global point of access to it

클래스가 하나의 인스턴스만 갖도록 하고 이에 대한 전역 액세스 지점을 제공

 

특정 용도로 객체를 하나 생성하여 공용으로 사용하고 싶을 때 사용하는 방법.

이 객체는 임의로 메모리에서 해제해주지 않는 이상 프로그램이 실행되고 끝날 때까지 메모리에 유지된다(?)

 

 

 

 


참고 : 

https://developer.apple.com/documentation/swift/managing-a-shared-resource-using-a-singleton

 

728x90
반응형