본문 바로가기
Swift

[iOS] About Notification & Delegation

by dsungc 2024. 10. 26.

이번 글에서는 객체 간 데이터의 상태 변화 혹은 정보 전달이 일어나야할 때 사용하는

NotificationDelegation에 대해 알아보려 합니다!

 

Notification

Notification은 NotificationCenter라는 싱글턴 객체 를 통해서 데이터의 상태 변화나 정보 전달이 일어나야 할 때 이를 관찰하는 객체에 알림을 보내는 시스템입니다.

 

Notification의 구성을 살펴보면

 

1) 알림 등록

 NotificationCenter.default.addObserver(self, 
                                        selector: #selector(memoRecievedNotification),
                                        name: NSNotification.Name("myNotification"),
                                        object: nil)

 

2) 알림 전송 - 알림을 전송할 객체에 구현

NotificationCenter.default.post(name: Notification.Name("myNotification"),
                                object: nil,
                                userInfo: ["key": "value"])

 

  • selector: 알림 수신 시, 실행할 메서드 구현
  • name: 알림을 구분하는 식별자이고, 문자열 형식으로 제공. 같은 이름의 알림만 받음
  • object: 알림과 관련된 데이터를 전달하는 개체, nil로도 설정 가능
  • userInfo:추가 데이터를 전달할 수 있도록 [AnyHashable: Any] 타입으로 구성된 딕셔너리를 포함 가능, 없어도 전송 가능

 

Delegation

Delegate pattern은 Protocol을 정의하여 사용하는 패턴입니다.

특정 기능들을 Protocol에 정의해놓고 이벤트들을 전달하게 될 때 이를 받는 객체에 해당 기능들을 수행하도록 합니다.

객체간의 결합도를 낮춰 유지보수성과 확장성까지 높일 수 있는 패턴이죠

 

밑은 예시 코드입니다.

// 커피 제작 완료 알림을 위한 Delegate 프로토콜 정의
protocol CoffeeDelegate: AnyObject {
    func didMakeCoffee(coffee: String)
}

// 커피를 만드는 바리스타 클래스
class Barista {
    weak var delegate: CoffeeDelegate?  // delegate 프로퍼티 선언 (약한 참조)

    func makeCoffee() {
        let coffee = "Latte"
        print("Barista: 커피를 만들었어요!")
        // 커피 완성 시 delegate 호출
        delegate?.didMakeCoffee(coffee: coffee)
    }
}

// 커피숍 클래스, 커피가 완성되면 고객에게 전달하는 역할
class CoffeeShop: CoffeeDelegate {
    var barista = Barista()
    
    init() {
        barista.delegate = self  // 바리스타의 delegate로 CoffeeShop 설정
    }
    
    func orderCoffee() {
        print("CoffeeShop: 커피를 주문받았어요. 바리스타에게 요청합니다.")
        barista.makeCoffee()
    }
    
    // 커피가 완성되면 호출되는 Delegate 메서드
    func didMakeCoffee(coffee: String) {
        print("CoffeeShop: \(coffee) 커피가 완성되었습니다. 고객에게 전달합니다!")
    }
}

// 실행 예시
let coffeeShop = CoffeeShop()
coffeeShop.orderCoffee()

/*
CoffeeShop: 커피를 주문받았어요. 바리스타에게 요청합니다.
Barista: 커피를 만들었어요!
CoffeeShop: Latte 커피가 완성되었습니다. 고객에게 전달합니다!
*/

 

 

이뿐만 아니라 제가 프로젝트에서 많이 사용한 delegate pattern은 아마 UITableViewDelegate나 UICollectionViewDelegate를 많이 사용한 것 같습니다.

이름만 봤을 땐 거리감이 좀 있는 워딩이지만 예시를 보니 좀 감이 오는 것 같았어요!

 

 

내용은 마무리 되었구요!

제 경험을 소개해드리면서 마무리 해보자면 저는 연결된 객체간의 값 전달을 수행할 경우엔 보통 Delegate Pattern을 사용합니다. 

그 이유는 이 패턴이 좀 더 코드의 추적이 쉬웠던 것 같고, Notification 처럼 싱글톤 패턴을 사용하지 않아 굳이 앱 실행 내내 인스턴스를 갖고 있지 않아도 되기 때문이었어요!

물론 여러 객체에 정보를 전달할 땐 Notification을 사용합니다!!

 

아무튼!!

제 생각엔 상황에 맞게 타당한 이유를 갖고 사용한다면 무엇을 사용하던 괜찮을 것 같습니다.

 

그럼 오늘은

여기까지~

.

.

.

.

'Swift' 카테고리의 다른 글

[iOS] About WidgetKit - 2(App Group)  (0) 2024.11.02
[iOS] About TDD  (1) 2024.10.30
[iOS] About WidgetKit - 1  (0) 2024.10.24
[iOS] About JWT(Jason Web Token)  (0) 2024.10.17
[iOS] About Cookie/Session  (0) 2024.10.13