[TIL] Delegate 패턴

Eden·2025년 6월 30일

Delegate란?

  • 대리자(Delegate) 는 어떤 객체가 해야 할 일을 대신 수행해주는 객체입니다.
  • 특정 이벤트나 행동이 발생했을 때, 그 처리를 다른 객체에게 위임(delegate) 하는 구조입니다.
  • Swift에서는 Protocol을 통해 구현됩니다.

언제 사용하나요?

  • A 객체가 B 객체에게 어떤 행동의 결과나 이벤트를 알려주고 싶을 때
  • 역방향 데이터 전달 (ex. 하위 화면에서 상위 화면으로)
  • UIKit의 UITableViewDelegate, UICollectionViewDelegate 등 대부분의 UIKit 컴포넌트에서 사용

구성 요소

  1. Protocol 정의 – 위임할 메서드를 명시
  2. Delegate 프로퍼티 선언 – 위임 받을 객체를 담을 변수
  3. delegate 호출 – 이벤트 발생 시 메서드 호출
  4. delegate 지정 및 구현 – 실제로 이벤트를 처리할 객체에서 프로토콜 채택

예시 코드

// 1. 프로토콜 정의
protocol CustomViewDelegate: AnyObject {
    func didTapButton()
}

// 2. 위임 객체에서 delegate 프로퍼티 선언
class CustomView: UIView {
    weak var delegate: CustomViewDelegate?

    func buttonTapped() {
        delegate?.didTapButton()
    }
}

// 3. 위임을 받는 쪽에서 프로토콜 구현
class ViewController: UIViewController, CustomViewDelegate {
    let customView = CustomView()

    override func viewDidLoad() {
        super.viewDidLoad()
        customView.delegate = self
    }

    func didTapButton() {
        print("버튼이 눌렸습니다!")
    }
}

핵심 포인트

  • Protocol을 사용해 역할을 정의
  • weak 키워드로 순환 참조(retain cycle) 방지
  • 역방향 이벤트 전달에 적합
  • 단방향 통신 구조 (한 객체에서 다른 객체로만 이벤트 전달)

장점

  • 관심사의 분리 (Separation of Concerns)
  • 유연한 구조 설계 가능
  • 재사용성 높은 컴포넌트 설계

주의사항

  • delegate는 보통 weak으로 선언해 메모리 누수 방지
  • 프로토콜을 사용할 때 AnyObject를 붙이면 클래스 타입에서만 사용 가능 (ARC 적용 가능)

마무리

Delegate 패턴은 iOS 개발에서 필수로 알아야 할 설계 방식입니다. 직접 프로토콜을 선언하고, delegate를 연결하고, 동작을 구현하면서 익혀나가는 것이 중요합니다.

profile
iOS Dev

0개의 댓글