오늘의 주제

1. Protocol
2. Delegate 만들어 보기



서른 세 번째 시간입니다.^^

지난 번에는 유저의 응답을 받아 볼 수 있는 피커뷰에 대해 알아보았습니다~
이번에는 프로토콜이라는 것에 대하여 알아보도록 할게요~
잘만 사용하면 좋은 녀석입니다 ㅎ

스따뚜~~~~~~~~~~~~





# Protocol이란?

네트워크에서 프로토콜이라 함은 일종의 통신규약을 말하는데요, Objective-C에서는 약간 다른 의미로 사용됩니다.
음... 뭐 굳이 말하자면 클래스간의 통신 규약이라고도 말할 수 있겠네요 ㅎ
프로토콜은 일정한 메소드를 통하여 클래스 간에 통신을 할 수 있는 통로를 제공합니다.
어떠한 객체에서 다른 객체로 데이터나 메세지를 전달하고 싶을 때 사용할 수 있습니다.

말로는 잘 느낌이 안오시죠?ㅎ
그런데 이렇게 말씀드리면 느낌이 조금 오시려나요?ㅎ

이 프로토콜이란 친구를 사용하여 코코아 터치에 많이 사용되고 있는 위임패턴(Delegation Pattern)을 구현할 수 있습니다.

그럼 기본적으로 클래스에서 제공되는 델리게이트 메소드 말고 우리가 직접 델리게이트 프로토콜과 메소드를 만들어 보는 시간을 갖도록 하겠습니다.ㅎ

# Delegate 만들어보기

이번 실습에서는 ViewController의 한 라벨에다가 ViewControllerForWeb에서 우리가 불러왔던 웹페이지의 마지막 주소를 세팅하는 것을 해보겠습니다.

그러려면 일단 ViewController에 라벨을 하나 넣어줘야겠죠?ㅎ
라벨을 넣어주시고 아울렛을 연결해 줍니다.


그리고 이제는 프로토콜 생성을 위하여 ViewControllerForWeb.h로 옵니다.
거기에 프로토콜을 작성해 주고, 프로퍼티로 델리게이트를 만들어 줍니다.
@required와 @optional은
말 그대로 다른 객체와 프로토콜을 통해 연결했다면 꼭 구현해줘야 하는 메소드이다. 선택적으로 구현해 주어야 하는 메소드이다를 구분해 준 것입니다.
지난 번에 피커뷰에서 피커뷰 델리게이트 중에 필수적으로 구현이 되어야 하는 메소드가 있었지요? 그것을 생각하시면 편할거예요.


그리고 ViewControllerForWeb.m에서 헤더에서 만들어준 델리게이트를 synthesize로 받아줍니다.


그리고 우리가 마지막으로 ViewControllerForWeb을 닫을 때 프로토콜을 통하여 ViewController로 메소드를 호출합니다.


그리고 이제는 ViewController로 돌아와서 델리게이트로서의 역할을 하도록 세팅해 주고, 메소드 들을 선언해 줍니다.


그리고 구현파일 ViewController.m으로 돌아와서 실제적으로 메소드를 구현해 줍니다.
또, ViewControllerForWeb의 객체를 생성해 줬을 때, 자신을 델리게이트로 설정을 해 줍니다.



자, 이제 실행해 볼까요?ㅎ

이렇게 웹페이지를 띄웠다가~


닫고 이전 화면으로 돌아가면~ 맨 마지막에 요청하였던 페이지의 주소가 라벨에 세팅이 되어있음을 확인 할 수 있습니다 ㅎ


아까 구현해놓고 실행하지 않았던 빨간색으로 글자 바꾸는 메소드는 여러분께서 한 번 적절히 활용해서 꼭 실행해 보시기 바랍니다 ㅎ

정말 중요한 개념인데 금방 끝냈네요~

굉장히 중요한 내용 중에 하나이기 때문에 혹여나 이해가 안되시거나 부족하다 싶으면 꼭 말씀해 주세요.
보강설명 들어가겠습니다...ㅎ
사실 지금 좀 부족한 감이 있습니다만, 여러분의 피드백이 필요한 시점입니다 ㅎㅎ
피드백 없으면 이 내용은 포스팅이 또 안나오겠지요..ㅎ

by yagom

