Delegate와 Notification의 차이

cheshire0105·2024년 1월 24일

iOS

목록 보기
12/46
post-thumbnail

Delegate와 Notification의 차이

발단

면접 준비를 하던 중 Delegate와 Notification의 차이가 무엇인지 설명 하라는 예시 질문이 있었다. 생각 해보니 둘의 차이가 뭔지 생각 해본 적이 없어서 이번 글로 정리를 해보겠다.

우선 두 가지의 개념의 공통점은 "통신, 커뮤니케이션"이다. 객체 간의 통신을 위해서 사용 되는 패턴이라는 뜻이다. 말이 어려운데 쉽게 말해서 알림을 보내기 위한 것이라고 생각 해도 좋겠다. 상태가 변경 되었을 때 그걸 다른 객체에 알리는데에 사용 된다는 것 이다.

Delegate

델리게이트는 Delegate는 일대일 통신에 특화된 패턴과 어떤 작업을 위임 하는 것에 좀 더 특화 되어 있다. 간단한 예를 통해 알아보자. UITableViewDelegate를 통한 예제를 만들어보자.

protocol TableViewDelegate {
    func didSelectRow(at indexPath: IndexPath)
}

위의 코드에서 TableViewDelegate 프로토콜은 didSelectRow(at:) 메서드를 정의하고 있습니다. 이는 테이블 뷰의 셀이 선택되었을 때 수행해야 할 작업을 위임받을 객체가 구현해야 하는 메서드이다.

class ViewController: TableViewDelegate {
    var tableView: TableView

    func setupTableView() {
        tableView.delegate = self
    }

    func didSelectRow(at indexPath: IndexPath) {
        // 셀이 선택되었을 때 수행할 작업
    }
}

ViewController 클래스에서 TableViewDelegate 프로토콜을 채택 했기 때문에 메서드를 구현한다. didSelectRow(at:) 메서드 안에서는 사용자가 테이블 뷰의 특정 셀을 선택했을 때 수행할 작업을 적을 수 있는 것이다.

class TableView {
    var delegate: TableViewDelegate?

    func cellSelected(at indexPath: IndexPath) {
        delegate?.didSelectRow(at: indexPath)
    }
}

TableView 클래스는 cellSelected(at:) 메서드를 가지고 있으며, 이 메서드는 셀이 선택되었을 때 delegate의 didSelectRow(at:) 메서드를 호출한다.

정리 하자면 테이블 뷰를 채택 하면 구현 해야 할 기능을 일종의 (자격증) 프로토콜로 만들어 놓고 테이블 뷰를 가지고 있는 페이지는 테이블 뷰의 자격증을 가지고 있기 때문에, 그 프로토콜 (자격증)을 가지고 테이블 뷰의 셀이 선택 됐을 때 어떤 행동을 할 수 있는 기능이 생긴 것이다. 또한 테이블 뷰 코드는 본인의 기능을 자신을 구현한 페이지에 넘길 수 있는 대리자 코드를 구현 한다. 그러면 테이블 뷰를 구현할 페이지에서 대리자를 페이지로 한다면 그 테이블 뷰를 사용 할 수 있는 것이다.

이것이 델리게이트 디자인 패턴이다. 프로토콜과 상호 작용 하면서 델리게이트 패턴을 이해 할 수 있는 것이다.

Notification

그렇다면 Notification은 무엇일까? Notification은 디자인 패턴은 아니고 메서드 이다.

특정 이벤트가 발생 하고 그 이벤트를 여러 객체에 알려주고 싶을 때 사용한다. 키보드가 나타거나 사라질 때 어떤 행동을 하고 싶을 때 사용할 수도 있다.

class MyViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: UIResponder.keyboardWillShowNotification, object: nil)
    }

    @objc func keyboardWillShow(notification: NSNotification) {
        // 키보드가 나타날 때 수행할 작업
    }
}

위의 코드는 키보드가 나타나는 이벤트를 구독 하는 코드이다. 키보드가 나타나면 keyboardWillShow 함수가 실행 된다.

정리

Delegate는 주로 일대일 통신에 사용되며, 한 객체가 다른 객체에게 특정 작업을 위임하거나 상태 변화를 알리는 데 사용된다.
Notification은 일대다 통신에 사용되며, 한 이벤트가 발생했을 때 여러 객체에게 동시에 알릴 수 있다.

delegate pattern은 단순히 알람을 보내는 것 이외에 다양하게 사용 되기도 한다. 토스 개발자 유튜브에선 프로토콜을 이용해서 다양한 기능을 사용한 것이 어렴풋이 기억에 남는다.

토스 개발자 유튜브

0개의 댓글