{"id":10544,"date":"2020-10-24T16:58:51","date_gmt":"2020-10-24T07:58:51","guid":{"rendered":"http:\/\/www.gisdeveloper.co.kr\/?p=10544"},"modified":"2020-10-25T09:19:29","modified_gmt":"2020-10-25T00:19:29","slug":"visitor-%ed%8c%a8%ed%84%b4-2","status":"publish","type":"post","link":"http:\/\/www.gisdeveloper.co.kr\/?p=10544","title":{"rendered":"[GoF] Visitor \ud328\ud134"},"content":{"rendered":"<h4>\ud328\ud134\uba85\uce6d<\/h4>\n<p>Visitor<\/p>\n<h4>\ud544\uc694\ud55c \uc0c1\ud669<\/h4>\n<p>\ub370\uc774\ud130\uc640 \uc774 \ub370\uc774\ud130\uc758 \ucc98\ub9ac\ub97c \ubd84\ub9ac\ud558\uc5ec \uad6c\ud604\ud558\uace0\uc790 \ud560\ub54c \uc0ac\uc6a9\ub418\ub294 \ud328\ud134\uc785\ub2c8\ub2e4. \ub370\uc774\ud130\ub294 Composite \ud328\ud134\uc73c\ub85c \uad6c\ud604\ub418\ubbc0\ub85c \uc9d1\ud569\uc744 \uad6c\uc131\ud558\ub294 \ub2e8\uc77c \uc694\uc18c \uc5ed\uc2dc \uc9d1\ud569\uc73c\ub85c \uc800\uc7a5\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc9d1\ud569\uc5d0 \ub300\ud55c \uc9d1\ud569\uc73c\ub85c \uad6c\uc131\ub41c \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\ub294 \ub85c\uc9c1\uc744 \ub3c5\ub9bd\uc801\uc73c\ub85c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h4>\uc608\uc81c \ucf54\ub4dc<\/h4>\n<p><img decoding=\"async\" src=\"http:\/\/www.gisdeveloper.co.kr\/wp-content\/uploads\/2020\/10\/visitor.png\" alt=\"\" width=\"800\" class=\"aligncenter size-full wp-image-10545\" \/><\/p>\n<p>Visitor \uc778\ud130\ud398\uc774\uc2a4\ub294 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\ub294 \ud074\ub798\uc2a4\uac00 \uad6c\ud604\ud574\uc57c\ud560 \uacf5\ud1b5 \uc778\ud130\ud398\uc774\uc2a4\uc785\ub2c8\ub2e4. \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic interface Visitor {\r\n\tvoid visit(Unit unit);\r\n}\r\n<\/pre>\n<p>\uc774 Visitor\ub97c \uad6c\ud604\ud558\ub294 \ud074\ub798\uc2a4\ub85c\ub294 SumVisitor, MaxVisitor\uacfc \uc704\uc758 \ud074\ub798\uc2a4 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc5d0\ub294 \ud45c\uc2dc\ub418\uc5b4 \uc788\uc9c0 \uc54a\uc9c0\ub9cc MinVisitor, AvgVisitor\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ub124 \ud074\ub798\uc2a4\ub294 \uac01\uac01 \ub370\uc774\ud130\uc758 \ucd1d\ud569 \uacc4\uc0b0, \ub370\uc774\ud130 \uc911 \ucd5c\ub300\uac12 \ud30c\uc545, \ub370\uc774\ud130 \uc911 \ucd5c\uc18c\uac12 \ud30c\uc545, \ub370\uc774\ud130\uc758 \ud3c9\uade0\uac12 \uacc4\uc0b0\uc785\ub2c8\ub2e4. \ub370\uc774\ud130\ub294 Unit \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud574\uc57c \ud558\uba70 \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic interface Unit {\r\n\tvoid accept(Visitor visitor);\r\n}\r\n<\/pre>\n<p>\uc774 Unit \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\ub294 Item\uc5d0\ub294 \ud558\ub098\uc758 \uc815\uc218\uac12\uc774 \uc800\uc7a5\ub418\uba70 ItemList\ub294 \uc5ec\ub7ec\uac1c\uc758 Unit \uac1d\uccb4\ub97c \ub2f4\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uba3c\uc800 Item \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class Item implements Unit {\r\n\tprivate int value;\r\n\t\r\n\tpublic Item(int value) {\r\n\t\tthis.value = value;\r\n\t}\r\n\t\r\n\tpublic int getValue() {\r\n\t\treturn value;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void accept(Visitor visitor) {\r\n\t\tvisitor.visit(this);\r\n\t}\r\n}\r\n<\/pre>\n<p>ItemList \ud074\ub798\uc2a4\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\nimport java.util.ArrayList;\r\nimport java.util.Iterator;\r\n\r\npublic class ItemList implements Unit {\r\n\tprivate String name;\r\n\t\r\n\tprivate ArrayList&lt;Unit> list = new ArrayList&lt;Unit>();\r\n\t\r\n\tpublic ItemList(String name) {\r\n\t\tthis.name = name;\r\n\t}\r\n\t\r\n\tpublic String getName() {\r\n\t\treturn this.name;\r\n\t}\r\n\t\r\n\tpublic void add(Unit unit) {\r\n\t\tlist.add(unit);\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void accept(Visitor visitor) {\r\n\t\tIterator&lt;Unit> iter = list.iterator();\r\n\t\t\r\n\t\twhile(iter.hasNext()) {\r\n\t\t\tUnit unit = iter.next();\r\n\t\t\tvisitor.visit(unit);\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc774\uc81c \uc774\ub7ec\ud55c \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\ub294 Visitor \uc778\ud130\ud398\uc774\uc2a4\uc758 \uad6c\ud604 \ud074\ub798\uc2a4\ub97c \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uba3c\uc800 SumVisitor \ud074\ub798\uc2a4\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class SumVisitor implements Visitor {\r\n\tprivate int sum = 0;\r\n\t\r\n\tpublic int getValue() {\r\n\t\treturn sum;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void visit(Unit unit) {\r\n\t\tif(unit instanceof Item) {\r\n\t\t\tsum += ((Item)unit).getValue();\r\n\t\t} else {\r\n\t\t\tunit.accept(this);\t\t\t\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>\ub2e4\uc74c\uc740 MaxVisitor \ud074\ub798\uc2a4\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class MaxVisitor implements Visitor {\r\n\tprivate int max = Integer.MIN_VALUE;\r\n\tprivate String name = null;\r\n\tprivate String visitedName = null;\r\n\t\r\n\tpublic int getValue() {\r\n\t\treturn max;\r\n\t}\r\n\t\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void visit(Unit unit) {\r\n\t\tif(unit instanceof Item) {\r\n\t\t\tint value = ((Item)unit).getValue();\r\n\t\t\tif(value > max) {\r\n\t\t\t\tmax = value;\r\n\t\t\t\tname = visitedName;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tvisitedName = ((ItemList)unit).getName();\r\n\t\t\tunit.accept(this);\t\t\t\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>\ub2e4\uc74c\uc740 MinVisitor \ud074\ub798\uc2a4\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class MinVisitor implements Visitor {\r\n\tprivate int min = Integer.MAX_VALUE;\r\n\tprivate String name = null;\r\n\tprivate String visitedName = null;\r\n\t\r\n\tpublic int getValue() {\r\n\t\treturn min;\r\n\t}\r\n\t\r\n\tpublic String getName() {\r\n\t\treturn name;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void visit(Unit unit) {\r\n\t\tif(unit instanceof Item) {\r\n\t\t\tint value = ((Item)unit).getValue();\r\n\t\t\tif(value &lt; min) {\r\n\t\t\t\tname = visitedName;\r\n\t\t\t\tmin = value;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tvisitedName = ((ItemList)unit).getName();\r\n\t\t\tunit.accept(this);\t\t\t\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>\ub2e4\uc74c\uc740 AvgVisitor \ud074\ub798\uc2a4\uc785\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class AvgVisitor implements Visitor {\r\n\tprivate int sum = 0;\r\n\tprivate int count = 0;\r\n\tpublic double getValue() {\r\n\t\treturn sum \/ count;\r\n\t}\r\n\t\r\n\t@Override\r\n\tpublic void visit(Unit unit) {\r\n\t\tif(unit instanceof Item) {\r\n\t\t\tsum += ((Item)unit ).getValue();\r\n\t\t\tcount++;\r\n\t\t} else {\r\n\t\t\tunit.accept(this);\t\t\t\r\n\t\t}\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc9c0\uae08\uae4c\uc9c0\uc758 \ud074\ub798\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \uc608\uc81c \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"java\">\r\npackage tstThread;\r\n\r\npublic class Main {\r\n\tpublic static void main(String[] args) {\r\n\t\tItemList root = new ItemList(\"root\");\r\n\t\troot.add(new Item(10));\r\n\t\troot.add(new Item(20));\r\n\t\troot.add(new Item(40));\r\n\t\t\r\n\t\tItemList subList1 = new ItemList(\"sub1\");\r\n\t\tsubList1.add(new Item(5));\r\n\t\tsubList1.add(new Item(16));\r\n\t\tsubList1.add(new Item(36));\r\n\t\t\r\n\t\tItemList subList2 = new ItemList(\"sub2\");\r\n\t\tsubList2.add(new Item(50));\r\n\t\tsubList2.add(new Item(70));\r\n\t\t\r\n\t\tItemList subList3 = new ItemList(\"sub2-sub\");\r\n\t\tsubList3.add(new Item(8));\r\n\t\tsubList3.add(new Item(21));\r\n\t\tsubList3.add(new Item(37));\r\n\t\t\r\n\t\troot.add(subList1);\r\n\t\troot.add(subList2);\r\n\t\tsubList2.add(subList3);\r\n\t\t\r\n\t\tSumVisitor sum = new SumVisitor();\r\n\t\troot.accept(sum);\r\n\t\tSystem.out.println(\"Sum: \" + sum.getValue());\r\n\t\t\r\n\t\tMaxVisitor max = new MaxVisitor();\r\n\t\troot.accept(max);\r\n\t\tSystem.out.println(\"Max: \" + max.getValue() + \" @\" + max.getName());\r\n\t\t\r\n\t\tMinVisitor min = new MinVisitor();\r\n\t\troot.accept(min);\r\n\t\tSystem.out.println(\"Min: \" + min.getValue() + \" @\" + min.getName());\r\n\t\t\r\n\t\tAvgVisitor avg = new AvgVisitor();\r\n\t\troot.accept(avg);\r\n\t\tSystem.out.println(\"Avg: \" + avg.getValue());\r\n\t}\r\n}\r\n<\/pre>\n<p>\uc2e4\ud589 \uacb0\uacfc\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class='code'>\r\nSum: 313\r\nMax: 70 @sub2\r\nMin: 5 @sub1\r\nAvg: 28.0\r\n<\/pre>\n<div style='background:#efefef;border-radius:8px;padding:12px 24px'>\uc774 \uae00\uc740 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc124\uacc4\uc758 \uae30\ubc18\uc774 \ub418\ub294 GoF\uc758 \ub514\uc790\uc778\ud328\ud134\uc5d0 \ub300\ud55c \uac15\uc758\uc790\ub8cc\uc785\ub2c8\ub2e4. \uc644\uc804\ud55c \uc2e4\uc2b5\uc744 \uc704\ud574 \uc774 \uae00\uc5d0\uc11c \uc18c\uac1c\ud558\ub294 \ud074\ub798\uc2a4 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uacfc \uc608\uc81c \ucf54\ub4dc\ub294 \uc644\uc804\ud558\uac8c \uc2e4\ud589\ub418\ub3c4\ub85d \uc81c\uacf5\ub418\uc9c0\ub9cc, \uc0c1\ub300\uc801\uc73c\ub85c \uc608\uc81c \ucf54\ub4dc\uc640 \uad00\ub828\ub41c \uc124\uba85\uc774 \ud568\ucd95\uc801\uc73c\ub85c \uc81c\uacf5\ub418\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc5d0 \ub300\ud574 \uad81\uae08\ud55c \uc810\uc774 \uc788\uc73c\uba74 \ub313\uae00\uc744 \ud1b5\ud574 \ub0a8\uaca8\uc8fc\uc2dc\uae30 \ubc14\ub78d\ub2c8\ub2e4.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\ud328\ud134\uba85\uce6d Visitor \ud544\uc694\ud55c \uc0c1\ud669 \ub370\uc774\ud130\uc640 \uc774 \ub370\uc774\ud130\uc758 \ucc98\ub9ac\ub97c \ubd84\ub9ac\ud558\uc5ec \uad6c\ud604\ud558\uace0\uc790 \ud560\ub54c \uc0ac\uc6a9\ub418\ub294 \ud328\ud134\uc785\ub2c8\ub2e4. \ub370\uc774\ud130\ub294 Composite \ud328\ud134\uc73c\ub85c \uad6c\ud604\ub418\ubbc0\ub85c \uc9d1\ud569\uc744 \uad6c\uc131\ud558\ub294 \ub2e8\uc77c \uc694\uc18c \uc5ed\uc2dc \uc9d1\ud569\uc73c\ub85c \uc800\uc7a5\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc9d1\ud569\uc5d0 \ub300\ud55c \uc9d1\ud569\uc73c\ub85c \uad6c\uc131\ub41c \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\ub294 \ub85c\uc9c1\uc744 \ub3c5\ub9bd\uc801\uc73c\ub85c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\uc81c \ucf54\ub4dc Visitor \uc778\ud130\ud398\uc774\uc2a4\ub294 \ub370\uc774\ud130\ub97c \ucc98\ub9ac\ud558\ub294 \ud074\ub798\uc2a4\uac00 \uad6c\ud604\ud574\uc57c\ud560 \uacf5\ud1b5 \uc778\ud130\ud398\uc774\uc2a4\uc785\ub2c8\ub2e4. \ucf54\ub4dc\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. package tstThread; public interface &hellip; <\/p>\n<p class=\"link-more\"><a href=\"http:\/\/www.gisdeveloper.co.kr\/?p=10544\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;[GoF] Visitor \ud328\ud134&#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":[],"class_list":["post-10544","post","type-post","status-publish","format-standard","hentry","category-design"],"_links":{"self":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10544","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=10544"}],"version-history":[{"count":3,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10544\/revisions"}],"predecessor-version":[{"id":10550,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=\/wp\/v2\/posts\/10544\/revisions\/10550"}],"wp:attachment":[{"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=10544"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=10544"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.gisdeveloper.co.kr\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=10544"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}