twitter : @yagomsoft

p.s 제 포스팅을 RSS 피드로 받아보실 수 있습니다.

RSS Feed 받기   


↓↓↓저 열심히 썼는데 추천 한방 꾹 눌러주고 가시는 건 어떨까요? 로그인이 필요 없습니다. ^~^ 고맙습니다~ ↓↓↓ 



Posted by yagom

댓글을 달아 주세요

  1. 생초보 2012.05.25 17:37  댓글주소  수정/삭제  댓글쓰기

    안녕하세요 야곰님~~ 생초보에용

    이것저것 혼자 공부중인데 딱 막히는게 한가지 잇어서,,,
    염치불구하구 다음강좌는 요런거 좀 다뤄 주시믄 어떻실란지요ㅡㅡ;;

    거진 며칠째 헤메고잇는게,, NSXMLParser 이녀석입니다

    월 500원짜리 웹호스팅도 가입해서 xml 파일 올려놓고 테이블뷰에 뿌려주려고
    구굴링, 맥부기 모두 뒤져서 코딩 해보고 있는데,,,,,완전 멘 붕 상태입니다..

    시간 나실때 부탁드려요~

    감사합니다




    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.05.25 17:58 신고  댓글주소  수정/삭제

      ㅎㅎ 고녀석 조만간 하려고 했습니다~
      일단 테이블 뷰 먼저 포스팅 나가고 고거 바로 합니다~ㅎㅎ
      조금만 기다려 주세용~_~

  2. 인절미후후 2012.06.26 15:46  댓글주소  수정/삭제  댓글쓰기

    아 정말 어렵네요 중요한 개념이고 자주 보이는건데
    잘 알아야 응용을 할텐데..
    두어번 더 봐야될거 같습니다.

    프로토콜, 데이터소스, 델리게이트,
    프로토콜은 뭐뭐 쓰겠다고 선언해주는 것이고,
    데이터소스는 써야할 데이터를 셋팅해주는 애고,
    델리게이트는 사용할 때 가져다 쓰는거고..자바에서의 인터페이스라고도 하던데

    아 프로토콜이랑 델리게이트 헷갈리네요.. ㅎㅎ 사용할때는 델리게이트, 선언시는 프로토콜 이라고 생각하고 있습니다

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.06.26 16:18 신고  댓글주소  수정/삭제

      이녀석들은 중요한 수준 그 이상입니다~!

      델리게이트, 데이터소스는 프로토콜의 일종이라고 생각하시면 됩니다.

      프로토콜은 객체간에 서로 약속한 메소드를 호출 할 수 있게 해 주는 역할이 되겠습니다.

      데이터소스는 약속된 메소드를 통하여 지정된 데이터를 가져올 수 있으며, 델리게이트는 특정 상황에 대한 반응을 메소드를 통해 구현할 수 있도록 해 준것입니다.

      덧글을 제가 써놓고도 무슨말인지 알쏭달쏭 하네요 =ㅅ=

      여하튼 정말 중요한 것 이상의 내용임에는 틀림없습니다.

      꼭 이해하고 숙지하셔야 할 내용입니다~!

  3. Sio 2012.07.19 17:29  댓글주소  수정/삭제  댓글쓰기

    으... 이건 뭔가 많이 사용해 봐야 아! 이거구나~ 라고 확실히 알것 같네요 ㅎㅎㅎ
    오늘 배울 것들로라도 이것 저것 응용해 봐야겠습니다 ㅜㅜ ㅋㅋ
    그럼 다음 강의로 고고~~

    • Favicon of https://blog.yagom.net BlogIcon yagom 2012.07.20 09:17 신고  댓글주소  수정/삭제

      네, 정말 기본적인 개념이지만 처음엔 참 이해하기 어려운 내용중에 하나일 것입니다.
      힘내세요^^*
      천천히 오세요~
      너무 빠르면 탈나요 ㅎㅎㅎ

  4. 나에게넌 2012.08.13 15:12  댓글주소  수정/삭제  댓글쓰기

    폭풍 흡입!!! 완전 중요한 내용 감사합니다..

  5. Dklee7206 2012.10.17 00:56  댓글주소  수정/삭제  댓글쓰기

    안녕하세요.. 좋은글 많이 보고 있습니다.
    많이 어렵네요... ㅠㅠ 왜 써야하는지 부터도 잘 모르겠고..
    이유같은것 좀 보충해서 알려주시면 많이많이 감사할께요~

    내일도 좋은 하루 되세요~

  6. hyung 2012.11.30 11:44  댓글주소  수정/삭제  댓글쓰기

    오늘은 델리게이트를 공부하겠어요! 이제 회사일 따윈 모름 ㅋㅋㅋㅋㅋㅋㅋ

  7. Favicon of https://lifeones.tistory.com BlogIcon Hue Kim 2013.03.20 14:49 신고  댓글주소  수정/삭제  댓글쓰기

    너무 좋은 자료들 감사합니다.

    포스팅 하느라 시간도 엄청오래걸리셨을텐데..

    고생많으셨어요..ㅠㅠ 저도 비슷한거 해볼려다..하나 작성하고 포기했었는데..;;..

    대단하십니다!!!

  8. dklee7206 2013.05.13 11:34  댓글주소  수정/삭제  댓글쓰기

    안녕하세요. 따라해 보고 있는데요. ViewControllerforWeb.m
    [self changeFuncButton: UIBarButtonSystemItemStop]; 이부분에서 에러가 나서요
    메소드 구현된 부분 있을까요?

  9. dklee7206 2013.05.14 17:20  댓글주소  수정/삭제  댓글쓰기

    안녕하세요~ 역시나 이해가 안됩니다~ ㅠㅠ
    델리게이트 선언해준 이후부터 조금만 더 자세히 부연 설명 부탁드려요.. 주석으로 설명 해주셔도 되구요..
    감사합니다~


    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.05.14 19:30 신고  댓글주소  수정/삭제

      어떤 부분이 잘 이해가 안가시는지요...?ㅠㅠ
      http://blog.yagom.net/179
      이쪽 참고해 보셨나요? :)

    • dklee7206 2013.05.16 10:47  댓글주소  수정/삭제

      네 안녕하세요. 개념적으로 약해서 이해를 못하고 있는것 같습니다..
      따로 공부해보고 궁금한점 질문 드릴께요..

    • dklee7206 2013.05.16 16:26  댓글주소  수정/삭제

      프로토콜 구현하는쪽과 받아들이는 쪽 이런 부분이 구분이 잘 안되고 컨트롤러 각각의 역할이 뭔지 개념이 잘 안잡힙니다. ㅠㅠ

  10. dklee7206 2013.05.18 11:21  댓글주소  수정/삭제  댓글쓰기

    델리게이트 프로토콜은 꼭 ViewControllerForWeb에서 선언해주어야 하는건가요?
    그리고 델리게이트로서의 역할을 하기 위해서 ViewController.h에서 메소드와 여러가지를 구현해줘야 한다고 설면해주셨는데 서로의 관계가 잘 이해가 되지 않는데 조금만 더 설명해주시면 감사하겠습니다.

  11. dklee7206 2013.05.19 18:10  댓글주소  수정/삭제  댓글쓰기

    @property (weak, nonatomic)id<viewControllerForWebDelegate>delegate;
    이 부분은 왜 만들어주는 건지 잘 모르겠습니다..

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.05.20 10:15 신고  댓글주소  수정/삭제

      답변이 늦어져 죄송합니다 ^^;
      프로토콜은 음..... 일종의 서로간의 통신이죠?

      프로토콜은 꼭 해당 뷰컨트롤러에서 생성해주지 않아도 됩니다.
      하지만 그 프로토콜을 사용하려면 프로토콜을 사용하고자 하는 컨트롤러에서 내용을 알고 있어야 하므로 구현된 소스파일이 import되어야겠지요 :)

      ViewController가 ViewControllerForWeb의 대리인이 되려면, 해당 프로토콜을 충족시키는 메소드 등이 필요합니다.
      @required에 선언된 메소드가 ViewController에 꼭 구현이 되어있어야 하구요, @optional에 선언된 메소드는 말그대로 있어도 없어도 됩니다.

      그리고 @property (weak, nonatomic)id<viewControllerForWebDelegate>delegate;

      의 의미는 viewControllerForWebDelegate 프로토콜을 따르는 id형의 delegate라는 이름을 가진 변수를 property선언해 주겠다는 의미입니다.

      그래서 이 컨트롤러의 대리인 역할을 할 객체가 자신을 이 프로퍼티에 세팅하게 되는거지요.

      iOS에서 기본적으로 delegate를 달고 있는 녀석들 (UITableView 등)의 레퍼런스 도큐먼트 보시면 delegate가 어떻게 선언되어 있는지 확인해 보세요 ㅎ

      id는 어떤 객체든지 가리킬 수 있는 포인터 형이구요.

      꼭 이 예제가 아니더라도 몇 가지 메소드를 더 만들다 보시면 감이 오실거예요^^;

      보고 이해가 안되면 직접 프로젝트 만드셔서 이것저것 해 보시면 더 빨리 이해되실 거예요 ㅎ

      더 설명이 필요하시면 말씀해 주세요~

  12. Favicon of http://ohsdsl@naver.com BlogIcon hahahaha 2013.09.11 14:58  댓글주소  수정/삭제  댓글쓰기

    storyboard를 이용하여 사용하고 있습니다.

    ㅠㅠ Label이 주소로 안바뀌어서요..

    web 버튼 클릭해서 갈떼 delegate:self 를 어떻게 해야할지 모르겠네요..
    이부분 말고는 다 똑같이 진행한 상태입니다.

    아니면 다른 문제가 있을가요?

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.09.11 20:18 신고  댓글주소  수정/삭제

      ViewControllerForWeb.h 파일에서 delegate 선언부에서 id 앞에 IBOutlet 이라고 써 준 후 저장하시고
      스토리보드에 가셔서 아울렛 연결해 주시면 됩니다.

    • Favicon of http://ohsdsl@naver.com BlogIcon hahahaha 2013.09.12 10:55  댓글주소  수정/삭제

      outle을 어디로 연결을 해야하는건지 궁금합니다.

      지금 스토리보드상에서 아울렛이 연결되는데가 없어서요 ㅠ

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.09.12 14:31 신고  댓글주소  수정/삭제

      일단 스토리보드를 쓰지 않고 해 보세요..

      스토리보드는 앱 구조와 동작 흐름을 익힌 후에 사용하여도 늦지 않습니다...

      스토리보드 절대 쉬운게 아녜요

  13. 안녕하세요? 2013.11.04 23:42  댓글주소  수정/삭제  댓글쓰기

    안녕하세요? 델리게이트에 대해 검색하다가 고수님의 의견을 여쭙고자 들리게 되었습니다. A클래스에서 B클래스에 있는 b메소드를 호출한다고 할때, 예전에는 classB *B = [[classB alloc]init ]; 한다음, [B b]; 이렇게 호출했었거든요. 그런데 B클래스의 특정한 메소드의 경우 호출은 되는데 A의 Array를(이 Array는 Plist파일에 저장한 다음 해당 위치에서 불러옴) 불러올때 Array값이 null 로 들어오더라구요. B클래스의 다른 메소드에서는 Array값을 제대로 받아오는데 왜 특정 메소드에서만 받아오지 못하는지 도무지 원인을 알 수가 없었습니다. 그러다가 해당 메소드를 Delegate선언해서 쓰니까 값을 제대로 받아오더군요. 혹시 원인을 알 수 있을까요? 그리고 classB *B = [[classB alloc]init ]; [B b]; 이렇게 Delegate선언 없이 쓸때의 문제점은 무엇이 있는지 알려주시면 정말 감사하겠습니다.

    • Favicon of https://blog.yagom.net BlogIcon yagom 2013.11.11 09:42 신고  댓글주소  수정/삭제

      안녕하세요?
      alloc, init 한다는 것은 새로운 객체가 생성되는 것이기 때문에 클래스 이름이 같더라도 서로 다른 녀석들입니다.
      포스팅 중 클래스와 객체에 대하여 보시고 조금 더 생각해 보시면 알 수 있을지도 모르겠습니다 :)
      방문해 주셔서 고맙습니다!

  14. 감사합니다! 2014.03.05 11:35  댓글주소  수정/삭제  댓글쓰기

    정말 감사합니다.
    해당 강의로 프로토콜을 거의 이해하게 되었습니다.
    책은 봐도 잘 모르겠던데 님 강의를 한번 보게되니 바로 이해하게 되네요.