본문 바로가기
🍎 iOS/DevNote

[iOS] Delegate 패턴을 알아보자

by @Eddy 2023. 3. 30.
728x90

처음 Delegate패턴을 접했을 때에는 정말,, 이게 뭔 소릴까?라는 생각을 많이 했던 것 같다.

나중에 알고보니 Delegate는 사용한 지도 모르고 사용하고 있었던 경우가 많았다.

Coordinator 패턴을 사용하면서도 Delegate를 정말 많이 사용하게 될 수밖에 없었는데, 

그래서 Delegate에 대해서도 정리하면 좋겠다는 생각이 들어 이렇게 작성하게 되었다.

 

Delegate 의미

Delegate는 사전적 의미에서 알다시피, 대리자이고, 인스턴스가 할 일을 다른 인스턴스가 해주는 것을 말한다.

좀 더 쉽게 말해 "내가 할 일을 남이 해준다."라고 이해하면 좋을 것 같다.

 

 

실생활 예제

예를 들어, 엄마가 김치찌개를 끓이기 위해, 어린 아들에게 두부 1모 심부름을 시킨다고 가정해보자.

어린 아들이 마트에 가는 길에 까먹지 않도록, 엄마가 포스트잇에 '두부 1모'라고 적어서 아들에게 줬다.

어린 아들은 마트에 가서 두부 1모를 구매한다.

 

이는 곧, 아래와 같이 표현할 수 있다.

두부 1모 구매 = 해야 할 일, protocol Method

어린 아들 = 대리자,  Delegate

 

 

실생활 예제 코드 변환

위의 실생활 예제를 코드로 변환해 보자.

 

코드를 말로 풀어보면,

  1. Mom은 현재 3가지 일(재료손질, 김치찌개 끓이기, (두부구매))을 해야 한다.
  2. 하지만 찌개를 끓이다가 나가서 두부를 사 오는 것보다, 다른 사람(delegate, 대리인)가 대신 구매 하는 게 더 효율적이다.
  3. delegate가 해야 할 일은 MomDelegate에 명시되어 있는 buyTufu()이다.
  4. 아들은 MomDelegate(엄마의 대리인)이 되어 buyTufu()를 한다.

 

 

실제 코드 예제

그럼 이제, pseudo코드가 아닌 실제 코드 예제를 훑어보자

자주 사용하는 UICollectionViewController를 예제로 하여 코드 전문을 가져왔다. ( 레이아웃은 필요 없어서 지웠다. )

  • TestViewController가 대신할 UICollectionViewController가 해야 할 일(Protocol)을 채택하고,
  • 대신 처리해 준 일을(Event 발생 시) UICollectionViewController에게 전달하기 위해 collectionVIew.delegate = self 코드를 작성한다.

따라서 UIViewController가 기능을 처리하는 객체이고,

어떤 이벤트가 발생했을 때, Delegate에 의해 위임된 UICollectionVIewController로 전달하는 역할을 한다는 것이다.

 

아래는 UICollectionView의 delegate 프로토콜 내부 함수이고, 단순 참고용으로 보면 좋을 것 같다.

  • UICollectionViewDelegate를 찾을 수 있고, optional method로 구성되어 필요한 것만 자유롭게 호출하도록 만들어져 있다. UICollectionView Delegate에는 없지만, 필수구현 method에는 required가 붙어있다. 
  • UIScrollViewDelegate protocol타입을 갖고 있는 이유는, UICollectionViewController가 UIScrollViewController 타입이기 때문

 

pseudo 코드와 비교해 보면,

TestViewController = 아들 역할

UICollectionVIewController = 엄마 역할

이라고 할 수 있겠다.

 

그래서, Delegate는 왜 사용하는 걸까?

Delegate의 장단점에 대해 정리하고 싶었는데, Protocol의 장단점과 엮이는 부분이 많다.

그래서 이 또한, 상속과 Protocol의 관점에서 봐야 한다.

Class는 단일 상속을 원칙으로 하지만, Protocol은 다중 채택이 가능하다.

즉, Protocol은 Swift의 단일 상속의 한계를 극복하고, 범용적이고 재사용 가능한 코드를 추구하기 위함이다.

또한 하나의 객체가 너무 많은 책임을 갖고 있을 때, 이를 덜어주기 위해 사용할 수 있다.(e.g. Coordinator 패턴)

 

예를 들어, UICollectionViewController를 Delegate Protocol 없이 내부에 모두 구현해 놓고, TestViewController의 collectionView에 상속한다고 생각해 보자. 

그렇다면, 여러 곳에 collectionView를 사용할 때, 다 같은 UICollectionViewController를 사용하지 않을 테니

상속받는 클래스의 전용코드가 만들어지면서, 매번 클래스를 만들어줘야 할 것이고,

UICollectionViewController 하나로 어떻게든 하겠다!라고 하면, 불필요하게 상속받는 내용이 생기면서 쓸데없이 무겁고 복잡해질 것이다.

 

Delegate 장점

  1. 유연한 개발이 가능하다.
  2. 코드 재사용성이 증가한다.
  3. 의존성과 책임이 감소한다. ( 주의: 사용 방식에 따라 높아질 수 있음 )
  4. 필수 protocol method 및 변수를 빠뜨리지 않을 수 있다.

 

 

Delegate 단점

  1. 구현해야 할 코드가 길어진다. ( 엄마가 해야 했던 일을, 아들이 하면서 아들에 대한 코드도 작성해 줬다. )
  2. 다수 객체에서 호출하는 방식은 효율적이지 못하다. ( UIViewController 하나에서 퉁 치면 됐던 것들이, 여러 곳에 있으니 불편하다. )
  3. 순환참조(Retained Cycle)로 Memory Leak이 발생할 가능성이 있어 꼼꼼한 확인이 필요하다. -> weak var delegate: (Protocol이름)로 해결가능.

 

느낀 점

Delegate는 정말 UIKit의 전부인가? 싶을 정도로 곳곳에 포진되어 있다.

처음 공부할 때는 Delegate가 대리자, 위임자,, 그래서 뭐,,?라는 느낌이었는데, 지금은 이 말보다 더 적합한 말은 없는 것 같다.

 

예제 코드 링크

https://github.com/JUNY0110/iOS_UIKit_DevNote/tree/main/2.Delegate

 

GitHub - JUNY0110/iOS_UIKit_DevNote: UIKit과 관련된 공부내용을 올리는 정리노트입니다.

UIKit과 관련된 공부내용을 올리는 정리노트입니다. Contribute to JUNY0110/iOS_UIKit_DevNote development by creating an account on GitHub.

github.com

참고자료

  1. Multiple Delegates in iOS
  2. Protocol(프로토콜) vs Inheritance(상속)
  3. [Swift] Swift에서 상속(Inheritance)과 프로토콜(Protocol)에 대한 고찰
  4. iOS Delegate 패턴에 대해서 알아보기
반응형

댓글