[iOS 6주차] 싱글톤 패턴과 NotificationCenter

DoyleHWorks·2024년 11월 27일
0

싱글톤 패턴 (Singleton Pattern)

싱글톤 패턴은 클래스의 인스턴스를 하나만 생성하도록 보장하며, 어디서든 동일한 인스턴스에 접근할 수 있게 하는 디자인 패턴이다. Swift에서 싱글톤은 주로 앱 내에서 공유되는 객체(예: 설정 관리, 네트워크 관리, 데이터 캐싱 등)를 구현할 때 사용된다.

싱글톤 패턴 구현

Swift에서 싱글톤을 구현하는 방법으로 보통 static 키워드를 사용한다.

class SingletonExample {
    // 전역에서 접근 가능한 유일한 인스턴스
    static let shared = SingletonExample()
    
    // 외부에서 인스턴스를 생성하지 못하도록 private initializer 사용
    private init() {}
    
    // 예시 메서드
    func doSomething() {
        print("Singleton instance is working!")
    }
}

// 사용법
SingletonExample.shared.doSomething()

장점

  • 전역 상태 관리: 앱의 특정 상태를 전역적으로 유지하고 공유할 수 있다.
  • 메모리 절약: 객체를 한 번만 생성하므로 메모리를 효율적으로 사용할 수 있다.
  • 코드 간결성: 인스턴스를 여러 곳에서 반복적으로 생성할 필요가 없다.

단점

  • 테스트 어려움: 객체가 전역적으로 공유되므로 단위 테스트에서 독립성을 보장하기 어렵다.
  • 의존성 증가: 싱글톤을 남발하면 코드가 싱글톤에 강하게 의존하게 되어 확장이 어려워질 수 있다.

NotificationCenter

NotificationCenter는 이벤트 기반 메시지 전달 시스템으로, 앱 내에서 객체 간의 느슨한 결합(loose coupling)을 유지하면서 통신을 가능하게 한다. 특정 이벤트가 발생했을 때 관련된 모든 객체에 알림을 전달한다.

Notification Center의 주요 개념

  1. Notification Posting: 이벤트를 알리기 위해 알림을 보낸다.
  2. Notification Observing: 특정 이벤트를 감지하고자 옵저버로 등록한다.
  3. Notification Handling: 이벤트가 발생했을 때 실행되는 코드를 작성한다.

Notification Center 사용법

  1. 알림 정의:
    알림 이름을 Notification.Name으로 정의한다.

    extension Notification.Name {
        static let didReceiveData = Notification.Name("didReceiveData")
    }
  2. 알림 보내기 (Post Notification):

    NotificationCenter.default.post(name: .didReceiveData, object: nil, userInfo: ["data": "Hello, World!"])
  3. 알림 등록 (Add Observer):

    NotificationCenter.default.addObserver(self, 
                                           selector: #selector(handleDataNotification(_:)), 
                                           name: .didReceiveData, 
                                           object: nil)
  4. 알림 처리 (Handle Notification):

    @objc func handleDataNotification(_ notification: Notification) {
        if let data = notification.userInfo?["data"] as? String {
            print("Received data: \(data)")
        }
    }
  5. 옵저버 제거 (Remove Observer):
    옵저버는 메모리 관리 차원에서 제거해야 한다.

    NotificationCenter.default.removeObserver(self, name: .didReceiveData, object: nil)

장점

  • 느슨한 결합: 객체 간 의존성을 줄이고, 독립성을 유지할 수 있다.
  • 이벤트 기반 처리: 앱 내의 다양한 이벤트를 효율적으로 관리할 수 있다.

단점

  • 디버깅 어려움: 알림이 어디서 발생하고 처리되는지 추적하기 어렵다.
  • 메모리 관리 문제: 옵저버를 적절히 제거하지 않으면 메모리 누수가 발생할 수 있다.

싱글톤과 Notification Center의 조합

Notification Center를 사용할 때 이벤트를 관리하기 위한 중심 객체를 싱글톤으로 구현하는 경우가 많다. 예를 들어:

class EventManager {
    static let shared = EventManager()
    private init() {}

    func postEvent() {
        NotificationCenter.default.post(name: .didReceiveData, object: nil, userInfo: ["data": "Event data"])
    }
}

위와 같이 구현하면 EventManager.shared를 통해 알림을 관리할 수 있다.

profile
Reciprocity lies in knowing enough

0개의 댓글