티스토리 뷰

iOS

iOS ) 왕초보를 위한 delegate정리

Zedd0202 2017. 1. 14. 11:37
반응형


swift 공부를 하면서 알아야하는 개념 하나가 delegate개념인데요

저같은 경우에는 자료들도 영어고 한글로 설명을 봐도 너무 이해하기가 어렵더라구요  :( 

며칠간 공부를 하다가 어느정도 이해 돼 공유하려고 해요 ㅎㅎ 

시작할게요!




왕초보를 위한 delegate정리





delegate를 알려면 먼저 '프로토콜'을 알아야합니다.

delegate는 프로토콜로 구현이 되기 때문이죠.

프로토콜은 그냥 서로간의 '약속'이라고 생각하시면 될 것 같아요.


예시를 들자면 '선생님'이라는 프로토콜이 있다고 생각해 볼게요.

선생님 프로토콜은 


과목명

담당 클래스

가르치다()

과제를 내다()

...


등등 여러가지를 가지고 있겠죠?


과학선생님, 영어선생님이 있다고 생각 해볼게요. 

이 과학선생님과 영어선생님은 '선생님'이라는 일종의 명찰을 가지고 있는 거겠죠?

과학선생님, 영어선생님은 항상 선생님 프로토콜을 준수 해야만 합니다. 


궁금증이 드실 수도 있겠지만 왜 프로토콜 상에서 가르치다(), 과제를 내다()라는 행동을 정의만하고 구현은 하지 않았을까요?

그 구현은 '선생님'이라는 프로토콜을 채택한 곳에서 이루어집니다.

애플측에서 모든 경우의 수를 생각해 구현하기 힘들기 때문이죠.

프로그래머는 함수 프로토타입을 가지고 자신만의 원하는 방향으로 구현만 하면 된답니다. 


그냥 하나만 기억하세요. 프로토콜은 서로간의 지켜야할 규약입니다. 



이제 delegate를 공부해봅시다. 


그럼 delegate의 뜻을 한번 살펴볼까요? 


1. (집단의 의사를 대표하는) 대표(자)


2. (권한·업무 등을) 위임하다


3. ( 대표를) 뽑다


라는 뜻이 있는데요, 




  • Delegate는 대리자 라는 뜻으로 이해하시면 될 것 같아요. 너가 해야할 일을 내가 해서 줄게!! 이런느낌?

    swift에서 기존의 버튼이나 텍스트필드, 라벨 등의 객체들은 고유의 특징들이 있죠.

    버튼은 누르면 동작하는 녀석,

    텍스트필드는 글자를 입력할 수 있도록 해주는 녀석,

    라벨은 글자 내용을 출력해주는 녀석

    ...

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



    조금 이해가 가시나요? 

    이해가 가기 쉽게 예시를 들어 설명 해드릴게요. 저는 이 예제를 해보고 delegat의 개념이 정말로 와닿았답니다 


    제가 선택한 예제는 정말 간단한 UITextFieldDelegate 예제에요 :)


    Text Field안에 글자를 쓰고 버튼을 누르면 라벨에 제가 쓴 글이 옮겨지는 

    아주 간단한 예제입니다! 


    먼저 프로젝트를 하나 만들어주시고, 메인 스토리보드에 















  • 이렇게 배치해주세요. 


    그러면 먼저 버튼에 대한 액션을 줘야겠죠? 늘 하시던 것 처럼

     





  • control을 누른채로 @IBAction 함수를 만들어주세요. 

    그리고 함수안에 코드는


    enteredLabel.text = textField.text;


    으로 해주세요."라벨의 텍스트를 내가 현재 쓴 Text Field안의 값으로 써주겠다"

    라는 뜻입니다. 그리고 실행을 시키면!!!


클릭을 누르게 되면  


라벨이 텍스트 필드에 있던 값으로 바뀌게 되겠죠? 






이제 delegate를 써보겠습니다.

먼저 delegate를 쓰려면 과정이 존재한다는 것을 아시나요?  

가장 먼저 해주어야 할 작업은 '채택'작업입니다.




UIViewController클래스 옆에 UITextFieldDelegate 라고 '채택'작업을 진행해주세요.

프로토콜을 '선언'했다는 잘못된 말입니다.

여러 프로토콜중 나는  UITextFieldDelegate 를 채택할게 ㅎㅎ 라는 의미에요.



그러면 먼저 @IBAction에 있는 동작들을 주석처리 해줄게요.


@IBAction func buttonClicked(_ sender: Any) {

      //enteredLabel.text = textField.text;

        

    }


그러면 이제 버튼을 눌러도 아무 동작도 하지 않게 되겠죠? 



delegate를 쓰는데는 과정이 존재한다고 그랬죠? 두번째 과정입니다. 위임자를 정해주는 과정인데요.



viewDidLoad()함수에 

textField.delegate = self

(textField는 아까 선언한 텍스트 필드의 @IBOutlet 이름입니다. )

를 추가해주세요. 이 말이 무슨뜻이냐하면 
위임자(대리자)가 누구인지 알려주는 과정이라고 생각하시면 될 것 같아요. 
"textField의 뒷바라지는 내가 할게"라는 의미입니다.
여기서 '내'가 누구일까요? 바로 현재클래스인 ViewController입니다.
ViewController는 textField에게 이렇게 말하죠. 
"너한테 이벤트가 발생하면 프로토콜에 따라 너에게 응답을 줄게."


이제 마지막 과정인 '구현'을 해볼까요?

 @IBAction을 통해 글을 옮겨주는 것을 대신해주는 함수를 선언해볼게요.



func textFieldShouldReturn(_ textField: UITextField) -> Bool {

        enteredLabel.text = textField.text

        return true

    }




함수를 추가해주세요.


이 textFieldShouldReturn은 UITextFieldDelegate 안에 정의되어있는 함수입니다.

우리는 이 동작을 '대신'해 줄 함수를 불러와 그 함수안에 우리가 하고싶은 일을 '구현'만 하면 된답니다.

이 함수이름을 보면 대충 무슨일을 하는 함수인지 감이오실거에요.

'텍스트필드에 사용자가 어떤 일을 하고 리턴될거다'라는 의미같죠? 

그러므로 이 안에 아까 @IBAction 클릭함수에서 사용했던 

enteredLabel.text = textField.text

를 추가해주세요. 그러면 리턴될 때 이 함수는 자동으로 불려오게 된답니다.

그러면!!  

이렇게 하고 클릭버튼이 아닌 엔터(=return)를 누르게 되면!!

짠!! 이렇게 텍스트필드에 있던 zedd가 라벨로 옮겨지게 된답니다.



delegate가 조금은 이해가 가시나요? 직접 해보시면 정말 좋으실거에요. 저도 이 예제를 따라하고 delegate가 뭔지 알 수 있었답니다 ㅎㅎ


도움이 되었으면 좋겠네요 :)




반응형