<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=Java%2FModeSelectionPerformanceTest</id>
	<title>Java/ModeSelectionPerformanceTest - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=Java%2FModeSelectionPerformanceTest"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=Java/ModeSelectionPerformanceTest&amp;action=history"/>
	<updated>2026-05-14T18:24:42Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=Java/ModeSelectionPerformanceTest&amp;diff=33278&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:23, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=Java/ModeSelectionPerformanceTest&amp;diff=33278&amp;oldid=prev"/>
		<updated>2021-02-07T05:23:33Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Servlet 에서, 또는 Switch - Case 등 많은 분기를 하는 방법에 대한 디자인 &amp;amp; 퍼포먼스 관점에서의 구경.&lt;br /&gt;
----&lt;br /&gt;
=== 1. if-else ===&lt;br /&gt;
대강 다음의 코드 스타일일것이다.&lt;br /&gt;
 public class IfElse {&lt;br /&gt;
     public void printPerformance(String[] modeExecute) {&lt;br /&gt;
         long start;&lt;br /&gt;
         long end;&lt;br /&gt;
         start = System.currentTimeMillis();&lt;br /&gt;
         for (int i = 0; i &amp;amp;lt; ModeChoicePerformanceTest.LOOPING_COUNT; i++) {&lt;br /&gt;
             executeIfElse(modeExecute);&lt;br /&gt;
         }&lt;br /&gt;
         end = System.currentTimeMillis();&lt;br /&gt;
         System.out.println(&amp;quot;if - else elapsed time :&amp;quot; + (end - start) + &amp;quot;ms &amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     private void executeIfElse(String[] modeExecute) {&lt;br /&gt;
         for (int i = 0; i &amp;amp;lt; modeExecute.length; i++) {&lt;br /&gt;
             executeWithIfElse(modeExecute[i]);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void executeWithIfElse(String mode) {&lt;br /&gt;
         if (mode.equals(&amp;quot;One&amp;quot;)) {&lt;br /&gt;
             doOne(1);&lt;br /&gt;
         } else if (mode.equals(&amp;quot;Two&amp;quot;)) {&lt;br /&gt;
             doTwo(1);&lt;br /&gt;
         } else if (mode.equals(&amp;quot;Three&amp;quot;)) {&lt;br /&gt;
             doThree(1);&lt;br /&gt;
         } else if (mode.equals(&amp;quot;Four&amp;quot;)) {&lt;br /&gt;
             doFour(1);&lt;br /&gt;
         } else if (mode.equals(&amp;quot;Five&amp;quot;)) {&lt;br /&gt;
             doFive(1);&lt;br /&gt;
         } else {&lt;br /&gt;
             doDefault(1);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     public void doOne(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doTwo(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doThree(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doFour(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doFive(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doDefault(int i) {&lt;br /&gt;
         i = 100;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
이 방법은 일단 속도상으론 가장 빠르다. 하지만, 한편으로&lt;br /&gt;
Seminar:WhySwitchStatementsAreBadSmell 에 걸리지 않을까? 근데.. 그에 대한 반론으로 들어오는것이 &amp;#039;이건 mode 분기이므로 앞에서의 Switch-Statement 에서의 예와는 다른 상황 아니냐. 어차피 분기 이후엔 그냥 해당 부분이 실행되고 끝이다.&amp;#039; 라고 말할것이다. 글쌔. 모르겠다. &lt;br /&gt;
한편으로 느껴지는 것으로는, switch 로 분기를 나눌 mode string 과 웹 parameter 와의 중복이 있을 것이라는 점이 보인다. 그리고 하나의 mode 가 늘어날때마다 해당 method 가 늘어나고, mode string 이 늘어나고, if-else 구문이 주욱 길어진다는 점이 있다. 지금은 메소드로 추출을 해놓은 상황이지만, 만일 저 부분이 메소드로 추출이 안되어있다면? 그건 단 한마디 밖에 할말이 없다. (단, 저 논문을 아는 사람에 한해서) GotoStatementConsideredHarmful. &lt;br /&gt;
&lt;br /&gt;
=== 두번째 - Method reflection ===&lt;br /&gt;
 &lt;br /&gt;
 import java.lang.reflect.Method;&lt;br /&gt;
 import java.lang.reflect.InvocationTargetException;&lt;br /&gt;
 &lt;br /&gt;
 public class MethodFullReflection {&lt;br /&gt;
     public void printPerformance(String[] modeExecute) throws InvocationTargetException, IllegalAccessException {&lt;br /&gt;
         long start;&lt;br /&gt;
         long end;&lt;br /&gt;
         start = System.currentTimeMillis();&lt;br /&gt;
         for (int i = 0; i &amp;amp;lt; ModeChoicePerformanceTest.LOOPING_COUNT; i++) {&lt;br /&gt;
             executeReflection(modeExecute);&lt;br /&gt;
         }&lt;br /&gt;
         end = System.currentTimeMillis();&lt;br /&gt;
         System.out.println(&amp;quot;elapsed time :&amp;quot; + (end - start) + &amp;quot;ms &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     private void executeReflection(String[] modeExecute) throws InvocationTargetException, IllegalAccessException {&lt;br /&gt;
         for (int i = 0; i &amp;amp;lt; modeExecute.length; i++) {&lt;br /&gt;
             Method method = null;&lt;br /&gt;
             try {&lt;br /&gt;
                 method = this.getClass().getMethod(&amp;quot;do&amp;quot; + modeExecute[i], new Class[]{int.class});&lt;br /&gt;
                 method.invoke(this, new Object[]{new Integer(1)});&lt;br /&gt;
             } catch (NoSuchMethodException e) {&lt;br /&gt;
                 this.doDefault(1);&lt;br /&gt;
             } catch (SecurityException e) {&lt;br /&gt;
                 e.printStackTrace();  //To change body of catch statement use Options | File Templates.&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     private void doDefault(int i) {&lt;br /&gt;
         i = 100;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doOne(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doTwo(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doThree(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doFour(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doFive(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
장점 : MODE 가 추가될때마다 doXXX 식으로 이름을 정해주고 이를 실행하면 된다. 조건 분기 부분의 코드가 증가되지 않고, 해당 Mode 가 추가될때마다 메소드 하나만 추가해주면 된다.&lt;br /&gt;
단점 : 자바에서는 Method Reflection &amp;amp; Invoke 가 엄청 느리다.; 속도는 밑의꺼 참조.&lt;br /&gt;
&lt;br /&gt;
=== 세번째. 위의 방법을 보완한 방법이다. 바로 일종의 Table Lookup. ===&lt;br /&gt;
 &lt;br /&gt;
 import java.util.HashMap;&lt;br /&gt;
 import java.util.Map;&lt;br /&gt;
 import java.lang.reflect.Method;&lt;br /&gt;
 import java.lang.reflect.InvocationTargetException;&lt;br /&gt;
 &lt;br /&gt;
 /**&lt;br /&gt;
  * User: Administrator Date: 2003. 7. 12. Time: 오전 12:48:38&lt;br /&gt;
  */&lt;br /&gt;
 public class MethodTableLookupReflection {&lt;br /&gt;
     public void printPerformance(String[] modeExecute) throws InvocationTargetException, IllegalAccessException {&lt;br /&gt;
         long start;&lt;br /&gt;
         long end;&lt;br /&gt;
         start = System.currentTimeMillis();&lt;br /&gt;
         initReflectionMap(modeExecute);&lt;br /&gt;
         end = System.currentTimeMillis();&lt;br /&gt;
         System.out.println(&amp;quot;reflection with method initialize table elapsed time :&amp;quot; + (end - start) + &amp;quot;ms &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         start = System.currentTimeMillis();&lt;br /&gt;
         for (int i = 0; i &amp;amp;lt; ModeChoicePerformanceTest.LOOPING_COUNT; i++) {&lt;br /&gt;
             executeReflectionWithMapping(modeExecute);&lt;br /&gt;
         }&lt;br /&gt;
         end = System.currentTimeMillis();&lt;br /&gt;
         System.out.println(&amp;quot;reflection with method elapsed time :&amp;quot; + (end - start) + &amp;quot;ms &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     private static Map methodMap;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     private void executeReflectionWithMapping(String[] modeExecute) throws InvocationTargetException, IllegalAccessException {&lt;br /&gt;
         for (int i = 0; i &amp;amp;lt; modeExecute.length; i++) {&lt;br /&gt;
             Method method = (Method) methodMap.get(modeExecute[i]);&lt;br /&gt;
             if (method != null)&lt;br /&gt;
                 method.invoke(this, new Object[]{new Integer(1)});&lt;br /&gt;
             else&lt;br /&gt;
                 doDefault(1);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     private void initReflectionMap(String[] methodNames) {&lt;br /&gt;
         methodMap = new HashMap();&lt;br /&gt;
         for (int i = 0; i &amp;amp;lt; methodNames.length; i++) {&lt;br /&gt;
             try {&lt;br /&gt;
                 methodMap.put(methodNames[i], this.getClass().getMethod(&amp;quot;do&amp;quot; + methodNames[i], new Class[]{int.class}));&lt;br /&gt;
             } catch (NoSuchMethodException e) {&lt;br /&gt;
             } catch (SecurityException e) {&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     private void doDefault(int i) {&lt;br /&gt;
         i = 100;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doOne(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doTwo(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doThree(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doFour(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doFive(int i) {&lt;br /&gt;
         i = 10;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
이 방법은 위의 방법과 같은 장점을 지니면서 퍼포먼스를 거의 10배가량 향상시킨다.&lt;br /&gt;
&lt;br /&gt;
=== 네번째. Inner Class 에 대해 Command Pattern 의 사용. ===&lt;br /&gt;
 &lt;br /&gt;
 import java.util.Map;&lt;br /&gt;
 import java.util.HashMap;&lt;br /&gt;
 &lt;br /&gt;
 /**&lt;br /&gt;
  * User: Administrator Date: 2003. 7. 12. Time: 오전 12:57:7&lt;br /&gt;
  */&lt;br /&gt;
 public class InterfaceTableLookup {&lt;br /&gt;
     protected Map modeMap = new HashMap();&lt;br /&gt;
 &lt;br /&gt;
     public void printPerformance(String[] modeExecute) {&lt;br /&gt;
         long start;&lt;br /&gt;
         long end;&lt;br /&gt;
         start = System.currentTimeMillis();&lt;br /&gt;
         initModeMap();&lt;br /&gt;
         end = System.currentTimeMillis();&lt;br /&gt;
         System.out.println(&amp;quot;interface table lookup init table elapsed time :&amp;quot; + (end - start) + &amp;quot;ms &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         start = System.currentTimeMillis();&lt;br /&gt;
         for (int i = 0; i &amp;amp;lt; ModeChoicePerformanceTest.LOOPING_COUNT; i++) {&lt;br /&gt;
             executeInnerclassMapping(modeExecute);&lt;br /&gt;
         }&lt;br /&gt;
         end = System.currentTimeMillis();&lt;br /&gt;
         System.out.println(&amp;quot;interface table lookup elapsed time :&amp;quot; + (end - start) + &amp;quot;ms &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     private void executeInnerclassMapping(String[] modeExecute) {&lt;br /&gt;
         for (int i = 0; i &amp;amp;lt; modeExecute.length; i++) {&lt;br /&gt;
             executeMode(modeExecute[i]);&lt;br /&gt;
          }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     private void executeMode(String s) {&lt;br /&gt;
         IMode mode = (IMode) modeMap.get(s);&lt;br /&gt;
         if (mode == null) doDefault(1);&lt;br /&gt;
         else mode.execute(1);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public class ExOne implements IMode {&lt;br /&gt;
         public void execute(int i) {&lt;br /&gt;
             i = 10;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public  class ExTwo implements IMode {&lt;br /&gt;
         public void execute(int i) {&lt;br /&gt;
             i = 10;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public class ExThree implements IMode {&lt;br /&gt;
         public void execute(int i) {&lt;br /&gt;
             i = 10;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public class ExFour implements IMode {&lt;br /&gt;
         public void execute(int i) {&lt;br /&gt;
             i = 10;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public class ExFive implements IMode {&lt;br /&gt;
         public void execute(int i) {&lt;br /&gt;
             i = 10;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     private void initModeMap() {&lt;br /&gt;
         modeMap.put(&amp;quot;One&amp;quot;, new ExOne());&lt;br /&gt;
         modeMap.put(&amp;quot;Two&amp;quot;, new ExTwo());&lt;br /&gt;
         modeMap.put(&amp;quot;Three&amp;quot;, new ExThree());&lt;br /&gt;
         modeMap.put(&amp;quot;Four&amp;quot;, new ExFour());&lt;br /&gt;
         modeMap.put(&amp;quot;Five&amp;quot;, new ExFive());&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
이 방법은 initModeMap 에서 매번 Mode에 대한 등록을 해줘야 한다. 퍼포먼스는 Method Reflection 보다 훨씬 빠르다.&lt;br /&gt;
&lt;br /&gt;
=== 마지막 방법 - interface &amp;amp; reflection ===&lt;br /&gt;
위의 방법에 initModeMap 을 reflection 으로 처리한 것이다. &lt;br /&gt;
 import java.lang.reflect.Constructor;&lt;br /&gt;
 import java.lang.reflect.InvocationTargetException;&lt;br /&gt;
 import java.util.HashMap;&lt;br /&gt;
 import java.util.Map;&lt;br /&gt;
 &lt;br /&gt;
 /**&lt;br /&gt;
  * User: Administrator Date: 2003. 7. 12. Time: 오전 1:2:16&lt;br /&gt;
  */&lt;br /&gt;
 public class InterfaceTableLookupReflection {&lt;br /&gt;
     public void printPerformance(String[] modeExecute) throws NoSuchMethodException, InstantiationException, ClassNotFoundException, InvocationTargetException, IllegalAccessException {&lt;br /&gt;
         long start;&lt;br /&gt;
         long end;&lt;br /&gt;
         start = System.currentTimeMillis();&lt;br /&gt;
         initModeMapWithReflection(modeExecute);&lt;br /&gt;
         end = System.currentTimeMillis();&lt;br /&gt;
         System.out.println(&amp;quot;interface reflection &amp;amp;amp; table lookup init able elapsed time :&amp;quot; + (end - start) + &amp;quot;ms &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
         start = System.currentTimeMillis();&lt;br /&gt;
         for (int i = 0; i &amp;amp;lt; ModeChoicePerformanceTest.LOOPING_COUNT; i++) {&lt;br /&gt;
             executeInnerclassMapping(modeExecute);&lt;br /&gt;
         }&lt;br /&gt;
         end = System.currentTimeMillis();&lt;br /&gt;
         System.out.println(&amp;quot;interface reflection &amp;amp;amp; table lookup elapsed time :&amp;quot; + (end - start) + &amp;quot;ms &amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     private void executeInnerclassMapping(String[] modeExecute) {&lt;br /&gt;
         for (int i = 0; i &amp;amp;lt; modeExecute.length; i++) {&lt;br /&gt;
             executeMode(modeExecute[i]);&lt;br /&gt;
          }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     private void executeMode(String s) {&lt;br /&gt;
         IMode mode = (IMode) modeMap.get(s);&lt;br /&gt;
         if (mode == null) doDefault(1);&lt;br /&gt;
         else mode.execute(1);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     protected Map modeMap = new HashMap();&lt;br /&gt;
     public final static String modeClassHeader = &amp;quot;Ex&amp;quot;;&lt;br /&gt;
     String expectedClassNameHeader = this.getClass().getName() + &amp;quot;$&amp;quot; + modeClassHeader;&lt;br /&gt;
 &lt;br /&gt;
     private void initModeMapWithReflection(String[] modeExecute) throws InstantiationException, InvocationTargetException, IllegalAccessException, NoSuchMethodException {&lt;br /&gt;
         Class[] consParamClasses = new Class[]{this.getClass()};&lt;br /&gt;
         Object[] consParams = new Object[]{this};&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
         Class[] inners = this.getClass().getClasses();&lt;br /&gt;
         for (int i=0;i&amp;amp;lt;inners.length;i++) {&lt;br /&gt;
             if (inners[i].getName().startsWith(expectedClassNameHeader)) {&lt;br /&gt;
                 Constructor innerCons = inners[i].getDeclaredConstructor(consParamClasses);&lt;br /&gt;
                 modeMap.put(modeExecute[i], innerCons.newInstance(consParams));&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void doDefault(int i) {&lt;br /&gt;
         i = 100;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public class ExOne implements IMode {&lt;br /&gt;
         public void execute(int i) {&lt;br /&gt;
             i = 10;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public  class ExTwo implements IMode {&lt;br /&gt;
         public void execute(int i) {&lt;br /&gt;
             i = 10;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public class ExThree implements IMode {&lt;br /&gt;
         public void execute(int i) {&lt;br /&gt;
             i = 10;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public class ExFour implements IMode {&lt;br /&gt;
         public void execute(int i) {&lt;br /&gt;
             i = 10;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public class ExFive implements IMode {&lt;br /&gt;
         public void execute(int i) {&lt;br /&gt;
             i = 10;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
이 방법은 Mode 추가시 그냥 Ex&amp;#039;&amp;#039;ModeName&amp;#039;&amp;#039; 식으로 추가해주면 된다. 그러면서 Mode 조건 분기 부분이 변하지 않는다. Reflection으로 table lookup 채우는 부분이나 Mode 조건 분기 부분을 아에 상위 클래스로 추출할 수 있다. 퍼포먼스면에서는 의외로 앞에서 수동으로 map 을 채우는 방법과 같다. 유연성과 퍼포먼스 두가지가 적절히 어울어지는 방법이다.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
이건 위의 테스트들을 한번에 실행시키기 위한 runner class.&lt;br /&gt;
 import java.lang.reflect.InvocationTargetException;&lt;br /&gt;
 &lt;br /&gt;
 /*&lt;br /&gt;
   평가하려는 조건들 :&lt;br /&gt;
   1. 해당 method 의 naming 으로 reflection call.&lt;br /&gt;
   2. switch - case 로 mode 구분.&lt;br /&gt;
   3. interface &amp;amp;amp; class - command pattern 의 구현.&lt;br /&gt;
 &lt;br /&gt;
   평가요소들&lt;br /&gt;
   1. 해당 코드 작성대비 늘어나는 반복 작업들&lt;br /&gt;
   2. performance&lt;br /&gt;
   3. maintance&lt;br /&gt;
 */&lt;br /&gt;
 public class ModeChoicePerformanceTest {&lt;br /&gt;
     public static final int LOOPING_COUNT = 1000000;&lt;br /&gt;
 &lt;br /&gt;
     public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, ClassNotFoundException, InstantiationException {&lt;br /&gt;
         String[] modeExecute = new String[]{&amp;quot;One&amp;quot;, &amp;quot;Two&amp;quot;, &amp;quot;Three&amp;quot;, &amp;quot;Four&amp;quot;, &amp;quot;Five&amp;quot;, &amp;quot;hugu&amp;quot;};&lt;br /&gt;
 &lt;br /&gt;
         new IfElse().printPerformance(modeExecute);&lt;br /&gt;
         new MethodFullReflection().printPerformance(modeExecute);&lt;br /&gt;
         new MethodTableLookupReflection().printPerformance(modeExecute);&lt;br /&gt;
         new InterfaceTableLookup().printPerformance(modeExecute);&lt;br /&gt;
         new InterfaceTableLookupReflection().printPerformance(modeExecute);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
=== 결과 ===&lt;br /&gt;
 if - else elapsed time :611ms &lt;br /&gt;
 elapsed time :61889ms &lt;br /&gt;
 reflection with method initialize table elapsed time :0ms &lt;br /&gt;
 reflection with method elapsed time :6459ms &lt;br /&gt;
 interface table lookup init table elapsed time :10ms &lt;br /&gt;
 interface table lookup elapsed time :741ms &lt;br /&gt;
 interface reflection &amp;amp;amp; table lookup init able elapsed time :10ms &lt;br /&gt;
 interface reflection &amp;amp;amp; table lookup elapsed time :731ms &lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[[Java]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>