Danny의 iOS 컨닝페이퍼
article thumbnail

Delegate

Delegate 단어의 뜻 

사전적 의미로 위임하다, 대리자라는 뜻을 갖고 있습니다.

 

객체 지향 프로그래밍에서
쉽게 말해서 델리게이트 패턴은 하나의 객체가 모든 일을 처리하는 것이 아니라
처리해야 할 일 중 일부를 다른 객체에게 위임한다는 거죠.

 

즉, 객체와 객체 간 쌍방향 커뮤니케이션의 방법입니다.

 

Delegate 패턴

데이터 전달 혹은 작업을 하는 데 처리하는데 있어 작업이 많아

원래 일을 처리해야 할 녀석이 아닌

다른 컨트롤러에게 대신 수행하도록 시키는 것이죠!

 

장점

프로토콜 사용으로 뛰어난 재사용성. 

프로토콜에 필요한 메소드들이 명확하게 명시되며 정보 전달도 가능.

객체 지향 프로그래밍을 따름. (처리할 일의 일부를 다른 객체에게 위임함)

로직의 흐름을 따라가기 쉬움.

 

단점

많은 줄의 코드가 필요.

delegate 설정에 nil이 들어가지 않게 주의해야함. (크래시를 발생 가능성)

많은 객체들에게 이벤트를 알려주는 것이 어렵고 비효율적임.

 

 

만드는 순서

Swift 내의 구현된 Delegate 프로토콜

기본적으로 Swift에서는 여러 가지 Delegate 프로토콜들이 존재합니다.

(UITextFieldDelegate, UITableViewDelegate, UIWebViewDelegate...)

 

예시로 UITextFieldDelegate 사용해 봅시다.

 

 

1. 프로토콜을 채택하기

 

ViewController에 사용할 UITextFieldDelegate에 채택을 한 후

현재 ViewController를 대리자로 설정해 줍니다.

 

textField.delegate = self 

 

여기서의 self는 ViewController의 객체를 말합니다.
해석을 하면 textField대리자(Delegate)ViewController의 객체가 된다는 말이죠. (위임을 한다)

class ViewController: UIViewController, UITextFieldDelegate {
    
    let textField = UITextField()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // delegate를 대리자로 설정해주기
        self.textField.delegate = self
    }
}

 

2. 메서드를 구현하기

 

Swift에서 기본 구현되어 있는 Delegate 프로토콜들은 

UITextFieldDelegate 공식문서 만 봐도 이렇게 많이 메서드가 존재합니다.

 

이렇듯 기본 Delegate 프로토콜메서드들은

이미 애플이 잘 만들어 놓았고 우리는 목적에 맞게 선택하여 사용하면 된다.

 

이와 같이 사용할 메서드를 재정의 해주면 됩니다.

// 텍스트필드가 뷰컨에게 "작업이 끝났어 END 입력해" 라고 전달
func textFieldDidEndEditing(_ textField: UITextField) {
    textField.text = "END"
}
// 텍스트필드가 뷰컨에게 "리턴버튼 누르면 키보드 내려도 돼" 라고 전달
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    textField.resignFirstResponder()
}

 

위의 UITextField를 통해 원리를 간단하게 설명하자면

 

실제로는 UITextField의 동작이지만

ViewController가 메서드를 전달받아 대신 작업을 한다.


다른 말로

화면에서의 유저 UITextField 커뮤니케이션을 하면 

UITextField의 동작은 Delegate를 통해서을 ViewController에서 전달받아 수행한다.

 

쌍방향 의사소통의 개념이죠.

 

 

Custom Delegate 프로토콜

순서만 설명하고

다음 글에 자세히 Custom Delegate를 다뤄보겠습니다.

 

위랑 방법은 비슷합니다.

다만 직접 프로토콜을 구현해줘야 하죠.

다음으로 동작을 정의해 준 뒤 대리자 설정을 해주면 됩니다.

 

큰 순서는 이와 같습니다.

1. 프로토콜을 구현하기

2. 동작을 하도록 메서드를 정의

3. 객체의 대리자 설정하기

 

자세한 Custom Delegate 패턴(코드)이 궁금하다면 여기를 클릭하세요.

 

[iOS/Swift] Custom delegate 패턴

VC들 간의 데이터 전달의 위한 커스텀 델리게이트 만들기 설명을 위해 FirstVC와 SecondVC라고 쓰겠습니다. FirstVC (receiver) → SecondVC (sender) receiver : 일을 하는 객체 sender : 일을 시키는 객체 예제를 간

ios-daniel-yang.tistory.com

 

 

반응형
profile

Danny의 iOS 컨닝페이퍼

@Danny's iOS

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!