IOS/iOS

iOS. Delegate, Protocol 이란 무엇인가.

Delegate? Protocol? 도대체 이게 무슨말이야...

  라고 생각하시고 들어오셨다면 잘들어 오신겁니다... ㅋㅋ 저도 약 두달간 공부하면서 도대체 델리게이트 패턴? 프로토콜?아니 이게 무슨 소리야 도대체... 라고 생각했거든요.제가 2달간 여타 다른 강좌나 유튜브를 공부하면서 수없이 등장하는 이패턴. 프로토콜. 이제 설명 드리겠습니다. 

 프로토콜은 어떤 기능을 사용하기 위해 반드시 작성해야할 코드의 모음이다. 라는 말 들어보셨죠?

  예. 저도 많이 들었습니다. 근데 이걸 쓰기위해 저 작성이 필요한건 알겠는데 필요한 이유가 이걸 쓰기 위해서라고? 도대체 왜????
네 그렇습니다. 저도 당시에는 무슨 소리인지 몰랐습니다 이걸 왜 써야하는지 초보자의 입장에서는 모르죠 왜써야하는지 왜 초보자는 모를까요? 이것을 써야하는 상황에 닥쳐보지 않았기 때문이라고 말씀드릴수 있을것 같습니다. 간단히 말씀드려서 로그인 또는 회원가입하는 뷰를 만들어 보신다고 가정해 볼께요 거기에는 간단하게 아이디를 넣을수있는 Textfield, 비밀번호를 넣을 Textfield와 버튼이 있을수 있습니다. 
여기서 중요한 질문.

 여기 Textfield에 무엇이 입력되었는지 내가 실시간으로 알수있는 방법이 뭐지? 라고 생각해보시면 마땅히 답이 없습니다. 왜요? 사용자가 버튼하나 누를때마다 반응이 일어나도록 조건문과 스위치문을 쓸수는 없으니까요!

  따라서 여기 Textfield에는 delegate이 필요한겁니다 무슨 delegate이요?
UITextFieldDelegate 입니다
  • 이 델리게잇을 필요한 뷰컨트롤러에 추가하면 실시간으로 입력정보를 받아오거나 입력이 끝나거나 시작될때 선택될때 등의 정보를 받아 처리할수 있습니다. 이 델리게잇은 사용자의 필요에 맞추어 여러가지 메서드를 가지고 있습니다 예를들면 다음과 같은 메서드입니다.
    • textFieldDidBeginEditing(UITextField)
    • textFieldDidEndEditing(UITextField)
    • 여기 메서드 이름만 보셔도 대충 어떤일을 하는지 감이 오시죠?? ㅎㅎ

 음?? 그런데 왜 여기에는 프로토콜을 설명할때 처럼 무언가 필수적으로 사용해야 하는게 없나요?

  저도 잠깐 의문을 가지기는 했지만 다음과 같이 생각할수 있습니다. 만약 여러분이 테이블뷰, 콜렉션뷰를 사용할때 강좌에서 datasource, delegate를 연결해주어야 한다고 말씀하시는 것을 들었을 겁니다. 여기서 데이터 소스와 델리게잇이 없으면 콜렉션뷰와 테이블뷰를 어떻게 표시해야할지 생각해 보신적 있나요? 막막하죠?
그래서 datasource, delegate을 통해 구현해야 합니다. 여기서 또 무슨소리냐구요?? 

  콜렉션뷰나 테이블뷰를 사용하려면 필수적으로 해당 뷰컨트롤러에 다음과 같이 이 프로토콜을 사용할 것이라고 작성해주어야 합니다. 

class TestCollectionViewController : UIViewController, UICollectionViewDelegate, UICollectionViewDataSource
왜 이렇게 적어줘야 사용가능할까요? 

  애플이 개발자를 위해 테이블뷰, 콜렉션 뷰와 같은 여러 디자인이 있는 뷰를 만들었다고 했을때 개발자가 얼마나 셀이 필요한지 어떤 데이터가 들어가야 하는지 알수 있을까요? 

   따라서 여러분이 저런 뷰를 사용해야 할때에 표시할 데이터와, 셀의 개수를 작성해줄 프로토콜이 필요한겁니다. 

이상 그동안의 몰라서 답답했던 마음을 풀어보고자 작성하게 되었습니다 ㅎㅎ 이 글이 도움이 되었으면 좋겠습니다 ~!

'IOS > iOS' 카테고리의 다른 글

[TIL] iOS. MVVM without Rxswift  (0) 2020.11.20
iOS. 유효성 검사 포맷( Validation Check )  (0) 2020.11.18
[TIL] iOS. Button  (0) 2020.11.14
[TIL] iOS. View  (0) 2020.11.10
[TIL] iOS. APPlifecycle  (0) 2020.10.31