[[TableOfContents]] == °³¿ä == jcodegen Àº java ¼Ò½ºÄڵ带 »ý¼ºÇÏ´Â java ¶óÀ̺귯¸®ÀÔ´Ï´Ù. * ȨÆäÀÌÁö : http://kldp.net/projects/jcodegen/ * ´Ù¿î·Îµå : http://kldp.net/frs/?group_id=943 * Çѱ۹®¼­ : [jcodegen] * ¿µ¹® ¹®¼­ : Ãß°¡ ¿¹Á¤(¾ðÁ¨°¡´Â...) == ¸¸µç ÀÌÀ¯ == ¿¹Àü¿¡ ÀÚ¹Ù ¼Ò½ºÄڵ带 ÇÁ·Î±×·¥À» ÀÌ¿ëÇؼ­ ¸¸µé¾î¾ß Çß´ø ÀûÀÌ ÀÖ½À´Ï´Ù. ±×·¡¼­ °ü·Ã ¶óÀ̺귯¸®¸¦ ã¾Æº¸¾Ò´Âµ¥ Àú´Â eclipse ÀÇ AST ¶óÀ̺귯¸®¸¦ ¾Ë¾Æº¸¾Ò½À´Ï´Ù. ±×¶§ Á¦°¡ º¸¾Ò´ø ¹®¼­´Â http://help.eclipse.org/help31/topic/org.eclipse.jdt.doc.isv/guide/jdt_api_manip.htm?resultof=%22%61%73%74%22%20 Àε¥, Áß°£Âë¿¡ º¸¸é Hello World ¸¦ Ãâ·ÂÇÏ´Â ¼Ò½ºÄڵ带 ¸¸µå´Â ¿¹Á¦°¡ ³ª¿É´Ï´Ù. Àú´Â ±× ¿¹Á¦¸¦ º¸°í "Á÷Á¢ ¸¸µé¾î¾ß°Ú´Ù."´Â °á½ÉÀ» Çß½À´Ï´Ù. -_- eclipse AST ¶óÀ̺귯¸®´Â ¼Ò½ºÄÚµåÀÇ ¸ðµç ºÎºÐÀ» °´Ã¼È­Çؼ­ ó¸®ÇÕ´Ï´Ù. ±× °á°ú ÀÌ¹Ì ÀÖ´Â ¼Ò½ºÄڵ带 ºÐ¼®ÇÏ¿© ¹º°¡¸¦ Çϴµ¥´Â ÁÁÁö¸¸ ¹éÁö »óÅ¿¡¼­ ¼Ò½ºÄڵ带 ¸¸µé¾î¾ß ÇÒ °æ¿ì ÄÚµù·®ÀÌ »ó´çÈ÷ ¸¹¾Æ Áý´Ï´Ù. jcodegen ÀÇ ±âº» ¹æħÀº '''Àû´çÈ÷ ¾²±â ÆíÇÏ°Ô''' ÀÔ´Ï´Ù. ºí·°·¹º§(Ŭ·¡½º, ¸Þ¼Òµå ¼±¾ð, °¢Á¾ Á¦¾î±¸Á¶ µî) Àº °´Ã¼¸¦ ÀÌ¿ëÇÏÁö¸¸ °³º°¹®Àå¿¡´Â ¹®ÀÚ¿­À» ¾¹´Ï´Ù. ±× °á°ú jcodegen Àº ¼Ò½ºÄڵ带 ¸¸µå´Âµ¥´Â ÁÁÁö¸¸ ÀÌ¹Ì ÀÖ´Â ¼Ò½ºÄڵ带 ºÐ¼®ÇÏ¿© ¹º°¡¸¦ ÇÏ´Â °ÍÀº °ÅÀÇ ºÒ°¡´ÉÇÕ´Ï´Ù. == Hello World ¿¹Á¦ == {{{ import java.io.IOException; import net.kldp.jcodegen.Modifier; import net.kldp.jcodegen.Visibility; import net.kldp.jcodegen.code.JavaSourceFile; import net.kldp.jcodegen.code.Statement; import net.kldp.jcodegen.code.type.ClassType; import net.kldp.jcodegen.code.type.MethodBlock; public class CreateHelloWorld { public static void main(String[] args) throws IOException { // ¼Ò½º ÆÄÀÏ »ý¼º JavaSourceFile source = new JavaSourceFile("example") ; // Ŭ·¡½º »ý¼º ClassType hello = new ClassType(source , Visibility.PUBLIC , "HelloWorld") ; hello.addCommentLine("'Hello World' printing example program.") ; // main ¸Þ¼Òµå MethodBlock main = new MethodBlock(hello , Visibility.PUBLIC , "main") ; main.addModifier(Modifier.STATIC) ; main.setReturnType(void.class) ; main.addParam(String[].class, "args", "command line args") ; // Ãâ·Â¹® new Statement(main , "System.out.println(\"Hello \"+\"World\")") ; source.write(System.getenv("TEMP")) ; } } }}} À§ÀÇ ÄÚµå´Â $TEMP/example/HelloWorld.java ¼Ò½ºÄڵ带 ¸¸µì´Ï´Ù. {{{ package example ; /** * 'Hello World' printing example program. */ public class HelloWorld { /** * * @param args command line args */ public static void main (String[] args) { System.out.println("Hello "+"World"); } } }}} == »ç¿ë¹ý == ¿©±â¿¡ ³ª¿Â »ç¿ë¹ýÀº 0.2 ¹öÀü ±âÁØÀÔ´Ï´Ù. 0.1.1 °ú´Â ¸¹ÀÌ ´Ù¸¨´Ï´Ù. 0.2 ¹öÀüÀº ÇöÀç ¼Ò½ºÄÚµå ÀúÀå¼Ò¿¡¼­ Á÷Á¢ ¼Ò½º¸¦ ´Ù¿î¹ÞÀ¸¸é µË´Ï´Ù. === ÀüüÀûÀÎ ±¸Á¶ === java ÀÇ ¼Ò½ºÄÚµå´Â Æ®¸®±¸Á¶·Î Ç¥ÇöµË´Ï´Ù. µû¶ó¼­ jcodegen µµ ³»ºÎÀûÀ¸·Î Æ®¸®±¸Á¶°¡ µÇ¸ç jcodegenÀÇ ´ëºÎºÐÀÇ ±¸¼º¿ä¼Ò´Â »ý¼ºÀÚÀÇ Ã¹¹ø° ¸Å°³º¯¼ö·Î ÀÚ½ÅÀÇ ºÎ¸ð¸¦ ¹Þ½À´Ï´Ù. === ¼Ò½º ÆÄÀÏ »ý¼º === jcodegen ¿¡¼­ ¼Ò½º ÆÄÀÏÀº {{{net.kldp.jcodegen.code.JavaSourceFile}}} Ŭ·¡½º·Î Ç¥ÇöµË´Ï´Ù.óÀ½ »ý¼ºÇÒ ¶§ ÀÌ ÆÄÀÏÀÌ ¼ÓÇÏ´Â ÆÐÅ°Áö¸íÀ» ¸Å°³º¯¼ö·Î ¹Þ½À´Ï´Ù. ¼Ò½º ÆÄÀÏÀ» ¾²·Á¸é {{{write}}} ¸Þ¼Òµå¸¦ È£ÃâÇÕ´Ï´Ù. ÀÌ ¸Þ¼Òµå´Â ¼Ò½º ÆÄÀÏÀ» ¸¸µé µð·ºÅ丮 °æ·Î¸¦ ¹Þ½À´Ï´Ù. === Ŭ·¡½º, ¸Þ¼Òµå, ÇÊµå »ý¼º === Ŭ·¡½º, ¸Þ¼Òµå, Çʵå Á¤ÀǸ¦ ¸¸µé ¶§´Â {{{net.kldp.jcodegen.code.type}}} ÆÐÅ°Áö¿¡ Àִ Ŭ·¡½º¸¦ ÀÌ¿ëÇÏ¸é µË´Ï´Ù. === Á¦¾î ±¸¹® === if , for µîÀÇ Á¦¾î±¸¹®°ú °ü·ÃµÈ °ÍÀº {{{net.kldp.jcodegen.code}}} ÆÐÅ°Áö¿¡ ÀÖ½À´Ï´Ù. ==== if »ç¿ë ==== if ¹®À» ´Üµ¶À¸·Î »ç¿ëÇÒ ¶§´Â {{{net.kldp.jcodegen.code.IfBlock}}} ¸¦ ±×³É ¾²¸é µË´Ï´Ù. {{{ IfBlock is_0 = new IfBlock(parent , "num == 0") ; new Statement (is_0 , "System.out.println(\"num is 0\")") ; }}} {{{ if(num == 0) { System.out.println("num is 0") ; } }}} ¸¸¾à else if ³ª else µµ ÇÊ¿äÇÑ °æ¿ì {{{net.kldp.jcodegen.code.IfWrapper}}} ¸¦ ¸¸µç´ÙÀ½ ÀÌ °´Ã¼¿¡ {{{net.kldp.jcodegen.code.IfBlock}}} ³ª {{{net.kldp.jcodegen.code.ElseBlock}}} ¸¦ Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù. {{{ String num_name = "num" ; new Statement(main , "int @[num_name] = 3").setVariable("num_name", num_name) ; IfWrapper if_list = new IfWrapper(main) ; for(int i = 0 ; i < 5 ; ++i) { IfBlock num_check = new IfBlock(if_list , "@{num_name} == @{i}") ; num_check.setVariable("num_name", num_name) ; num_check.setVariable("i", i) ; Statement print = new Statement(num_check , "System.out.println(\"@{i}\")") ; print.setVariable("i", i) ; } ElseBlock else_block = new ElseBlock(if_list) ; new Statement(else_block , "System.out.println(\"Unknown\")") ; }}} {{{ int num = 3; if(num == 0) { System.out.println("0"); } else if(num == 1) { System.out.println("1"); } else if(num == 2) { System.out.println("2"); } else if(num == 3) { System.out.println("3"); } else if(num == 4) { System.out.println("4"); } else { System.out.println("Unknown"); } }}} jcodegen ¿¡´Â else if ¸¦ ³ªÅ¸³»´Â Ŭ·¡½º´Â µû·Î ¾ø°í {{{IfBlock}}} ÀÌ Ãß°¡µÈ ¼ø¼­¿¡ µû¶ó if ÀÎÁö else if ÀÎÁö°¡ °áÁ¤µË´Ï´Ù. ==== try »ç¿ë ==== try , catch , finally ´Â °¢°¢ {{{net.kldp.jcodegen.code.TryBlock}}} , {{{net.kldp.jcodegen.code.CatchBlock}}} , {{{net.kldp.jcodegen.code.FinallyBlock}}} ·Î ³ªÅ¸³À´Ï´Ù. »ç¿ëÇÒ ¶§´Â ¸ÕÀú {{{net.kldp.jcodegen.code.TryWrapper}}} °´Ã¼¸¦ ¸¸µç µÚ ¿©±â¿¡ Ãß°¡ÇØ¾ß ÇÕ´Ï´Ù. {{{ TryWrapper trys = new TryWrapper(main) ; TryBlock try_block = new TryBlock(trys) ; new Statement(try_block , "System.out.println(\"TRY\")") ; CatchBlock catch_runtime = new CatchBlock(trys , RuntimeException.class , "e") ; new Statement(catch_runtime , "System.out.println(\"CATCH\")") ; FinallyBlock final_block = new FinallyBlock(trys) ; new Statement(final_block , "System.out.println(\"FINALLY\")") ; }}} {{{ try { System.out.println("TRY"); } catch (RuntimeException e) { System.out.println("CATCH"); } finally { System.out.println("FINALLY"); } }}} === import ¹® ó¸®Çϱâ === jcodegen Àº ³»ºÎÀûÀ¸·Î import ¹®°ú °ü·ÃµÈ °ÍÀ» ÀÚµ¿À¸·Î ó¸®ÇÕ´Ï´Ù. ¿¹¸¦ µé¾î ƯÁ¤ ¸Þ¼Òµå°¡ {{{java.util.ArrayList}}} ŸÀÔÀ» ¸Å°³º¯¼ö·Î ¹Þ´Â °æ¿ì {{{ method.addParam(java.util.ArrayList.class , "list" , "") ; }}} ÀÌ·¸°Ô Çϸé {{{ArrayList}}} ¿¡ ´ëÇÑ import ¹®ÀÌ ÀûÀýÇÏ°Ô Ãß°¡µË´Ï´Ù. ¾î¶² °æ¿ì¿¡´Â ¹®ÀÚ¿­ ³»¿¡¼­ ŸÀÔ¸íÀ» »ç¿ëÇØ¾ß ÇÒ °æ¿ì°¡ ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î {{{ List list = new ArrayList() ; }}} ÀÌ·± ¹®ÀåÀ» ¸¸µé¾î¾ß ÇÒ °æ¿ì°¡ ÀÖ½À´Ï´Ù. ÀÌ·± °æ¿ì¸¦ À§ÇØ jcodegen Àº {{{net.kldp.jcodegen.base.TypeName}}} Ŭ·¡½º¸¦ Á¦°øÇÕ´Ï´Ù. {{{ TypeName list = TypeName.create(parent , java.util.List.class) ; TypeName arr_list = TypeName.create(parent , java.util.ArrayList.class) ; new Statement(parent , list + " list = new " + arr_list + "()") ; }}} {{{TypeName}}} °´Ã¼¿¡ ´ëÇØ toString() ¸Þ¼Òµå°¡ È£ÃâµÇ¸é, ³»ºÎÀûÀ¸·Î import ¿¡ ´ëÇÑ Ã³¸®¸¦ ÇÑ ÈÄ ¼Ò½ºÄڵ忡¼­ »ç¿ëÇÒ ¼ö Àִ ŸÀÔ¸íÀ» ¸®ÅÏÇÕ´Ï´Ù. {{{TypeName}}} Ŭ·¡½º´Â generic type µµ Áö¿øÇÕ´Ï´Ù. {{{ TypeName list_of_string = TypeName.create(parent , java.util.List.class , java.lang.String.class) ; }}} ÀÌ ÄÚµå´Â ¼Ò½ºÄڵ忡 {{{List}}} À» ¸¸µì´Ï´Ù. TypeName ÀÇ ÆÑÅ丮 ¸Þ¼Òµå´Â Class °´Ã¼³ª ŸÀÔÀÇ ¹®ÀÚ¿­À̸§À» ¹Þ½À´Ï´Ù. generic type ºÎºÐ¿¡´Â ´Ù¸¥ {{{TypeName}}} °´Ã¼¸¦ ¹Þ´Â °Íµµ °¡´ÉÇÕ´Ï´Ù. === º¯¼ö¸í Æò°¡ ±â´É »ç¿ë === ¿¹¸¦ µé¾î {{{ List list = new ArrayList() ; }}} ÀÌ·± ¹®ÀåÀ» ¸¸µå´Â °æ¿ì ´Ü¼øÈ÷ ¹®ÀÚ¿­ ¿¬°á ¿¬»êÀ» ÀÌ¿ëÇϸé {{{ TypeName list_of_string = TypeName.create(parent , java.util.List.class , java.lang.String.class) ; TypeName arr_list_of_string = TypeName.create(parent , "java.util.ArrayList" , "java.lang.String") ; new Statement(parent , list_of_string + " list = new " + arr_list_of_string + "()") ; }}} ÀÌ·¸°Ô µË´Ï´Ù. ÇÏÁö¸¸ ÀÌ°æ¿ì ¹®ÀÚ¿­ µ¡¼À ¿¬»ê ¶§¹®¿¡ »ý¼ºµÇ´Â Äڵ尡 ÇÑ´«¿¡ µé¾î¿ÀÁö ¾Ê½À´Ï´Ù. ÀÌ´Â »ý¼ºÇØ¾ß ÇÏ´Â Äڵ尡 º¹ÀâÇØÁú¼ö·Ï ´õ ½ÉÇØÁú °ÍÀÔ´Ï´Ù. ÀÌ·± °æ¿ì¸¦ À§ÇØ º¯¼ö¸í Æò°¡ ±â´ÉÀ» Á¦°øÇÕ´Ï´Ù. ¹®ÀÚ¿­ ³»¿¡ @{} ·Î º¯¼ö°¡ »ç¿ëµÇ´Â ºÎºÐÀ» ¸¸µç ´ÙÀ½, setVariable ·Î ÇØ´ç º¯¼ö¿¡ ġȯµÇ´Â °´Ã¼¸¦ ¼³Á¤ÇÏ¸é µË´Ï´Ù. {{{ TypeName list_of_string = TypeName.create(parent , java.util.List.class , java.lang.String.class) ; TypeName arr_list_of_string = TypeName.create(parent , "java.util.ArrayList" , "java.lang.String") ; Statement stmt = (parent , "@{list} = new @{arr_list}()") ; stmt.setVariable("list" , list_of_string) ; stmt.setVariable("arr_list" , arr_list_of_string) }}} setVariableÀÇ Å°´Â ¿Ã¹Ù¸¥ ÀÚ¹Ù º¯¼ö¸í ¹®ÀÚ¿­ÀÌ¸é µÇ°í, °ªÀº ÀÓÀÇÀÇ java °´Ã¼°¡ µË´Ï´Ù. ³»ºÎÀûÀ¸·Î Å°¿¡ ´ëÇÑ °ªÀ» ã¾Æ toString()À» È£ÃâÇÑ °á°ú·Î ġȯÇÕ´Ï´Ù. == ÁøÇà»óȲ == 2007/04/05 0.2 ¹öÀü ¸±¸®Áî