{"id":314,"date":"2020-04-02T23:28:19","date_gmt":"2020-04-02T14:28:19","guid":{"rendered":"http:\/\/batmask.dothome.co.kr\/?p=314"},"modified":"2025-09-11T18:32:10","modified_gmt":"2025-09-11T09:32:10","slug":"design-pattern-template-method","status":"publish","type":"post","link":"http:\/\/batmask.net\/index.php\/2020\/04\/02\/314\/","title":{"rendered":"Design Pattern: Template Method"},"content":{"rendered":"\n<p> \ub514\uc790\uc778 \ud328\ud134 \uacf5\ubd80\ud558\uba74\uc11c \uc81c\uc77c \uc911\uc694\ud558\uac8c \uc0dd\uac01\ud558\uace0 \uc788\ub294 \uc810\uc774 \uc2e4\uc81c \uc0ac\uc6a9\uc608\uc774\ub2e4. \uc81c\uc77c \uc5ff\uac19\uc740\uc810\uc774 \ucee4\ud53c\uba38\uc2e0\uc774\ub2c8, \uc2a4\ud30c\uac8c\ud2f0\ub2c8, \uacf5\uad6c\uc0c1\uc810\uc774\ub2c8 \uc774\ub534 \uac1c\uac19\uc740 \uc608\uc81c\ub4e4\uc744 \ub04c\uc5b4\uc640 \uc124\uba85\ud558\uace0 \uc788\ub294 \ubd80\ubd84\uc774\ub77c\uc11c. \uc544\ub2c8, \ubc18\ubcf5\ud574\uc11c \ub9c8\uc8fc\uce58\ub294 \ubb38\uc81c\ub97c OOP\ub85c \uc124\uacc4\ud558\ub294 \ubcf4\ud3b8\uc801\uc778 \ubc29\ubc95\ub4e4\uc744 \uc124\uba85\ud558\uba74\uc11c \uc5b4\ub5bb\uac8c \uc2e4\uc0ac\uc6a9\uc608 \uc5c6\uc774 \uadf8\ub7f4\uc218\uac00 \uc788\uc9c0? \uadf8\ub0e5 \uc624\ud508\uc18c\uc2a4\ub77c\ub3c4 \uc880 \ub04c\uc5b4\uc640\uc11c \uc124\uba85\ud574\uc57c\ud558\ub294\uac70 \uc544\ub2c8\ub0d0.<\/p>\n\n\n\n<p>Template Method\ub3c4 \uc2e4\uc81c \uc608\uac00 \uc5c6\uc73c\uba74 \uadf8\ub0e5 \uac00\uc0c1\ud074\ub798\uc2a4 \uc0c1\uc18d\ubc1b\uc544 \uc0ac\uc6a9\ud558\ub294 generalization\uc774 \uc804\ubd80\ub2e4. \uc758\ubbf8\ubd80\uc5ec\uac00 \uc548\ub41c\ub2e4\uace0. \uc5ec\uae30\uc5d0 \uc2a4\ud30c\uac8c\ud2f0 \ub808\uc2dc\ud53c \uac00\uc838\uc640\uc11c \uc124\uba85\ud574\uc57c\uaca0\ub0d0\uace0. \uc774\ub7ec\ub2c8\uae4c \uc0ac\ub78c\ub4e4\ub3c4 \ub2e4 \ud5f7\uac08\ub824\uc11c \uadf8\ub0e5 generalization \uc608\uc81c\ub4e4 \ub4e4\uace0\uc640\uc11c \uc124\uba85\ud558\uc9c0. <\/p>\n\n\n\n<p>\uc11c\ub450\uac00 \uae38\uc5c8\ub294\ub370, \uc2dc\uc791\ud574\ubcf4\uc790. Template Method\ub294 \uc54c\uace0\ub9ac\uc998 \uad50\uccb4\uc5d0 \uac00\uc7a5 \uc801\ud569\ud55c \ud328\ud134\uc73c\ub85c \ubcf4\uc778\ub2e4. \uc608\ub97c\ub4e4\uc790\uba74,  \ucf54\ub4dc \uc5d0\ub514\ud130\uc5d0\uc11c java\ub098 kotlin\uc73c\ub85c \ucf54\ub4dc\ub97c \uc9dc\uace0 run\uc744 \uc2e4\ud589\ud558\ub294 \uacbd\uc6b0\ub97c \uc0dd\uac01\ud574\ubcf4\uc790. <\/p>\n\n\n\n<p>java\ub098 \ucf54\ud2c0\ub9b0\uc73c\ub85c \ucf54\ub4dc\ub97c \uc9dc\uace0 \ucef4\ud30c\uc77c\ub7ec\uac00 \ubc14\uc774\ud2b8\ucf54\ub4dc\ub97c \uc0dd\uc131\ud558\uba74 \uc5b4\ub5a4 \uc5b8\uc5b4\ub97c \uc37c\ub294\uc9c0 \uc0c1\uad00\uc5c6\uc774, \uc0dd\uc131\ud55c \ubc14\uc774\ud2b8\ucf54\ub4dc\ub294 JVM\uc5d0\uc11c \uc2e4\ud589\uac00\ub2a5\ud558\ub2e4. \uc5d0\ub514\ud130\uc5d0\uc11c \uc790\uccb4\uc801\uc778 \uc804\ucc98\ub9ac(<code>preProcess()<\/code>)\ub97c \ud574\uc900\ub2e4\uace0 \uac00\uc815\ud558\uba74 <code>run()<\/code>\uc2e4\ud589\uc2dc, <code>preProcess()-compile()-runOnJVM()<\/code>\uc758 \uc138\ub2e8\uacc4\uac00 \ud544\uc694\ud558\ub2e4. \ucf54\ub4dc\ub85c \uc4f0\uba74 \ub2e4\uc74c\uacfc \uac19\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 style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><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>public abstract class MyEditorCompiler {\n    public void run(){\n        preProcess();\n        compile();\n        runOnJVM();\n    }\n\n    private void preProcess(){\n        System.out.println(\"Common preprocessing in editor\");\n    }\n    protected abstract void compile();\n    protected abstract void runOnJVM();\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\">public<\/span><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\">MyEditorCompiler<\/span><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\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">run<\/span><span style=\"color: #ADBAC7\">(){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">preProcess<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">compile<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #DCBDFB\">runOnJVM<\/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\">private<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">preProcess<\/span><span style=\"color: #ADBAC7\">(){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        System.out.<\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Common preprocessing in editor&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 style=\"color: #F47067\">protected<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">compile<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">protected<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">abstract<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">runOnJVM<\/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>preProcess()\ub294 \ucef4\ud30c\uc77c\ub7ec\uc640 \ubb34\uad00\ud558\uace0 \uacf5\ud1b5\uc774\ubbc0\ub85c \uc5ec\uae30\uc5d0\uc11c \uc815\uc758\ud588\ub2e4. \uc790\uccb4\uc801\uc778 \ubb38\ubc95\uac80\uc0ac\uac19\uc740 lint\uae30\ub2a5\ub4f1\uc774 \ud574\ub2f9\ub420 \uc218 \uc788\uaca0\ub2e4.<\/p>\n\n\n\n<p><code>compile() <\/code>\uacfc <code>runOnJVM() <\/code>\uc740 abstract\ub85c \uc11c\ube0c\ud074\ub798\uc2a4\uc5d0\uc11c \uc815\uc758\ub41c\ub2e4. <\/p>\n\n\n\n<p>\ubc14\uc774\ud2b8 \ucf54\ub4dc\ub97c \uc0dd\uc131\ud558\ub294 \ucef4\ud30c\uc77c \ub2e8\uacc4\uc5d0\uc11c\ub294 Oracle\uc758 JDK\ub97c \uc774\uc6a9\ud560 \uc218\ub3c4 \uc788\uace0, \uc548\ub4dc\ub85c\uc774\ub4dc\ucc98\ub7fc OpenJDK\ub97c \uc774\uc6a9\ud560 \uc218\ub3c4 \uc788\ub2e4. Kotlin\ub3c4 \uc81c\uacf5\ub418\ub294 \ucef4\ud30c\uc77c\ub7ec\ub85c JVM\uc5d0\uc11c \ub3d9\uc791\ud560 \ub3d9\uc77c\ud55c \ubc14\uc774\ud2b8\ucf54\ub4dc\uac00 \uc0dd\uc131\ub41c\ub2e4. \uc704\uc758 abstract \ud074\ub798\uc2a4\ub97c \uc0c1\uc18d\ubc1b\uc544 \uc774 3\uac1c\uc758 \ucef4\ud30c\uc77c\ub7ec\ub97c \uad6c\ud604\ud574\ubcf4\uc790.<\/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 style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><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>public class Oracle extends MyEditorCompiler {\n    @Override\n    protected void compile() {\n        System.out.println(\"Oracle compiler compile...\");\n    }\n\n    @Override\n    protected void runOnJVM() {\n        System.out.println(\"Run on Oracle JVM\");\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\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Oracle<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">extends<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">MyEditorCompiler<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    @<\/span><span style=\"color: #F47067\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">protected<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">compile<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        System.out.<\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Oracle compiler compile...&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 style=\"color: #F47067\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">protected<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">runOnJVM<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        System.out.<\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Run on Oracle JVM&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><\/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(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><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>public class OpenJDK extends MyEditorCompiler {\n    @Override\n    protected void compile() {\n        System.out.println(\"OpenJDK compiler compile...\");\n    }\n\n    @Override\n    protected void runOnJVM() {\n        System.out.println(\"Run on OpenJDK JVM\");\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\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">OpenJDK<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">extends<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">MyEditorCompiler<\/span><span style=\"color: #ADBAC7\"> {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    @<\/span><span style=\"color: #F47067\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">protected<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">compile<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        System.out.<\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;OpenJDK compiler compile...&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 style=\"color: #F47067\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">protected<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">runOnJVM<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        System.out.<\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Run on OpenJDK JVM&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><\/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(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><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>public class Kotlin extends MyEditorCompiler {\n    private String JVM = \"OpenJDK\";\n\n    public String getJVM() {\n        return JVM;\n    }\n\n    public void setJVM(String JVM) {\n        this.JVM = JVM;\n    }\n\n    @Override\n    protected void compile() {\n        System.out.println(\"Kotlin compiler compile...\");\n    }\n\n    @Override\n    protected void runOnJVM() {\n        System.out.println(\"Run on \" + getJVM() + \" JVM\");\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\">public<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">class<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">Kotlin<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">extends<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">MyEditorCompiler<\/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\"> String<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #ADBAC7\">JVM<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot;OpenJDK&quot;<\/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\"> String <\/span><span style=\"color: #DCBDFB\">getJVM<\/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\"> JVM;<\/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\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">setJVM<\/span><span style=\"color: #ADBAC7\">(String <\/span><span style=\"color: #F69D50\">JVM<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        <\/span><span style=\"color: #6CB6FF\">this<\/span><span style=\"color: #ADBAC7\">.JVM <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> JVM;<\/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\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">protected<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">compile<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        System.out.<\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Kotlin compiler compile...&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 style=\"color: #F47067\">Override<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">    <\/span><span style=\"color: #F47067\">protected<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">runOnJVM<\/span><span style=\"color: #ADBAC7\">() {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        System.out.<\/span><span style=\"color: #DCBDFB\">println<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #96D0FF\">&quot;Run on &quot;<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">getJVM<\/span><span style=\"color: #ADBAC7\">() <\/span><span style=\"color: #F47067\">+<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #96D0FF\">&quot; JVM&quot;<\/span><span style=\"color: #ADBAC7\">);<\/span><\/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\uc740 Oracle\uc774\ub098 OpenJDK\uac00 \uc81c\uacf5\ud558\ub294 JVM\uc744 \uc774\uc6a9\ud558\ubbc0\ub85c, \ubcc4\uac1c\ub85c JVM\uc744 \uc124\uc815\ud558\uace0 \uadf8 \uc704\uc5d0\uc11c \ub3d9\uc791\ud558\ub294\uac78 \uac00\uc815\ud588\ub2e4.<\/p>\n\n\n\n<p>\uc0ac\uc6a9\uc740 \ub2e4\uc74c\uacfc \uac19\uc774 \ub420 \uc218 \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(2 * 0.6 * .875rem);line-height:clamp(20px, 1.25rem, 30px);--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)\"><span style=\"display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#22272e\"><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"54\" height=\"14\" viewBox=\"0 0 54 14\"><g fill=\"none\" fill-rule=\"evenodd\" transform=\"translate(1 1)\"><circle cx=\"6\" cy=\"6\" r=\"6\" fill=\"#FF5F56\" stroke=\"#E0443E\" stroke-width=\".5\"><\/circle><circle cx=\"26\" cy=\"6\" r=\"6\" fill=\"#FFBD2E\" stroke=\"#DEA123\" stroke-width=\".5\"><\/circle><circle cx=\"46\" cy=\"6\" r=\"6\" fill=\"#27C93F\" stroke=\"#1AAB29\" stroke-width=\".5\"><\/circle><\/g><\/svg><\/span><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>enum COMPILER{ORACLE, OPENJDK, KOTLIN}\n\npublic class Main {\n\n    public static void main(String[] args) {\n        COMPILER compiler = COMPILER.KOTLIN;\n        MyEditorCompiler myEditor = null;\n\n        switch(compiler){\n            case ORACLE:\n                myEditor = new Oracle();\n                break;\n            case OPENJDK:\n                myEditor = new OpenJDK();\n                break;\n            case KOTLIN:\n                myEditor = new Kotlin();\n                break;\n        }\n\n\t    myEditor.run();\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\">enum<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F69D50\">COMPILER<\/span><span style=\"color: #ADBAC7\">{<\/span><span style=\"color: #6CB6FF\">ORACLE<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">OPENJDK<\/span><span style=\"color: #ADBAC7\">, <\/span><span style=\"color: #6CB6FF\">KOTLIN<\/span><span style=\"color: #ADBAC7\">}<\/span><\/span>\n<span class=\"line\"><\/span>\n<span class=\"line\"><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\">Main<\/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: #F47067\">static<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #F47067\">void<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #DCBDFB\">main<\/span><span style=\"color: #ADBAC7\">(<\/span><span style=\"color: #F47067\">String<\/span><span style=\"color: #ADBAC7\">[] <\/span><span style=\"color: #F69D50\">args<\/span><span style=\"color: #ADBAC7\">) {<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        COMPILER<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #ADBAC7\">compiler<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> COMPILER.KOTLIN;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">        MyEditorCompiler<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #ADBAC7\">myEditor<\/span><span style=\"color: #F69D50\"> <\/span><span style=\"color: #F47067\">=<\/span><span style=\"color: #ADBAC7\"> <\/span><span style=\"color: #6CB6FF\">null<\/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\">switch<\/span><span style=\"color: #ADBAC7\">(compiler){<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">case<\/span><span style=\"color: #ADBAC7\"> ORACLE<\/span><span style=\"color: #F47067\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                myEditor <\/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: #DCBDFB\">Oracle<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                <\/span><span style=\"color: #F47067\">break<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">case<\/span><span style=\"color: #ADBAC7\"> OPENJDK<\/span><span style=\"color: #F47067\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                myEditor <\/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: #DCBDFB\">OpenJDK<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                <\/span><span style=\"color: #F47067\">break<\/span><span style=\"color: #ADBAC7\">;<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">            <\/span><span style=\"color: #F47067\">case<\/span><span style=\"color: #ADBAC7\"> KOTLIN<\/span><span style=\"color: #F47067\">:<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                myEditor <\/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: #DCBDFB\">Kotlin<\/span><span style=\"color: #ADBAC7\">();<\/span><\/span>\n<span class=\"line\"><span style=\"color: #ADBAC7\">                <\/span><span style=\"color: #F47067\">break<\/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\">\t    myEditor.<\/span><span style=\"color: #DCBDFB\">run<\/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><\/code><\/pre><\/div>\n\n\n\n<p>\uc774\uc640\uac19\uc774, \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc0ac\uc6a9\ud558\ub3c4\ub85d \ub178\ucd9c\ub41c <code>run()<\/code> \uba54\uc3d8\ub4dc\uc5d0\uc11c \uc5b4\ub5a4\uc2dd\uc73c\ub85c \uc2e4\ud589\ud560\uc9c0 \ud615\ud0dc\ub9cc \uc7a1\uc544\uc8fc\uace0(<code>preProcess()-compile()-runOnJVM()<\/code>) \uadf8 \uad6c\ud604\uc740 \uc0c1\uc18d\ubc1b\uc740 \ud074\ub798\uc2a4\ub4e4\uc774 \uc218\ud589\ud558\ub294\uac8c Template Method Pattern\uc774\ub2e4. <code>run()<\/code> \uba54\uc3d8\ub4dc\uac00 Template\ub9cc \uc788\ub294 \ud615\ud0dc\ub77c\uc11c \ubd99\uc5ec\uc9c4 \uc774\ub984\uc774\ub2e4.<\/p>\n\n\n\n<p>UML \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc73c\ub85c \ud45c\ud604\ud558\uba74 \ub2e4\uc74c\uacfc \uac19\ub2e4. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"466\" height=\"320\" src=\"http:\/\/batmask.dothome.co.kr\/wordpress\/wp-content\/uploads\/2020\/04\/templatemethod1_thumb.png\" alt=\"\" class=\"wp-image-319\" srcset=\"http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/templatemethod1_thumb.png 466w, http:\/\/batmask.net\/wordpress\/wp-content\/uploads\/2020\/04\/templatemethod1_thumb-300x206.png 300w\" sizes=\"auto, (max-width: 466px) 100vw, 466px\" \/><\/figure>\n\n\n\n<p>\uc774\ubbf8\uc9c0 \ucc38\uc870 : <a href=\"http:\/\/programmersnotes.info\/2009\/03\/03\/difference-between-adapter-and-template-method-pattern\/\">http:\/\/programmersnotes.info\/2009\/03\/03\/difference-between-adapter-and-template-method-pattern\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ub514\uc790\uc778 \ud328\ud134 \uacf5\ubd80\ud558\uba74\uc11c \uc81c\uc77c \uc911\uc694\ud558\uac8c \uc0dd\uac01\ud558\uace0 \uc788\ub294 \uc810\uc774 \uc2e4\uc81c \uc0ac\uc6a9\uc608\uc774\ub2e4. \uc81c\uc77c \uc5ff\uac19\uc740\uc810\uc774 \ucee4\ud53c\uba38\uc2e0\uc774\ub2c8, \uc2a4\ud30c\uac8c\ud2f0\ub2c8, \uacf5\uad6c\uc0c1\uc810\uc774\ub2c8 \uc774\ub534 \uac1c\uac19\uc740 \uc608\uc81c\ub4e4\uc744 \ub04c\uc5b4\uc640 \uc124\uba85\ud558\uace0 \uc788\ub294 \ubd80\ubd84\uc774\ub77c\uc11c. \uc544\ub2c8, \ubc18\ubcf5\ud574\uc11c \ub9c8\uc8fc\uce58\ub294 \ubb38\uc81c\ub97c OOP\ub85c \uc124\uacc4\ud558\ub294 \ubcf4\ud3b8\uc801\uc778 \ubc29\ubc95\ub4e4\uc744 \uc124\uba85\ud558\uba74\uc11c \uc5b4\ub5bb\uac8c \uc2e4\uc0ac\uc6a9\uc608 \uc5c6\uc774 \uadf8\ub7f4\uc218\uac00 \uc788\uc9c0? \uadf8\ub0e5 \uc624\ud508\uc18c\uc2a4\ub77c\ub3c4 \uc880 \ub04c\uc5b4\uc640\uc11c \uc124\uba85\ud574\uc57c\ud558\ub294\uac70 \uc544\ub2c8\ub0d0. Template Method\ub3c4 \uc2e4\uc81c \uc608\uac00 \uc5c6\uc73c\uba74 \uadf8\ub0e5 \uac00\uc0c1\ud074\ub798\uc2a4 \uc0c1\uc18d\ubc1b\uc544 \uc0ac\uc6a9\ud558\ub294 generalization\uc774 \uc804\ubd80\ub2e4. \uc758\ubbf8\ubd80\uc5ec\uac00 \uc548\ub41c\ub2e4\uace0. [&hellip;]<\/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],"tags":[104,106,38,35,105,128,135,41,136,55],"class_list":["post-314","post","type-post","status-publish","format-standard","hentry","category-etc","category-note4reference","tag-design-pattern","tag-java","tag-kotlin","tag-python","tag-template-method","tag-design-pattern-kr","tag-java-kr","tag-kotlin-kr","tag-templete-method-kr","tag-python-kr"],"jetpack_featured_media_url":"","_links":{"self":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/314","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=314"}],"version-history":[{"count":6,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/314\/revisions"}],"predecessor-version":[{"id":3441,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/posts\/314\/revisions\/3441"}],"wp:attachment":[{"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/media?parent=314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/categories?post=314"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/batmask.net\/index.php\/wp-json\/wp\/v2\/tags?post=314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}