티스토리 뷰

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가 뭔지 알 수 있었답니다 ㅎㅎ


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




댓글
  • 프로필사진 sarah 감사합니다 ㅜ 완전 잘 이해되었어요 ! 2017.04.09 14:10
  • 프로필사진 ujm 정말 쉽게 정리해주셨네요! 감사해요 ㅠ0ㅠ 2017.07.30 20:16
  • 프로필사진 Favicon of https://zeddios.tistory.com BlogIcon Zedd0202 ㅎㅎ도움이 되었다니 다행이에요 XD 2017.07.30 22:27 신고
  • 프로필사진 왕초보정훈 정말 감사드려요
    어렵게 느껴졌는데 이해가 잘됐어요!!
    다른 글들도 보고 공부해야겠어요~
    2017.09.28 20:06
  • 프로필사진 Favicon of https://zeddios.tistory.com BlogIcon Zedd0202 다행이에요 :) 글 읽으시다가 궁금한 점이나 지적할 부분 있으시면 댓글이나 PC화면 오른쪽 하단의 채널서비스 이용해주세요XD 2017.09.28 21:43 신고
  • 프로필사진 명진 저도 이해하는 데 많이 도움이 되었습니다! 감사합니다.

    블로그도 너무 예쁘네요. 티스토리로 이렇게 예쁘게 만들 수 있는지 몰랐어요 ㅋㅋ
    2018.07.30 14:25
  • 프로필사진 Favicon of https://zeddios.tistory.com BlogIcon Zedd0202 XD 2018.07.30 14:31 신고
  • 프로필사진 ljh30321 감사합니다! 많은 도움이 되었네요 2018.08.24 13:24
  • 프로필사진 x_phil 감사합니다.
    이번에 IOS개발을 시작하게 되면서 Objective-C와 Swift에 대하여 공부 중이었는데, 많은 도움이 되었습니다.
    2018.09.18 14:57
  • 프로필사진 설명좋아요 저 예제에서 delegate의 의의는 다른 제출버튼(클릭버튼) 없이도 textinput이 들어왔을 때 Label텍스트를 바꿀 수 있다는데 있는건가요??delegate를 왜 쓰는건지 잘 모르겠어서 질문드립니다:) 2019.03.24 14:46
  • 프로필사진 Favicon of https://zeddios.tistory.com BlogIcon Zedd0202 네 그렇다고 보면 될 것 같아요 2019.03.24 14:50 신고
  • 프로필사진 몬티몬티 감사합니다!!!!!!! 2019.04.06 15:50
  • 프로필사진 최인주 delagate 이해하기 위해서 구글 검색해서 처음 만난 글 입니다.
    정리 잘 해 주셔서 감사 드립니다.
    그런데 궁금증이 생겼어요.
    IBAction이 있는데 왜 delagate 가 필요할까? 입니다.
    다른 자료도 찾아보고 답을 찾으면 여기에도 올리겠습니다.
    감사합니다.

    다음에서
    A라는 객체가 B객체에게 어떤 일을 도와 달라고 도움을 요청하는 것이라고 보시면 됩니다.
    라고 설명 하는군요 좀더 봐야겠습니다.
    http://blog.naver.com/seotaji/220293615979
    2019.04.14 10:21
  • 프로필사진 이상범 감사해요! 많은 도움 되었습니다. 2019.12.10 16:10
  • 프로필사진 현우 확실하게 이해갔습니다. 매번 감사합니다 2020.02.02 20:54
  • 프로필사진 여너 정말 감사합니다 이해가 쏙쏙 잘됐어요!!
    그런데 궁금한 점이 있는데요,
    첫번째방법처럼 직접 버튼함수에 입력하면 더 간결하고 직관적인 것 같은데.. delegate를 채택하고, func도 따로만들고, 선언까지해야하는 두번째 방법을 쓰는 이유가 무엇인가요?^^
    2020.05.11 16:18
  • 프로필사진 Favicon of https://zeddios.tistory.com BlogIcon Zedd0202 안녕하세요~ 이 예제에서는 여너님처럼 느낄 수 있을 것 같아요. 이 부분은 생각하지 못했네요.
    제가 정말 옛날에 쓴 글이라..zzz 이 예제에서는 UITextFieldDelegate의 메소드 중 제일 그나마 간단한. textFieldShouldReturn만 봤는데요, 이 예제에서 눈여겨보면 좋을 것은, 항상 저 "클릭"버튼이 있는게 아니라는 것입니다. 요구사항에 키보드의 리턴버튼이 눌렸을 때 어떠어떻게 해달라 라는 요구가 있을 수 있겠죠? 그럴 때 키보드의 return버튼이 눌린것을 어떻게 감지할 수 있을까요? UITextFieldDelegate내부에 이런것들이 구현되어있기 때문에 쉽게 할 수 있습니다! textFieldShouldReturn말고도 내가 UITextField에 editing을 시작했는지, 끝냈는지, clear Button이 눌렸는지 등등을 UITextFieldDelegate 메소드를 통해 알 수 있습니다. 답변이 되었을까요?
    2020.05.11 16:24 신고
  • 프로필사진 Favicon of https://rolypolytoy.tistory.com BlogIcon rolypolytoy 진짜 쉽게 써주셨네요..감사합니다! 역시 어려운 개념들을 쉽게 설명 잘해주시는 분들이 이해력이 좋으시네요 ㅎㅎ 2020.05.29 20:22 신고
  • 프로필사진 Cyniczen 안녕하세요 글 잘 봤습니다
    .delegate = self 라고만 적고난후
    버튼을 누르면 작동하는게 너무 신기한데
    만약 델리게이트에 함수가 3~4 개 정도 정의되어있어도 파라미터 형식에 맞으면 자동으로 실행되는건가요 ???
    2020.06.05 18:56
  • 프로필사진 Favicon of https://binblogg.tistory.com BlogIcon ggasoon2 당신은 천재야,, 2020.08.03 16:23 신고
  • 프로필사진 demnodey 아직 잘모르겠어요 ㅠㅠ xib에 적용하려고하는데 힘드네요 2020.09.12 00:27
댓글쓰기 폼
Total
2,372,178
Today
321
Yesterday
2,957