Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Delegates와 Notification 방식의 차이점에 대해 설명하시오. #59

Open
dailynj opened this issue Dec 21, 2021 · 6 comments
Open
Labels

Comments

@dailynj
Copy link
Contributor

dailynj commented Dec 21, 2021

No description provided.

@dailynj dailynj added the Swift label Dec 21, 2021
@inuinseoul
Copy link
Collaborator

먼저 두 방식 모두 객체간의 소통을 위해 만들어졌습니다. 특정 이벤트가 발생하면 원하는 객체에 해당 사항을 전달해서 특정처리를 수행하도록 구성됩니다.

delegate 방식은 주로 이벤트를 1:1로 전달할 때 많이 사용됩니다. 주로 protocol을 정의하고 이를 이벤트를 대신 처리할 객체가 채택하여 사용하게 됩니다. 이에 따라 제 3 객체를 필요로 하지 않으며 확실한 처리가 가능하지만, 많은 줄의 코드를 필요로 하며 많은 객체에게 이벤트를 알리고 싶을 경우 비효율적이라는 단점이 있습니다.

notification 방식은 이벤트를 1:N으로 전달할 때 용이합니다. NotificationCenter라는 싱글톤객체를 기반으로 이벤트 발생여부를 옵저버를 등록한 객체에게 전달하는 방식으로 구성됩니다. 따라서 다수의 객체에게 손쉽게 이벤트 전달이 가능합니다. 하지만 제 3 객체를 필수적으로 필요로 하며, key값으로 Notification의 이름을 사용하기 때문에 컴파일 중 구독이 제대로 이루어져있는지 확인할 수 없다는 단점이 존재합니다.

@dailynj
Copy link
Contributor Author

dailynj commented Dec 28, 2021

Delegate 와 Notification 은 객체가 서로 종속되지 않고 소통하기 위한 방법들입니다.

Delegate 는 지정된 객체가 해야하는 일들을 프로토콜로 만들어두고 이를 채택하여 구현하고 대신 처리하는 방법을 말합니다. 이는 다양한 이벤트를 처리해야하는 경우 사용되면 좋습니다.

Notification 은 Notification Center 라는 싱글턴 객체로 이벤트의 발생여부를 옵저버를 등록한 객체들에게 post 하는 방식입니다. 이는 다수의 객체들에게 동시에 이벤트의 발생을 알려줘야할 경우 사용하면 좋습니다.

@tmfrlrkvlek
Copy link
Collaborator

Delegate 패턴은 프로토콜로 정의되며, 이전 객체가 이벤트가 발생할 시 delegate 객체에 이벤트를 전달하는 방식으로 이루어집니다. Notification 패턴은 싱글톤 객체인 NotificationCenter를 통해 이벤트 발생 여부를 addObserver한 객체에 post하는 방식으로 이루어집니다.
Delegate는 모니터링을 위한 제 3의 객체가 필요 없고, 프로토콜에 필요한 메소드들이 명시되어있다는 장점이 있지만, 코드량이 많고 여러 객체들에게 이벤트를 전달하는 것이 어려우며 비효율적이라는 단점이 있습니다.
NotificationCenter는 코드량이 적고 여러 객체에 동시에 이벤트를 전달할 수 있지만, 컴파일 시점에 구독 여부를 확인하는 것이 불가능하고 추적이 어렵다는 단점이 있습니다.

@sustainable-git
Copy link
Member

iOS에서 객체간 통신을 구현하기 위해 Delegate, Notification, KVO, (Combine) 방식을 사용할 수 있습니다. Delegate와 KVO는 1:1 통신, Notification은 1:N 통신이 가능하다는 차이가 있고, 특히 KVO의 경우에는 objc dynamic 속성을 붙여줘야 한다는 것이 가장 큰 차이입니다.

Delegate는 protocol을 이용합니다. 때문에 순환참조를 만들어낼 수 있고, delegate가 nil이 되며 crash가 발생할 수 있습니다. Notification은 이런 문제가 없지만, 구독자가 많아지면 추적이 어려워진다는 단점이 있습니다.

@co3oing
Copy link
Member

co3oing commented Dec 28, 2021

Delegate와 Notification은 이벤트가 일어나면 원하는 객체에 이벤트를 알려주고 이를 처리하게 하는 패턴입니다.
Delegate는 지정된 객체가 구현해야 하는 메서드의 원형을 프로토콜로 정의해놓고 Delegate 역할을 하는 객체가 이를 구현하는 방식입니다. 많은 줄의 코드를 작성해야하고 다수의 객체에 이벤트를 전달하기 어렵다는 단점이 있습니다.
Notification은 NotificationCenter라는 싱글턴 객체를 통해 이벤트의 발생 여부를 post하는 방식입니다. Delegate보다 적은 줄의 코드가 필요하고 다수 객체들에게 동시에 이벤트를 전달이 가능하다는 장점이 있지만 post이후에 정보를 받을 수 없다는 단점이 있습니다.

@duyeonnn
Copy link
Collaborator

Delegate는 특정 Protocol을 구현함으로써 위임하는 객체에 대해 대해 알 필요 없이 프로토콜을 통해 대신 메소드를 사용할 수 있습니다.

Notification은 NotificationCenter 객체에 observer를 등록함으로써 정보를 브로드캐스트하고 observer들은 수동적으로 정보를 받는 개념입니다.

Delegate는 위임되는 객체와 위임하는 객체간 1:1 관계를 가지고 NotifiacationCenter는 알림을 보내는 객체와 등록된 객체들간 1:n 관계를 가집니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

6 participants