{"id":190,"date":"2006-10-30T13:30:00","date_gmt":"2006-10-30T13:30:00","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=190"},"modified":"2017-01-29T15:09:36","modified_gmt":"2017-01-29T06:09:36","slug":"template%ec%9d%84-%ec%9d%b4%ec%9a%a9%ed%95%9c-observer-%ed%8c%a8%ed%84%b4-1%eb%8b%a8%ea%b3%84","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=190","title":{"rendered":"Template\uc744 \uc774\uc6a9\ud55c Observer \ud328\ud134 &#8211; 1\ub2e8\uacc4"},"content":{"rendered":"<p>C++\uc758 template\uc744 \uc774\uc6a9\ud574\uc11c Observer\ub97c \uad6c\ud604\ud558\ub294 \uac83\uc5d0 \ub300\ud55c \ub2e8\uacc4\uc801 \uc124\uba85\uc785\ub2c8\ub2e4. \uc6d0\ubcf8\uc740 \ub370\ube0c\ud53c\uc544\uc5d0\uc11c \uae40\ud0dc\ud604(tipani)\ub2d8\uc774 \uc62c\ub824 \ub193\uc73c\uc2e0 \uae00\uc744 \uae30\ubc18\uc73c\ub85c \uc791\uc131\ud588\uc73c\uba70 \ud55c\ub2e8\uacc4 \ub354 \uc5c5\uadf8\ub808\uc774\ub4dc \ud588\uc2b5\ub2c8\ub2e4. \uc81c\uac00 \ub298 \ub290\uaef4\uc624\ub294 \uac83\uc774\uc9c0\ub9cc C++\uc758 template\uc740 \uae30\uc874\uc758 \ud074\ub798\uc2a4\uac04 \uad00\uacc4\ub3c4\uc5d0 \ud55c\uc815\ud574 \ubcfc\uc801\uc5d0 \uadf8 \ub514\uc790\uc778\uc744 \ud68d\uae30\uc801\uc73c\ub85c \uac1c\uc120\ud55c\ub2e4\ub294 \uc810\uc5d0\uc11c \uadf8 \ud310\ub3c4\ub97c \ud655 \ubc14\uafc0 \uc218 \uc788\ub294 \uac15\ub825\ud55c \uac1c\ub150\uc774\ub77c\uace0 \uc0dd\uac01\ud569\ub2c8\ub2e4. \uc544\ubb34\ucabc\ub85d \uc81c\uac00 \uae40\ud0dc\ud604\ub2d8\uc758 \uae00\uc744 \ubcf4\uace0 \ub9e4\uc6b0 \uc7ac\ubbf8\uc788\uac8c template\uc5d0 \ud55c\ubc1c\uc9dd \ub2e4\uac00\uc12f\ub4ef\uc774 \uc5ec\ub7ec\ubd84\ub3c4 \uc81c \uae00\uc744 \ud1b5\ud574 template\uc5d0 \ud55c\ubc1c\uc9dd \ub2e4\uac00 \uc124\uc218\uc788\ub2e4\uba74 \uc815\ub9d0 \uae30\uc058\uaca0\uc2b5\ub2c8\ub2e4. \ucc38\uace0\ub85c \uc774 \uae00\uc744 \uc77d\uae30 \uc804\uc5d0 Observer \ud328\ud134\uc774 \ubb34\uc5c7\uc778\uc9c0 \ud328\ud134\uc785\ubb38\uc11c\ub97c \uc0b4\ud3b4\ubcf4\uc2dc\uae38 \ubc14\ub78d\ub2c8\ub2e4. \ub610\ud55c \uc774 \uae00\uc758 \uc9c4\ud589\uc740 \ub2e8\uacc4 \ub2e8\uacc4 \uac1c\uc120\ud574 \ub098\uac00\ub294 \ud750\ub984\uc73c\ub85c \uc9c4\ud589\ub41c\ub2e4\ub294 \uc810\uc5d0 \uc720\uc758\ud558\uc2dc\uae38 \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n<p>\uba3c\uc800 1\ub2e8\uacc4\uc785\ub2c8\ub2e4. \uc544\ub798\uc758 \ucf54\ub4dc\ub294 Observer\ub4e4\uc758 \uad00\ub9ac\uc5d0 \ub300\ud55c \ucc45\uc784\uc744 \ub9e1\uace0 \uc788\ub294 Observed \ud074\ub798\uc2a4\uc785\ub2c8\ub2e4.<\/p>\n<pre>template <class T>\r\nclass Observed {\r\npublic:\r\n    Observed() {}\r\n    typedef std::list<T *> typeObservers;\r\n    virtual ~Observed() {}\r\n\r\n    void RegisterObserver(T *pOb) {\r\n        m_listObserver.push_back( pOb );\r\n    }\r\n\r\n    void UnRegisterObserver(T *pOb) {\r\n        m_listObserver.remove(pOb);\r\n    }\r\n\r\nprotected:\r\n    typeObservers m_listObserver;\r\n\r\n};<\/pre>\n<p>Observed\uac00 \uad00\ub9ac\ud558\ub294 Observer \ud074\ub798\uc2a4\uc778 Observabe \uc785\ub2c8\ub2e4. \ub2e8\uc21c\ud788 Observed\uac00 \ud638\ucd9c\ud560 Observer\uc758 OnEvent \ud568\uc218\uac00 \uc21c\uc218\uac00\uc0c1\ud568\uc218\ub85c \uc120\uc5b8\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<pre>class Observable {\r\n    virtual void OnEvent(int a) = 0;\r\n};<\/pre>\n<p>\uadf8\ub9ac\uace0 \uc544\ub798\ub294 Obserable\ub97c \uc0c1\uc18d\ubc1b\uc544 \uad6c\ud604\ud55c \ud074\ub798\uc2a4\ub4e4\uc785\ub2c8\ub2e4.<\/p>\n<pre>class Observable_A : public Observable\r\n{\r\n    virtual void OnEvent(int a) {\r\n        std::cout << \"Fire_A -> \" << a << std::endl;\r\n    }\r\n};\r\n\r\nclass Observable_B : public Observable\r\n{\r\n    virtual void OnEvent(int a) {\r\n        std::cout << \"Fire_B -> \" << a << std::endl;\r\n    }\r\n};\r\n<\/pre>\n<p>\uc774\uc81c \ub9c8\uc9c0\ub9c9\uc73c\ub85c Observed\uac00 \uc790\uc2e0\uc774 \uad00\ub9ac\ud558\uace0 \uc788\ub294 Observable\uc758 OnEvent\ub97c \ud638\ucd9c\ud574 \uc918\uc57c \ud558\ub294\ub370, Observed \ud074\ub798\uc2a4\ub294 \uc790\uc2e0\uc774 \uad00\ub9ac\ud558\uace0 \uc788\ub294 Observable\uc758 \ud0c0\uc785\uc744 \ubaa8\ub974\uae30 \ub54c\ubb38\uc5d0 Observed\uc640 Observable\uc758 \uad00\uacc4\ub97c \uc5f0\uacb0\ud574 \uc8fc\uae30 \uc704\ud55c, Observed\ub85c\ubd80\ud130 \uc0c1\uc18d\ubc1b\uc740 EventSrc \ud074\ub798\uc2a4\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n<pre>class EventSrc : public Observed<Observable>\r\n{\r\n    void Fire(int a)\r\n    {\r\n        typeObservers::itrator it;\r\n        for(it=m_listObserver.begint(); it!=m_listObserver.end; ++it) {\r\n            (*it)->OnEvent(a);\r\n        }\r\n    }\r\n};\r\n<\/pre>\n<p>\ub4dc\ub514\uc5b4 1\ub2e8\uacc4\uc758 Observer \ud328\ud134\uc758 \uad6c\ud604\uc774 \uc644\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc2e4\uc81c \uc0ac\uc6a9\ud558\ub294 \uc608\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre>int main() {\r\n    EventSrc *pES = new EventSrc();\r\n    Observable *pO_A = new Observale_A();\r\n    Observable *pO_B = new Observale_B();\r\n\r\n    pES->RegisterObserver(pOA);\r\n    pES->RegisterObserver(pOB);\r\n\r\n    pES->Fire(99);\r\n\r\n\r\n    delete pO_B;\r\n    delete pO_A;\r\n    delete pES;\r\n\r\n    return 0;\r\n}\r\n<\/pre>\n<p>1\ub2e8\uacc4\uc5d0\uc11c \uc0b0\ucd9c\ub41c \uc18c\uc2a4\ub9cc\uc73c\ub85c\ub3c4 \ucda9\ubd84\ud560 \uc218\ub3c4 \uc788\uaca0\uc9c0\ub9cc, \ud070 \ubb38\uc81c\uc810\uc774 \ud558\ub098 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\uac83\uc740 \ubc14\ub85c SRP(Single Responsiblity Principle)\ub97c \uc704\ubc18\ud55c\ub2e4\ub294 \uc0ac\uc2e4\uc785\ub2c8\ub2e4. \uc989, Obserable\ub97c \uad00\ub9ac\ud558\ub294 \ucc45\uc784\uc744 Observed\uc640 EventSrc\ub77c\ub294 \ub450\uac1c\uc758 \ud074\ub798\uc2a4\uac00 \ucc45\uc784\uc744 \ub098\ub220\uc11c \uc9c0\uace0 \uc788\ub2e4\ub294 \uc810\uc785\ub2c8\ub2e4. \uadf8\ub7f4\uc218\ubc16\uc5d0 \uc5c6\ub294 \uc774\uc720\ub294 \ubcf8\ubb38\uc5d0 \uc5b8\uae09\uc744 \ud588\uad6c\uc694. <\/p>\n<p>\uc774\uc81c \ub2e4\uc74c 2\ub2e8\uacc4 \uc774\ud6c4\ubd80\ud130\ub294 \uc774\ub7ec\ud55c SRP\uc758 \uc6d0\uce59\uc744 \uc9c0\ucf1c\ub098\uac00\ub294 \uac83\uc744 \ud574\uacb0\ubb38\uc81c\ub85c \ub2e4\ub904\ub098\uac00\uba74\uc11c \uc810\ucc28\uc801\uc73c\ub85c \uac1c\uc120\ub41c Observer \ud328\ud134\uc744 \uad6c\ud604\ud574\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>C++\uc758 template\uc744 \uc774\uc6a9\ud574\uc11c Observer\ub97c \uad6c\ud604\ud558\ub294 \uac83\uc5d0 \ub300\ud55c \ub2e8\uacc4\uc801 \uc124\uba85\uc785\ub2c8\ub2e4. \uc6d0\ubcf8\uc740 \ub370\ube0c\ud53c\uc544\uc5d0\uc11c \uae40\ud0dc\ud604(tipani)\ub2d8\uc774 \uc62c\ub824 \ub193\uc73c\uc2e0 \uae00\uc744 \uae30\ubc18\uc73c\ub85c \uc791\uc131\ud588\uc73c\uba70 \ud55c\ub2e8\uacc4 \ub354 \uc5c5\uadf8\ub808\uc774\ub4dc \ud588\uc2b5\ub2c8\ub2e4. \uc81c\uac00 \ub298 \ub290\uaef4\uc624\ub294 \uac83\uc774\uc9c0\ub9cc C++\uc758 template\uc740 \uae30\uc874\uc758 \ud074\ub798\uc2a4\uac04 \uad00\uacc4\ub3c4\uc5d0 \ud55c\uc815\ud574 \ubcfc\uc801\uc5d0 \uadf8 \ub514\uc790\uc778\uc744 \ud68d\uae30\uc801\uc73c\ub85c \uac1c\uc120\ud55c\ub2e4\ub294 \uc810\uc5d0\uc11c \uadf8 \ud310\ub3c4\ub97c \ud655 \ubc14\uafc0 \uc218 \uc788\ub294 \uac15\ub825\ud55c \uac1c\ub150\uc774\ub77c\uace0 \uc0dd\uac01\ud569\ub2c8\ub2e4. \uc544\ubb34\ucabc\ub85d \uc81c\uac00 \uae40\ud0dc\ud604\ub2d8\uc758 \uae00\uc744 \ubcf4\uace0 \ub9e4\uc6b0 \uc7ac\ubbf8\uc788\uac8c template\uc5d0 \ud55c\ubc1c\uc9dd &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=190\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;Template\uc744 \uc774\uc6a9\ud55c Observer \ud328\ud134 &#8211; 1\ub2e8\uacc4&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[14,15,16,17],"class_list":["post-190","post","type-post","status-publish","format-standard","hentry","category-design","tag-c","tag-design","tag-pattern","tag-template"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/190","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=190"}],"version-history":[{"count":1,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/190\/revisions"}],"predecessor-version":[{"id":3714,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/190\/revisions\/3714"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=190"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=190"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=190"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}