{"id":284,"date":"2020-04-23T13:02:55","date_gmt":"2020-04-23T04:02:55","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=284"},"modified":"2026-05-08T22:05:27","modified_gmt":"2026-05-08T13:05:27","slug":"design-pattern-decorator","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2020\/04\/23\/284\/","title":{"rendered":"Design Pattern: Decorator"},"content":{"rendered":"\n<p>Decorator pattern\uc740 \uac1d\uccb4\uc758 \uae30\ub2a5\uc744 \ub3d9\uc801\uc73c\ub85c \ud655\uc7a5\ud558\uace0\uc790 \ud560 \ub54c, \ub610\ub294 \uc0c1\uc18d\ubc1b\uc744 \ud074\ub798\uc2a4\uac00 \uc0c1\uc18d\uc774 \ubd88\uac00\ub2a5\ud560 \ub54c \uc0ac\uc6a9\ub418\ub294 \ub514\uc790\uc778 \ud328\ud134\uc774\ub2e4. \uac8c\uc784\uc758 \uc608\ub97c \ub4e4\uba74 \ub9f5\uc744 \ub3cc\uc544\ub2e4\ub2c8\ub2e4\uac00 \uc77c\uc2dc\uc801\uc73c\ub85c \uacf5\uaca9\ub825\uc774 \uac15\ud654\ub418\uac70\ub098, \uc18d\ub3c4\uac00 \ube68\ub77c\uc9c0\uac70\ub098, \ubc29\uc5b4\ub825\uc774 \uac15\ud654\ub418\ub294 \uc544\uc774\ud15c\uc744 \uba39\ub294 \uacbd\uc6b0\ub97c \uc0dd\uac01\ud574 \ubcfc \uc218 \uc788\ub2e4.<br>\uc774\ub7f0 \ud6a8\uacfc\ub4e4\uc740 \uc911\ucca9\ub418\uc5b4 \uc801\uc6a9\ub3c4 \uac00\ub2a5\ud558\ub2e4. \ub610 \uc775\uc219\ud55c \uc608\ub85c\ub294 text editor\ub97c \uc0dd\uac01\ud574\ubcfc \uc218 \uc788\ub2e4. \ubcfc\ub4dc, \uc774\ud0e4\ub9ad, \uce7c\ub77c\ubcc0\uacbd\ub4f1 \uae30\ubcf8 \ud14d\uc2a4\ud2b8\ub97c \uafb8\uba70\uc8fc\ub294 \uae30\ub2a5\ub4e4\uc774 \uc774\uc5d0 \ud574\ub2f9\ud55c\ub2e4.  \uc774\uc5ed\uc2dc \uc911\ubcf5 \uc801\uc6a9\uc774\ub41c\ub2e4.<br> \uc790\ubc14\uc5d0\uc11c\uc640 \uac19\uc774 \uc2a4\ud2b8\ub9bc \uc785\ucd9c\ub825\uc5d0\uc11c\ub3c4 \ubcfc \uc218 \uc788\ub2e4. \uc2a4\ud2b8\ub9bc\uc73c\ub85c \uc77d\uc5b4\uc624\ub294 \ub370\uc774\ud130\ub97c encoding\/decoding \ud55c\ub2e4\uac70\ub098 \uc555\ucd95\uc744 \ud560\uc218\ub3c4 \uc788\ub2e4. \ub610\ub294 \ub458 \ub2e4 \uc801\uc6a9\ub3c4 \uac00\ub2a5\ud558\ub2e4.<\/p>\n\n\n\n<p>\uc774\ucc98\ub7fc \uac1d\uccb4\uc758 \uae30\ub2a5\uc744 \ud655\uc7a5\ud574 \uafb8\uba70\uc8fc\ub294 \ubc29\ubc95\uc740 \uc0c1\uc18d\uc744 \ud1b5\ud574\uc11c \uac00\ub2a5\ud558\uc9c0\ub9cc, \uc55e\uc5d0\uc11c \uc5b8\uae09\ud588\ub4ef\uc774 \uc0c1\uc18d\uc774 \ubd88\uac00\ub2a5\ud560 \uc218\ub3c4 \uc788\uace0, \uc0c1\uc18d\uc774 static\ud55c \ud655\uc7a5\uc774\uae30 \ub54c\ubb38\uc5d0 \ub3d9\uc801 \ud655\uc7a5\uc5d0\ub294 \uc5b4\uc6b8\ub9ac\uc9c0 \uc54a\ub294\ub2e4. \ub7f0\ud0c0\uc784\uc73c\ub85c \uc774\ub7f0 \ub3d9\uc791\uc774 \uac00\ub2a5\ud55c \ud55c\uac00\uc9c0 \ubc29\ubc95\uc740 aggregation\uc744 \uc774\uc6a9\ud558\ub294 \uac83\uc774\ub2e4. <\/p>\n\n\n\n<p>aggregation\uc774\ub780, \uc0c1\uc18d\uad00\uacc4(is) \ub300\uc2e0\uc5d0 \uac1d\uccb4\ub97c \ub808\ud37c\ub7f0\uc2a4 \uba64\ubc84\ub85c \ub4e4\uace0\uc788\ub294\uac78 \ub9d0\ud55c\ub2e4. \uac01\uac01\uc774 \uac1c\ubcc4\uc801\uc778 \uac1d\uccb4\uba74\uc11c parent\uc5d0\uc120 \uba64\ubc84\uc778 child \uac1d\uccb4\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uace0, \uad00\ub828 \uae30\ub2a5\ub4e4\uc744 \uc704\uc784\ud558\uc5ec \uc2e4\ud589\ud558\uac8c \ub41c\ub2e4.(use) <\/p>\n\n\n\n<p>\uc5ec\uae30\uc11c \uc7a0\uae50, \uc6a9\uc5b4\uc815\ub9ac\ub9cc \ud558\uc790\uba74, \ube44\uc2b7\ud55c \uc6a9\uc5b4\ub85c composition\uc774 \uc788\ub294\ub370 \uad6c\ud604\ubc29\ubc95\uc740 \ub3d9\uc77c\ud558\ub098, composition\uc740 parent\uc5c6\uc774\ub294 child \uac1d\uccb4\uac00 \uc758\ubbf8\uac00 \uc5c6\ub294 \uacbd\uc6b0\ub97c \ub9d0\ud55c\ub2e4.(own) <a href=\"https:\/\/softwareengineering.stackexchange.com\/questions\/61376\/aggregation-vs-composition\">stackexchange<\/a>\uc5d0\uc11c \ubcf8 \uc608\ub97c\ub4e4\uba74 Text editor\uac00 buffer\ub97c \uac00\uc9c0\uace0(own) file\uc744 \uc0ac\uc6a9(use)\ud55c\ub2e4. \ucc28\uc774\ub97c \uba85\ud655\ud788 \uc54c \uc218 \uc788\ub294 \uac74, Text editor\uac00 destroy\ub418\uba74 buffer\ub3c4 \uac19\uc774 destroy\ub418\uc9c0\ub9cc, file\uc740 text editor\uc758 life cycle\uacfc \ubb34\uad00\ud558\ub2e4.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<p>\uadf8\ub807\ub2e4\uba74 decorator design pattern\uc740 \uc5b4\ub5bb\uac8c \uad6c\uc131\ud574\uc57c\ud560\uae4c? \uc77c\ub2e8 \uc624\ub9ac\uc9c0\ub110 Component\uc640 Decorator \ud074\ub798\uc2a4\ub97c \uc0dd\uac01\ud574\ubcfc \uc218 \uc788\ub2e4. \uae30\ub2a5\uc758 \ud655\uc7a5\uc774\uc9c0\ub9cc \ud3ec\ud568\uad00\uacc4\ub294 \uc5ed\uc73c\ub85c decorator\uac00 component\ub97c \uba64\ubc84\ub85c \uac16\uace0, component\uc758 \uba54\uc18c\ub4dc\ub97c \ud638\ucd9c\ud558\uba70 \uadf8 \uc804\ud6c4\ub85c \ucd94\uac00 \uae30\ub2a5\uc744 \uad6c\ud604\ud574\uc8fc\uba74 \ub420\uac70 \uac19\ub2e4. \ubcc0\ud654\uac00 \uc0dd\uae30\ub294 \ubd80\ubd84\uc740 decorator\ub4e4\uc774\uba70, component\uc640 \ucee4\ud50c\ub9c1\uc744 \ub0ae\ucd94\uae30\uc704\ud574 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud55c\ub2e4. \ucd5c\uc885\uc801\uc73c\ub85c\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 UML\uc774 \uadf8\ub824\uc9c4\ub2e4.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"400\" height=\"317\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/04\/400px-Decorator_UML_class_diagram.svg_.png\" alt=\"\" class=\"wp-image-457\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/400px-Decorator_UML_class_diagram.svg_.png 400w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/400px-Decorator_UML_class_diagram.svg_-300x238.png 300w\" sizes=\"auto, (max-width: 400px) 100vw, 400px\" \/><\/figure>\n<\/div>\n\n\n<p>UML\uc5d0\uc11c \uc18d\uc774 \ube48 \ub9c8\ub984\ubaa8\uac00 aggregation\uc774\uace0 \uac80\uc740\uc0c9\uc73c\ub85c \uce60\ud55c \ub9c8\ub984\ubaa8\uac00 composition\uc744 \ud45c\ud604\ud55c\ub2e4. <\/p>\n\n\n\n<p>\uc774\uc81c, \uad6c\ud604\uc744 \ud574\ubcf4\uc790. \uad6c\ud604\uc740 \uc55e\uc5d0\uc11c \uc608\ub97c \ub4e4\uc5c8\ub358, \uc9c1\uad00\uc801\uc73c\ub85c \uc54c\uae30 \uc26c\uc6b4 html text editor\ub97c \uc608\ub85c\ub4e4\uc5b4\ubcf4\uaca0\ub2e4. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kotlin<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package decorator\n\ninterface IText{\n    fun getHtml(): String;\n}\n\nclass PlainText(argText: String): IText{\n    private var text: String = argText\n\n    override fun getHtml(): String {\n        return text\n    }\n\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">package<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">decorator<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">interface<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">(): <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">PlainText<\/span><span style=\"color: #ADBAC7\">(argText: <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">): <\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> text: <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> argText<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">(): <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> text<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Component\uc5d0 \ud574\ub2f9\ud558\ub294 \uc778\ud130\ud398\uc774\uc2a4\uc640 concrete class\ub97c \ub9cc\ub4e4\uc5c8\ub2e4. \uc0dd\uc131\ud55c \ud14d\uc2a4\ud2b8\uc758 html \ud615\uc2dd\uc744 \uac00\uc838\uc624\ub294 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub9cc\ub4e4\uc5c8\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package decorator\n\nabstract class HTMLDecorator(argText: IText): IText{\n    private var textComponent: IText = argText\n\n    override fun getHtml(): String{\n        return textComponent.getHtml()\n    }\n}\n\nclass BoldDecorator(argText: IText): HTMLDecorator(argText){\n    override fun getHtml(): String {\n        \/\/return \"&lt;B>${super.getHtml()}&lt;\/B>\"\n        return \"&lt;B>${super.getHtml()}&lt;\/B>\"\n    }\n}\n\nclass ItalicDecorator(argText: IText): HTMLDecorator(argText){\n    override fun getHtml(): String {\n        return \"&lt;I>${super.getHtml()}&lt;\/I>\"\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">package<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">decorator<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">HTMLDecorator<\/span><span style=\"color: #ADBAC7\">(argText: <\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\">): <\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">var<\/span><span style=\"color: #ADBAC7\"> textComponent: <\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> argText<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">(): <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> textComponent.<\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">BoldDecorator<\/span><span style=\"color: #ADBAC7\">(argText: <\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\">): <\/span><span style=\"color: #F69D50\">HTMLDecorator<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">argText<\/span><span style=\"color: #ADBAC7\">){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">(): <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #768390\">\/\/return &quot;&lt;B&gt;${super.getHtml()}&lt;\/B&gt;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;&lt;B&gt;${<\/span><span style=\"color: #6CB6FF\">super<\/span><span style=\"color: #96D0FF\">.<\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #96D0FF\">()}&lt;\/B&gt;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">ItalicDecorator<\/span><span style=\"color: #ADBAC7\">(argText: <\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\">): <\/span><span style=\"color: #F69D50\">HTMLDecorator<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">argText<\/span><span style=\"color: #ADBAC7\">){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">(): <\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;&lt;I&gt;${<\/span><span style=\"color: #6CB6FF\">super<\/span><span style=\"color: #96D0FF\">.<\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #96D0FF\">()}&lt;\/I&gt;&quot;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>\ub370\ucf54\ub808\uc774\ud130 \uc5ed\uc2dc, IText \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0c1\uc18d\ubc1b\ub294\ub2e4. adapter pattern\uacfc \uc720\uc0ac\ud558\uac8c \ub290\ub084 \uc218\ub3c4 \uc788\uaca0\ub2e4. abstract class\uc5d0\uc120 \uc0dd\uc131\uc790\ub85c IText \uc778\ud130\ud398\uc774\uc2a4\ub97c \uac16\ub294 \uac1d\uccb4\uc758 \ub808\ud37c\ub7f0\uc2a4\ub97c \uc800\uc7a5\ud55c\ub2e4. aggregation\uc73c\ub85c \ud45c\ud604\ub41c \ubd80\ubd84\uc758 \uad6c\ud604\uc774\ub2e4. abstract class\uc758 getHtml()\uc5d0\uc120 \ub2f4\uc544\ub454 \ub808\ud37c\ub7f0\uc2a4\uc758 getHtml()\uc744 \ud638\ucd9c\ud560 \ubfd0\uc774\ub2e4. <\/p>\n\n\n\n<p>abstract decorator class\ub97c \uc0c1\uc18d\ubc1b\uc740 BoldDecorator, ItalicDecorator\uc5d0\uc11c super.getHtml()\ub85c \uac00\uc838\uc628 \ud14d\uc2a4\ud2b8\uc758 \uc55e\ub4a4\uc5d0 \uc6d0\ud558\ub294 html tag\ub85c \uafb8\uba70\uc11c \uac12\uc744 \ub3cc\ub824\uc8fc\uace0 \uc788\ub2e4. <\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>package decorator\n\nfun main(args: Array&lt;String>){\n    val plainText: IText = PlainText(\"Decorator Pattern!\")\n    val decoratedText: IText = ItalicDecorator( BoldDecorator(plainText))\n    println(plainText.getHtml())\n    println(decoratedText.getHtml())\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">package<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">decorator<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">fun<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">(args: <\/span><span style=\"color: #F69D50\">Array<\/span><span style=\"color: #ADBAC7\">&lt;<\/span><span style=\"color: #F69D50\">String<\/span><span style=\"color: #ADBAC7\">&gt;){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> plainText: <\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">PlainText<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Decorator Pattern!&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">val<\/span><span style=\"color: #ADBAC7\"> decoratedText: <\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">ItalicDecorator<\/span><span style=\"color: #ADBAC7\">( <\/span><span style=\"color: #DCBDFB\">BoldDecorator<\/span><span style=\"color: #ADBAC7\">(plainText))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(plainText.<\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(decoratedText.<\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">())<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>decorator\uc758 \uc0ac\uc6a9\ubc29\ubc95\uc740 \uc0dd\uc131\uc790\uc5d0 \uc778\uc790\ub85c \ub118\uae30\ub294 \uac83\uc774\ub2e4. component\uc640 decorator\ubaa8\ub450 \uac19\uc740 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uac16\uace0 \uc788\uc73c\ubbc0\ub85c \uc5b4\ub5a0\ud55c \uac1d\uccb4\uac00 \ub118\uc5b4\uac00\ub3c4 \uc0c1\uad00\uc5c6\ub2e4. \ubcf4\ub2e4\uc2dc\ud53c, BoldDecorator\ub97c \uc0dd\uc131\ud574\uc11c ItalicDecorator\uc5d0 \ub118\uaca8\uc8fc\uba74, getHtml \ud638\ucd9c\uc774 \uc5f0\uc1c4\uc801\uc73c\ub85c \uc791\ub3d9\ud558\uc5ec \uc21c\uc11c\ub300\ub85c \ubaa8\ub4e0 decorator\uac00 \uc801\uc6a9\ub41c\ub2e4. <\/p>\n\n\n\n<p>decoratedText\uac1d\uccb4\uac00 destory\ub418\uc5b4\ub3c4 plainText\uc5d0\ub294 \uc601\ud5a5\uc774 \uc5c6\uc73c\ubbc0\ub85c aggregation \uad00\uacc4\uc778 \uac83\uc744 \ud655\uc778\ud560 \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<p>Kotlin\uc5d0\uc11c \uc5b8\uae09\ud558\uace0 \ub118\uc5b4\uac08\uac8c \uc788\ub294\ub370, <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/delegation.html\">delegation<\/a>\uc5d0 \uad00\ub828\ub41c \ub0b4\uc6a9\uc774\ub2e4. \uc778\ud130\ud398\uc774\uc2a4\uac00 \ubc29\ub300\ud55c \uacbd\uc6b0, \uc791\uc740 decoration\uc744 \uc704\ud574 \ubaa8\ub4e0 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uad6c\ud604\ud558\ub294\uc77c\uc740 \ubd80\ub2f4\uc774 \ub41c\ub2e4. \uc774\ub97c \uc704\ud574, &#8216;<a href=\"https:\/\/kotlinlang.org\/docs\/reference\/delegation.html\">by<\/a>&#8216;\ub77c\ub294 \ud0a4\uc6cc\ub4dc\ub97c \uc368\uc11c \ucd94\uc0c1 \uba54\uc18c\ub4dc\ub4e4\uc774 \uc774\ubbf8 \uad6c\ud604\ub41c \uac1d\uccb4\uc5d0\uac8c \uc704\uc784\ud560 \uc218 \uc788\ub2e4. \uc5b8\uc5b4\ub808\ubca8\uc5d0\uc11c <a href=\"https:\/\/kotlinlang.org\/docs\/reference\/delegation.html\">delegation<\/a>\uc744 \uad6c\ud604\ud574 \ub1a8\ub2e4\uace0 \ubcf4\uba74 \ub418\uaca0\ub2e4. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">C#<\/h3>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>\nnamespace Decorator\n{\n    interface IText\n    {\n        string getHtml();\n    }\n\n    public class PlainText : IText\n    {\n        private string text;\n\n        public PlainText(string argText)\n        {\n            text = argText;\n        }\n\n        public string getHtml()\n        {\n            return text;\n        }\n    }\n\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">namespace<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Decorator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">interface<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">IText<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">string<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">PlainText<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">IText<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">string<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">text<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">PlainText<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">string<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">argText<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            text <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> argText;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">string<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> text;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>Kotlin\uacfc \ub2ec\ub9ac \uc778\ud130\ud398\uc774\uc2a4 \uc0c1\uc18d\uc2dc\uc5d0 override\ub97c \uc4f0\uc9c0 \uc54a\ub294\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>using System.Collections;\nusing System.Collections.Generic;\nusing UnityEngine;\n\nnamespace Decorator\n{\n    abstract class HTMLDecorator : IText\n    {\n        private IText textComponent;\n\n        public HTMLDecorator(IText textObj)\n        {\n            textComponent = textObj;\n        }\n\n        public virtual string getHtml()\n        {\n            return textComponent.getHtml();\n        }\n    }\n\n    class BoldDecorator : HTMLDecorator\n    {\n        public BoldDecorator(IText textObj) : base(textObj) { }\n\n        public override string getHtml()\n        {\n            return \"&lt;B>\" + base.getHtml() + \"&lt;\/B>\";\n        }\n\n    }\n\n    class ItalicDecorator : HTMLDecorator\n    {\n        public ItalicDecorator(IText textObj) : base(textObj) { }\n\n        public override string getHtml()\n        {\n            return \"&lt;I>\" + base.getHtml() + \"&lt;\/I>\";\n        }\n    }\n}<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">using<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">System<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #F69D50\">Collections<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">using<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">System<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #F69D50\">Collections<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #F69D50\">Generic<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">using<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">UnityEngine<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">namespace<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Decorator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">HTMLDecorator<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">IText<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">textComponent<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">HTMLDecorator<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">textObj<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            textComponent <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> textObj;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">virtual<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">string<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> textComponent.<\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">BoldDecorator<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">HTMLDecorator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">BoldDecorator<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">textObj<\/span><span style=\"color: #ADBAC7\">) : <\/span><span style=\"color: #6CB6FF\">base<\/span><span style=\"color: #ADBAC7\">(textObj) { }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">string<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;&lt;B&gt;&quot;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">base<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;&lt;\/B&gt;&quot;<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">ItalicDecorator<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">HTMLDecorator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">ItalicDecorator<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">textObj<\/span><span style=\"color: #ADBAC7\">) : <\/span><span style=\"color: #6CB6FF\">base<\/span><span style=\"color: #ADBAC7\">(textObj) { }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">override<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">string<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;&lt;I&gt;&quot;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">base<\/span><span style=\"color: #ADBAC7\">.<\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;&lt;\/I&gt;&quot;<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>getHtml \uba54\uc18c\ub4dc\ub97c \uc11c\ube0c\ud074\ub798\uc2a4\uac00 override\ud558\uae30 \uc704\ud574\uc11c virtual \ud0a4\uc6cc\ub4dc\ub97c \uc0ac\uc6a9\ud588\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>using UnityEngine;\n\nnamespace Decorator\n{\n    public class HTMLClient : MonoBehaviour\n    {\n        \/\/ Start is called before the first frame update\n        void Start()\n        {\n            IText plainText = new PlainText(\"Decorator Pattern!\");\n            IText decoratedText = new ItalicDecorator(new BoldDecorator(plainText));\n\n            Debug.Log(plainText.getHtml());\n            Debug.Log(decoratedText.getHtml());\n        }\n\n    }\n\n}\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">using<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">UnityEngine<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">namespace<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Decorator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">{<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">HTMLClient<\/span><span style=\"color: #ADBAC7\"> : <\/span><span style=\"color: #F69D50\">MonoBehaviour<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #768390\">        \/\/ Start is called before the first frame update<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">Start<\/span><span style=\"color: #ADBAC7\">()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">plainText<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">PlainText<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Decorator Pattern!&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F69D50\">IText<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">decoratedText<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">ItalicDecorator<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">new<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">BoldDecorator<\/span><span style=\"color: #ADBAC7\">(plainText));<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            Debug.<\/span><span style=\"color: #DCBDFB\">Log<\/span><span style=\"color: #ADBAC7\">(plainText.<\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            Debug.<\/span><span style=\"color: #DCBDFB\">Log<\/span><span style=\"color: #ADBAC7\">(decoratedText.<\/span><span style=\"color: #DCBDFB\">getHtml<\/span><span style=\"color: #ADBAC7\">());<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    }<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"377\" height=\"111\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/04\/decorator_pattern.png\" alt=\"\" class=\"wp-image-465\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/decorator_pattern.png 377w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/decorator_pattern-300x88.png 300w\" sizes=\"auto, (max-width: 377px) 100vw, 377px\" \/><figcaption class=\"wp-element-caption\">Output<\/figcaption><\/figure>\n<\/div>\n\n\n<p>\uc758\ub3c4\ud558\uac74 \uc544\ub2c8\uc5c8\uc9c0\ub9cc \uc7bc\uc788\ub294\uac8c \ubcf4\uc774\ub294\ub370, html\ud0dc\uadf8\ub97c \uc37c\ub354\ub2c8 \uc2e4\uc81c\ub85c bold\uc640 italic\uc774 \uc801\uc6a9\ub418\uc5b4 \ud45c\uc2dc\ub418\ub294\uac78 \ubcfc \uc218 \uc788\ub2e4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Python<\/h3>\n\n\n\n<p>\ud30c\uc774\uc36c\uc5d0\uc11c OOP\uc801 \ub514\uc790\uc778\uc744 \uc801\uc6a9\ud560 \ub54c\ub9c8\ub2e4 \uc774\uac8c \ub9de\ub294\uac74\uc9c0 \uac08\ub4f1\uc774 \uc628\ub2e4. OOP\ub97c \uc704\ud574 \ub9cc\ub4e4\uc5b4\uc9c4 \uae30\ubd84\uc774 \uc548\ub4e4\uae30 \ub54c\ubb38\uc774\ub2e4. \uadf8\ub798\uc11c \uc870\uae08 \ubc29\ud5a5\uc744 \ud2c0\uc5b4\ubcf4\uace0\uc790 \ud55c\ub2e4. <\/p>\n\n\n\n<p>decorator\ub294 \ud30c\uc774\uc36c \uc5b8\uc5b4\ub808\ubca8\uc5d0\uc11c \uc9c0\uc6d0\ud558\uace0 \uc788\ub2e4. \uc774\ub294 \ud568\uc218\uac00 first-class object\uc774\uae30 \ub54c\ubb38\uc774\ub2e4. \uac04\ub2e8\ud558\uac8c\ub9cc \uc598\uae30\ud558\uba74, \ud568\uc218\uac00 \ubcc0\uc218\ub098 \uc778\uc790\ub4e4\uacfc \ub3d9\ub4f1\ud55c \ub808\ubca8\uc5d0 \uc788\uace0 \uad6c\ubcc4\ud558\uc9c0 \uc54a\ub294\ub2e4\ub294 \uc598\uae30\ub2e4. \uadf8\ub798\uc11c \ud568\uc218\ub97c \uc778\uc790\ub85c \ub118\uae30\uace0 \ub9ac\ud134\uac12\uc73c\ub85c \ub3cc\ub824\uc904 \uc218\ub3c4 \uc788\ub2e4. \uad00\ub828\ud574\uc11c\ub294 <a href=\"https:\/\/realpython.com\/primer-on-python-decorators\/\">Real Python\uc5d0\uc11c \uc798 \uc815\ub9ac\ub41c \uae00<\/a>\uc774 \uc788\uc73c\ub2c8 \ucc38\uace0\ud558\uae30 \ubc14\ub780\ub2e4.<\/p>\n\n\n\n<p>\uc774\ub7f0 \uc774\uc720\ub85c \ud30c\uc774\uc36c\uc5d0\uc11c\ub294 \ud568\uc218 \uc548\uc5d0 \ud568\uc218\ub97c \uc815\uc758\ud560 \uc218\ub3c4 \uc788\ub2e4. \uadf8\ub798\uc11c \ub2e4\uc74c\ucc98\ub7fc \uc0ac\uc6a9\uc774 \uac00\ub2a5\ud558\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>def my_decorator(func):\n    def wrapper():\n        print(\"before func\")\n        func()\n        print(\"after func\")\n    return wrapper\n\ndef plain_func():\n    print(\"I'm here!\")\n\ndecorated = my_decorator(plain_func)\ndecorated()<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">my_decorator<\/span><span style=\"color: #ADBAC7\">(func):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">wrapper<\/span><span style=\"color: #ADBAC7\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;before func&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        func()<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;after func&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> wrapper<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">plain_func<\/span><span style=\"color: #ADBAC7\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #6CB6FF\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;I&#39;m here!&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">decorated <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> my_decorator(plain_func)<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">decorated()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>before func\nI'm here!\nafter func<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F69D50\">before<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">func<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">I<\/span><span style=\"color: #F69D50\">&#39;m here!<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">after func<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>my_decorator\ub294 \uc778\uc790\ub85c \ud568\uc218\ub97c \ubc1b\uace0, \uc774\ub97c \ud3ec\ud568\ud558\ub294 wrapper function\uc744 \uc815\uc758\ud558\uc5ec \uadf8 \ud568\uc218\ub97c \ub9ac\ud134\ud558\uace0 \uc788\ub2e4. \uc0ac\uc6a9\ubc29\ubc95\ub3c4 \ud568\uc218 plain_func\ub97c \uc778\uc790\ub85c \ub118\uae30\uace0 \ub9ac\ud134\ubc1b\uc740 \ud568\uc218\ub97c \ubcc0\uc218\uc5d0 \ud560\ub2f9\ud588\ub2e4\uac00 \ud568\uc218\ucc98\ub7fc \uc0ac\uc6a9\ud55c\ub2e4. \ucf54\ub4dc\uc5d0\uc11c \ubcf4\uc774\ub4ef\uc774 \ud568\uc218\uc5d0\uc11c \uad04\ud638\ub9cc \ube7c\uba74 \ud568\uc218\uc758 \ub808\ud37c\ub7f0\uc2a4\ucc98\ub7fc \ub3d9\uc791\ud558\uace0 \uc788\ub2e4.<\/p>\n\n\n\n<p>OOP\uc801\uc778 \ub514\uc790\uc778\uc73c\ub85c python\uc5d0\uc11c\ub3c4 decorator pattern\uc744 \uad6c\ud604\ud560 \uc218 \uc788\uc9c0\ub9cc, \uc720\uc5f0\ud55c \uc5b8\uc5b4\uc801 \ud2b9\uc131\uc73c\ub85c \ud568\uc218\uc5d0 \ub300\ud55c decorator\uc0ac\uc6a9\uc774 \uc790\uc5f0\uc2a4\ub7fd\ub2e4. \uadf8\ub807\uc9c0\ub9cc, \uc0ac\uc6a9\uc774 \uc880 \ubc88\uac70\ub85c\uc6b4\ub370 &#8216;pie syntax&#8217;\ub77c\uace0 \ubd88\ub9ac\ub294 \uc544\uc8fc \uac04\ub2e8\ud55c \ubc29\ubc95\uc744 \uc81c\uacf5\ud55c\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>@my_decorator\ndef plain_func2():\n    print(\"Who am I?\")\n\n\nplain_func2()<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #DCBDFB\">@my_decorator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">plain_func2<\/span><span style=\"color: #ADBAC7\">():<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #6CB6FF\">print<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Who am I?&quot;<\/span><span style=\"color: #ADBAC7\">)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">plain_func2()<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(1 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>before func\nWho am I?\nafter func<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F69D50\">before<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">func<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">Who<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">am<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">I?<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F69D50\">after<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">func<\/span><\/span><\/code><\/pre><\/div>\n\n\n\n<p>my_decorator\uc758 \uc815\uc758\ub294 \uc55e\uc5d0\uc11c\uc640 \uac19\ub2e4. pie syntax\ub780, &#8216;@&#8217; \ubaa8\uc591\uc774 pie\uac19\uace0 &#8216;py&#8217;thon\uc5d0\uc11c \ub530\uc628 \uc57d\uac04\uc758 \uc5b8\uc5b4\uc720\ud76c \uba85\uba85\uc73c\ub85c \ubcf4\uc778\ub2e4. \uc544\ubb4f\ud2bc \ub9e4\uc6b0 \ub2e8\uc21c\ud558\uac8c decorator\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4. \uc790\uc8fc\uc0ac\uc6a9\ud558\ub294 @dataclass\ub3c4 \uc0ac\uc2e4\uc740 \ud074\ub798\uc2a4\ub97c \uc778\uc790\ub85c \ubc1b\ub294 decorator\uc774\ub2e4.<\/p>\n\n\n\n<p> UML\ub85c \uadf8\ub824\uc9c4 decorator pattern\uc744 \uad6c\ud604\ud558\ub294\uac74 \ubcc4\ub85c \uc5b4\ub835\uc9c0 \uc54a\uaca0\uc9c0\ub9cc, \uc774\ub7f0 \uc5b8\uc5b4\uc801 \ud2b9\uc131\uc55e\uc5d0 \uc870\uae08 \ud68c\uc758\uac10\uc774 \ub4e0\ub2e4. \uadf8\ub798\uc11c \uc55e\uc758 html \uafb8\ubbf8\ub294 \uae30\ub2a5\uc744 python decorator\ub97c \uc774\uc6a9\ud574 \uad6c\ud604\ud574 \ubcf4\uaca0\ub2e4.<\/p>\n\n\n\n<div class=\"wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers\" data-code-block-pro-font-family=\"Code-Pro-Roboto-Mono.ttf\" style=\"font-size:clamp(14px, .875rem, 21px);font-family:Code-Pro-Roboto-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#adbac7;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span role=\"button\" tabindex=\"0\" style=\"color:#adbac7;display:none\" aria-label=\"Copy\" class=\"code-block-pro-copy-button\"><pre class=\"code-block-pro-copy-button-pre\" aria-hidden=\"true\"><textarea class=\"code-block-pro-copy-button-textarea\" tabindex=\"-1\" aria-hidden=\"true\" readonly>from typing import Callable\n\n\ndef bold_decorator(func: Callable[&#91;str&#93;, str]) -> Callable[&#91;str&#93;, str]:\n    def wrapper(text: str):\n        return f\"&lt;B>{func(text)}&lt;\/B>\"\n\n    return wrapper\n\ndef italic_decorator(func: Callable[&#91;str&#93;, str]) -> Callable[&#91;str&#93;, str]:\n    def wrapper(text: str):\n        return f\"&lt;I>{func(text)}&lt;\/I>\"\n\n    return wrapper\n\ndef plain_text(text: str) -> str:\n    return text\n\n# static usage\n@italic_decorator\n@bold_decorator\ndef decorated_text(text: str) -> str:\n    return plain_text(text)\n\n\nprint(decorated_text(\"It's decorator!\"))\n\n# dynamic usage\ndynamic_decorated_text = italic_decorator(bold_decorator(plain_text))\nprint(dynamic_decorated_text(\"It's decorator!\"))\n<\/textarea><\/pre><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"width:24px;height:24px\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\" stroke-width=\"2\"><path class=\"with-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4\"><\/path><path class=\"without-check\" stroke-linecap=\"round\" stroke-linejoin=\"round\" d=\"M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2\"><\/path><\/svg><\/span><pre class=\"shiki github-dark-dimmed\" style=\"background-color: #22272e\" tabindex=\"0\"><code><span class=\"line\"><span style=\"color: #F47067\">from<\/span><span style=\"color: #ADBAC7\"> typing <\/span><span style=\"color: #F47067\">import<\/span><span style=\"color: #ADBAC7\"> Callable<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">bold_decorator<\/span><span style=\"color: #ADBAC7\">(func: Callable[&#91;<\/span><span style=\"color: #6CB6FF\">str<\/span><span style=\"color: #ADBAC7\">&#93;, <\/span><span style=\"color: #6CB6FF\">str<\/span><span style=\"color: #ADBAC7\">]) -&gt; Callable[&#91;<\/span><span style=\"color: #6CB6FF\">str<\/span><span style=\"color: #ADBAC7\">&#93;, <\/span><span style=\"color: #6CB6FF\">str<\/span><span style=\"color: #ADBAC7\">]:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">wrapper<\/span><span style=\"color: #ADBAC7\">(text: <\/span><span style=\"color: #6CB6FF\">str<\/span><span style=\"color: #ADBAC7\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">f<\/span><span style=\"color: #96D0FF\">&quot;&lt;B&gt;<\/span><span style=\"color: #F47067\">{<\/span><span style=\"color: #ADBAC7\">func(text)<\/span><span style=\"color: #F47067\">}<\/span><span style=\"color: #96D0FF\">&lt;\/B&gt;&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> wrapper<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">italic_decorator<\/span><span style=\"color: #ADBAC7\">(func: Callable[&#91;<\/span><span style=\"color: #6CB6FF\">str<\/span><span style=\"color: #ADBAC7\">&#93;, <\/span><span style=\"color: #6CB6FF\">str<\/span><span style=\"color: #ADBAC7\">]) -&gt; Callable[&#91;<\/span><span style=\"color: #6CB6FF\">str<\/span><span style=\"color: #ADBAC7\">&#93;, <\/span><span style=\"color: #6CB6FF\">str<\/span><span style=\"color: #ADBAC7\">]:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">wrapper<\/span><span style=\"color: #ADBAC7\">(text: <\/span><span style=\"color: #6CB6FF\">str<\/span><span style=\"color: #ADBAC7\">):<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">f<\/span><span style=\"color: #96D0FF\">&quot;&lt;I&gt;<\/span><span style=\"color: #F47067\">{<\/span><span style=\"color: #ADBAC7\">func(text)<\/span><span style=\"color: #F47067\">}<\/span><span style=\"color: #96D0FF\">&lt;\/I&gt;&quot;<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> wrapper<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">plain_text<\/span><span style=\"color: #ADBAC7\">(text: <\/span><span style=\"color: #6CB6FF\">str<\/span><span style=\"color: #ADBAC7\">) -&gt; <\/span><span style=\"color: #6CB6FF\">str<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> text<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #768390\"># static usage<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCBDFB\">@italic_decorator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #DCBDFB\">@bold_decorator<\/span><\/span>\n<span class=\"line\"><span style=\"color: #F47067\">def<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">decorated_text<\/span><span style=\"color: #ADBAC7\">(text: <\/span><span style=\"color: #6CB6FF\">str<\/span><span style=\"color: #ADBAC7\">) -&gt; <\/span><span style=\"color: #6CB6FF\">str<\/span><span style=\"color: #ADBAC7\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">return<\/span><span style=\"color: #ADBAC7\"> plain_text(text)<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #6CB6FF\">print<\/span><span style=\"color: #ADBAC7\">(decorated_text(<\/span><span style=\"color: #96D0FF\">&quot;It&#39;s decorator!&quot;<\/span><span style=\"color: #ADBAC7\">))<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><span style=\"color: #768390\"># dynamic usage<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">dynamic_decorated_text <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> italic_decorator(bold_decorator(plain_text))<\/span><\/span>\n<span class=\"line\"><span style=\"color: #6CB6FF\">print<\/span><span style=\"color: #ADBAC7\">(dynamic_decorated_text(<\/span><span style=\"color: #96D0FF\">&quot;It&#39;s decorator!&quot;<\/span><span style=\"color: #ADBAC7\">))<\/span><\/span>\n<span class=\"line\"><\/span><\/code><\/pre><\/div>\n\n\n\n<p>typing\uc740 \ub2e8\uc9c0 \uc5b4\ub5a4 \ud568\uc218\ud615 \uc778\uc790\ub97c \ub118\uae30\uace0 \uc5b4\ub5a4 \ud568\uc218\ub97c \ub9ac\ud134\ud558\ub294\uc9c0 \uc774\ud574\ub97c \ub3d5\uae30\uc704\ud55c \uac83\uc77c \ubfd0\uc774\ub2e4. Callable\uc740 \ud568\uc218\ud0c0\uc785\uc744 \ud45c\ud604\ud558\ub294 type annotation\uc774\ub2e4.<\/p>\n\n\n\n<p>pie-syntax\ub97c \uc0ac\uc6a9\ud558\uba74, \uac04\ud3b8\ud558\uae34 \ud558\uc9c0\ub9cc decorator\uac00 \uc228\uaca8\uc9c0\uace0 \uc815\uc801\uc73c\ub85c\ub9cc \uc0ac\uc6a9\ud558\uac8c \ub41c\ub2e4. \ub300\uc2e0\uc5d0 decorator pattern\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub4ef \ucf54\ub4dc\ub97c \ub098\uc5f4\ud558\uba74 dynamic\ud558\uac8c \uc0ac\uc6a9\uac00\ub2a5\ud558\ub2e4. <\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity is-style-dots\"\/>\n\n\n\n<h3 class=\"wp-block-heading\">Conclusion<\/h3>\n\n\n\n<p>\uc544\ub9c8\ub3c4 Adapter pattern\uacfc \uc720\uc0ac\uc131\uc744 \ub290\uaf08\uc744 \uac83\uc774\ub2e4. \ucc28\uc774\uc810\uc774\ub77c\uba74, Adapter pattern\uc740 \uc11c\ub85c \ub2e4\ub978 \uc778\ud130\ud398\uc774\uc2a4\ub97c \ub9de\ucdb0\uc8fc\ub294 wrapper\uac00 \ub418\uace0 decorator\ub294 \ub3d9\uc77c\ud55c \uc778\ud130\ud398\uc774\uc2a4\uc5d0 \ucd94\uac00\uc801\uc778 \uc77c\uc744 \ud574\uc8fc\ub294 wrapper\uc774\ub2e4.<\/p>\n\n\n\n<p>python\uc758 \uc608\uc5d0\uc11c \ubcf4\uc774\ub4ef\uc774, \ub514\uc790\uc778 \ud328\ud134\uc740 \uaf2d \uc9c0\ucf1c\uc57c\ud560 \ub8f0\uc774 \uc544\ub2c8\ub77c \ud558\ub098\uc758 \ubaa8\ubc94\ub2f5\uc548\uc77c \ubfd0\uc774\ub2e4. \uc5b5\uc9c0\ub85c \ub514\uc790\uc778 \ud328\ud134\uc774\ub780 \ud2c0\uc5d0 \ub07c\uc6cc \ub9de\ucd94\ub824 \ud558\ub294\uac8c \ucd5c\uc120\uc740 \uc544\ub2c8\ub77c\uace0 \uc0dd\uac01\ud55c\ub2e4. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Decorator pattern\uc740 \uac1d\uccb4\uc758 \uae30\ub2a5\uc744 \ub3d9\uc801\uc73c\ub85c \ud655\uc7a5\ud558\uace0\uc790 \ud560 \ub54c, \ub610\ub294 \uc0c1\uc18d\ubc1b\uc744 \ud074\ub798\uc2a4\uac00 \uc0c1\uc18d\uc774 \ubd88\uac00\ub2a5\ud560 \ub54c \uc0ac\uc6a9\ub418\ub294 \ub514\uc790\uc778 \ud328\ud134\uc774\ub2e4. \uac8c\uc784\uc758 \uc608\ub97c \ub4e4\uba74 \ub9f5\uc744 \ub3cc\uc544\ub2e4\ub2c8\ub2e4\uac00 \uc77c\uc2dc\uc801\uc73c\ub85c \uacf5\uaca9\ub825\uc774 \uac15\ud654\ub418\uac70\ub098, \uc18d\ub3c4\uac00 \ube68\ub77c\uc9c0\uac70\ub098, \ubc29\uc5b4\ub825\uc774 \uac15\ud654\ub418\ub294 \uc544\uc774\ud15c\uc744 \uba39\ub294 \uacbd\uc6b0\ub97c \uc0dd\uac01\ud574 \ubcfc \uc218 \uc788\ub2e4.\uc774\ub7f0 \ud6a8\uacfc\ub4e4\uc740 \uc911\ucca9\ub418\uc5b4 \uc801\uc6a9\ub3c4 \uac00\ub2a5\ud558\ub2e4. \ub610 \uc775\uc219\ud55c \uc608\ub85c\ub294 text editor\ub97c \uc0dd\uac01\ud574\ubcfc \uc218 \uc788\ub2e4. \ubcfc\ub4dc, \uc774\ud0e4\ub9ad, <a href=\"http:\/\/batmask.net\/index.php\/2020\/04\/23\/284\/\" class=\"btn btn-link continue-link\">\ub354 \uc77d\uae30<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3,24,6,34,33],"tags":[158,104,38,35,118,159,128,21,41,55],"class_list":["post-284","post","type-post","status-publish","format-standard","hentry","category-etc","category-note4reference","category-unity","category-kotlin","category-python","tag-decorator","tag-design-pattern","tag-kotlin","tag-python","tag-unity-2","tag-decorator-kr","tag-design-pattern-kr","tag-unity","tag-kotlin-kr","tag-python-kr"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/284","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/comments?post=284"}],"version-history":[{"count":16,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/284\/revisions"}],"predecessor-version":[{"id":5422,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/284\/revisions\/5422"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=284"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=284"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=284"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}