delegate를 알려면 먼저 '프로토콜'을 알아야 한다.
delegate는 프로토콜로 구현이 됩니다. 프로토콜은 그냥 서로간의 '약속' 이라고 생각하면 된다.
예를들어 '선생님'이라는 프로토콜이 있다고 생각해 보자.
선생님 프로토콜은
과목명
담당 클래스
가르치다()
과제를 내다()
...
등등 여러가지를 가지고 있다.
과학선생님, 영어선생님이 있다고 생각해보자. 이 과학선생님과 영어선생님은 '선생님' 이라는 일종의 명찰 을 가지고 있다. 과학선생님, 영어선생님은 항상 선생님 프로토콜을 준수해야만 한다. 프로토콜 상에서 가르치다(), 과제를 내다() 라는 행동을 정의만 하고 구현은 하지 않았는데, 그 구현은 '선생님' 이라는 프로토콜을 채택한 곳에서 이루어진다!! 애플측에서 모든 경우의 수를 생각해 구현하기 힘들기 때문이다. 프로그래머는 함수 프로토타입을 가지고 자신만의 원하는 방향으로 구현만 하면 된다.
Delegate는 대리자 라는 뜻으로 이해하면 된다. (너가 해야할 일을 내가 해서 줄게!) 이런 느낌이다. Swift에서 기존의 버튼이나 텍스트필드, 라벨 등의 객체들은 고유의 특징이 있다. 버튼은 누르면 동작하는 녀석, 텍스트 필드는 글자를 입력할 수 있도록 해주는 녀석, 라벨은 글자 내용을 출력해주는 녀석
...
델리게이트 패턴은 쉽게 말해서, 객체 지향 프로그래밍에서 하나의 객체가 모든 일을 처리하는 것이 아니라 처리 해야 할 일 중 일부를 다른 객체에 넘기는 것을 뜻합니다.
위의 코드에서 UITextFieldDelegate 프로토콜을 채택한 후, textField의 delegate를 self로 설정해줌으로써 textField에 이벤트가 발생할 경우 ViewController는 프로토콜에 따라 응답한다. textFieldShouldReturn(textField:) 함수는 UITextFieldDelegate 안에 정의되어있는 함수이고, 그 함수안에 우리가 하고싶은 일을 '구현' 하면 된다.이렇게 하게되면 클릭버튼이 아닌 textField에 text를 입력하고 엔터를 누르게 되면 textFieldShouldReturn(textField:)함수가 실행되고 enteredLabel의 text가 변경된다.
위의 예제는 위임자들은 그저 일을 시킬 뿐이고, 일을 어떻게 처리해야하는지는 모른다. 즉, 일을 처리하는 방법은 그 일을 수행하는 객체에 구현되어 있다. 이렇게 코드를 작성할 경우, 재사용과 유지보수가 쉬워진다. 어떤 일을 해야 하는지를 정해놓기만 하고, 상황에 맞는 코드를 작성하면 된다.