JavaB eans Programming

Àå±Ô¿À
¼­¿ï½Ã ¼­´ë¹®±¸ ÃæÁ¤·Î 3°¡ 32-11 ÃæÁ¤ºôµù 6Ãþ
Á¦À̾¾Çö½Ã½ºÅÛ(ÁÖ), ¿¤¸²³×Æ® »ç¾÷º»ºÎ, ÀÚ¹ÙÆÀ
E-mail : kojang@elim.net
URL : http://www.elim.net/~kojang
Abstract: ÀÚ¹Ù ºñÁê¾ó ÄÄÆ÷³ÍÆ® ¸ðµ¨ÀÎ ÀÚ¹Ùºó(JavaBeans)Àº ºñÁê¾ó ºô´õ ÅøÀ» ÅëÇØ¼­ ½±°í ºü¸£°Ô ÀÚ¹Ù ¼ÒÇÁÆ®¿þ¾î¸¦ °³¹ßÇÒ ¼ö ÀÖ´Ù. ÀÚ¹ÙºóÀº JDK 1.1¿¡¼­ºÎÅÍ Áö¿øÇϰí ÀÖÀ¸¸é BDKÀÇ À̸§À¸·Î ÀÚ¹ÙºóÀ» °³¹ßÇØ¼­ Å×½ºÆ®ÇÒ ¼ö Àִ ȯ°æÀ» Á¦°øÇÑ´Ù. ÀÌ·¯ÇÑ ÀÚ¹ÙºóÀÇ »ç¿ë ¹æ¹ý°ú ³»ºÎ ±¸Á¶¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸°í, ½ÇÁ¦·Î °³¹ßÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº»´Ù.
Keywords:
JavaBeans, AWT, Bilder Tool, Event, Property, Introspection, Customization, JDK

1. ÀÚ¹ÙºóÀÇ ¼Ò°³

'ÀÚ¹ÙºóÀº ºñÁê¾ó ºô´õÅøÀ» ÅëÇØ Àç»ç¿ë °¡´ÉÇÑ ¼ÒÇÁÆ®¿þ¾î ÄÄÆ÷³ÍÆ®ÀÌ´Ù.; Java Bean is a reusable software component that can be visually manipulated in builder tools'

¾Æ¸¶ ¿©·¯ºÐÀº Windows95/NT ȯ°æÀÇ °³¹ßÅøÀÎ Delphi, Visual Basic, Mojo, PowerBuilder ¸¦ µé¾îº¸°Å³ª Á÷Á¢ »ç¿ëÇØºÃÀ» °ÍÀÌ´Ù. ÀÚ¹ÙºóÀ» ½±°Ô ÀÌÇØÇÏ·Á¸é ÀÌµé °³¹ßÅø¿¡¼­ »ç¿ëÇÏ ´Â ÄÄÆ÷³ÍÆ®ÀÎ VBX(Visual Basic Extension)³ª OCX(OLE Custom Control)¸¦ ¿¬»óÇÏ¸é µÈ ´Ù. ÃÖ±Ù¿¡´Â ActiveXµµ Æ÷ÇÔ µÇ°íÀÖ´Ù. ÇÑÆí X-Windows ȯ°æÀÇ °³¹ßÀÚµéÀº À§Á¬(Widget) À̳ª ŸŶ(Toolkit)À» ¿¬»óÇÏ¸é µÈ´Ù. ÀÚ¹ÙºóÀÇ ´õ¿í °¡±î¿î ¿¹·Î´Â Symantec Visual Cafe ¿¡¼­ Á¦°øÇÏ´Â Visual Component°¡ ¿©·¯ °¡Áö°¡ Àִµ¥, À̵é ÄÄÆ÷³ÍÆ®´Â ÀÚ¹ÙºóÀ» º»µû ¸¸µç °ÍµéÀ̰í, ¾ÕÀ¸·Î ¾Ë¾Æº¸´Â °ÍµéÀº À̵é ÀÚ¹Ù ÄÄÆ÷³ÍÆ®¸¦ ¾î¶»°Ô »ç¿ëÇÏ¿© ÇÁ·Î±×·¡¹Ö Çϰí, ÀÚ¹ÙºóÀ¸·Î½á ¾î¶»°Ô ÄÄÆ÷³ÍÆ®¸¦ µî·ÏÇÏ´ÂÁö¿¡ ´ëÇØ¼­ ¾Ë¾Æº¸°Ú´Ù.

±×·¯³ª À§ÀÇ ÀÚ¹ÙºóÀÇ Á¤ÀÇ´Â ±¤¹üÀ§ÇÑ Àǹ̸¦ Æ÷ÇÔÇϰí ÀÖ´Ù. ºñÁê¾ó ºô´õÅøÀº À¥ÆäÀÌÁö ºô´õ, ºñÁê¾ó ¼ÒÇÁÆ®¿þ¾î ºô´õ, GUI ºô´õ, ¼­¹ö ºô´õ µîÀ» ÀǹÌÇÏ¸ç °£´ÜÇϰԴ ¹®¼­ ÀÛ¼º ÅøÀÇ Àǹ̵µ Æ÷ÇÔÇÑ´Ù.

¾î¶² ÀÚ¹ÙºóÀº GUIÀÇ ÀϺκÐÀ¸·Î½á ¹öưÀ̳ª ½½¶óÀÌ´õÀÏ ¼ö ÀÖ´Ù. ¶Ç, ÀÚ¹ÙºóÀº ¾ÆÁÖ º¹Àâ ÇÑ ÇüÅÂÀÇ ÄÄÆ÷³ÍÆ®·Î½á µ¥ÀÌÅͺ£À̽º ºä¾îµµ µÉ ¼ö ÀÖ´Ù. ¹Ý¸é ÀüÇô GUIÀÇ ÇüŸ¦ ¶ìÁö ¾ÊÀº ÀÚ¹Ùºóµµ ÀÖ´Ù. ±×·¯³ª, °á±¹ ºñÁê¾ó ÅøÀ» ÅëÇØ¼­ ½±°Ô ÀÀ¿ë ÇÁ·Î±×·¥À» ±¸¼ºÇÒ ¼ö ÀÖ ´Ù. ´ÙÀ½Àº ÀÚ¹Ù ÄÄÆ÷³ÍÆ®ÀÇ ¿¹ÀÌ´Ù. À̵éÀº Å©°Ç ÀÛ°Ç ÀÚ¹ÙºóÀ¸·Î ±¸ÇöµÇ¾î Àְųª ±¸ÇöµÉ ¼ö ÀÖ´Ù.

±×¸² 1. Symantec Visual CafeÀÇ Visual Components
±×¸² 1. Symantec Visual CafeÀÇ Visual Components
±×¸² 2. Button Beans
±×¸² 2. Button Beans
±×¸² 3. Slider Beans
±×¸² 3. Slider Beans
±×¸² 4. Spinbutton Beans
±×¸² 4. Spinbutton Beans
±×¸² 5. Calendar Beans
±×¸² 5. Calendar Beans
±×¸² 6. Graphical Diagram Editor
±×¸² 6. Graphical Diagram Editor
±×¸² 7. Word Processor Beans
±×¸² 7. Word Processor Beans

ºô´õÅøÀº ÀÚ¹ÙºóÀ» ¿«´Â ÇüÅÂÀÇ ¿ÏÀüÇÑ ºñÁê¾ó ȯ°æÀÏ ¼ö ÀÖ°í, °³¹ßÀÚ°¡ ´õ¿í À¯¿¬ÇÏ°Ô °³ ¹ßÇÒ ¼ö ÀÖµµ·Ï Àڹ٠Ŭ·¡½º¸¦ Á÷Á¢ ÀÛ¼ºÇÒ ¼ö ÀÖ´Â °Íµµ ÀÖÀ¸¸ç, ½ºÅ©¸³Æ®¸¦ Á¦°øÇÏ´Â °Í µµ ÀÖ´Ù.

JavaBeans APIÀÇ ±Ã±ØÀûÀÎ ¸ñÀûÀº ÀÚ¹Ù·Î Software component modelÀ» Á¤ÀÇÇÏ¿© À̵é ÀÚ ¹Ù ÄÄÆ÷³ÍÆ®¸¦ Á¶ÇÕÇÏ´Â °Í¸¸À¸·Î ÇϳªÀÇ ÀÀ¿ë ÇÁ·Î±×·¥À» °³¹ßÇÒ ¼ö ÀÖµµ·Ï Çϴµ¥ ÀÖ´Ù.

1.1 ÄÄÆ÷³ÍÆ®ÀÇ ÇüÅÂ

ÀÚ¹Ùºó ÄÄÆ÷³ÍÆ®¸¦ ±»ÀÌ ³ª´©ÀÚ¸é ´ÙÀ½°ú °°´Ù.

ÀÚ¹ÙºóÀº ÀÀ¿ë ÇÁ·Î±×·¥À» ±¸¼ºÇÏ´Â ºí·ÏÇüÅÂÀÌ´Ù. µû¶ó¼­, »ç¿ëÀÚ´Â ºô´õÅø¿¡¼­ À̵é ÄÄ Æ÷³ÍÆ®¸¦ ¿¬°áÇÏ°í ¸î °³ÀÇ ÀÚ¹Ù ºóÀ» ¹­¾îÁÜÀ¸·Î½á ÇϳªÀÇ ÀÀ¿ë ÇÁ·Î±×·¥À¸·Î½á ÀÛµ¿ÇÑ´Ù. ÀÌ·¯ÇÑ °æ¿ì¿¡ AWT ¹öưÀº ÀÚ¹ÙºóÀ¸·Î º¼ ¼ö ÀÖ´Ù.
¾î¶² ÀÚ¹ÙºóÀº ÀϹÝÀûÀÎ ÀÀ¿ë ÇÁ·Î±×·¥ÀÏ ¼ö ÀÖ´Ù. µû¶ó¼­, À¥ÆäÀÌÁö ¾ÈÂÊ¿¡ ½ºÇÁ·¹½º ½¬Æ® ¸¦ ³¢¾î³ÖÀ» ¼ö ÀÖ´Ù.

±×¸² 8. Button Beans
±×¸² 8. Button Beans

±×¸² 9. Spreadsheet Beans

ÀÌ µÎ°¡Áö ÇüÅ´ °ãÃÄÁø´Ù. ¿¹¸¦ µé¾î¼­ ½ºÇÁ·¹µå½¬Æ®°¡ ÀÀ¿ë ÇÁ·Î±×·¥ ¾ÈÂÊ¿¡ ³õÀÏ ¼ö ÀÖ µíÀÌ ½ºÇÁ·¹µå½¬Æ® ¾È¿¡ ÀÀ¿ë ÇÁ·Î±×·¥À» ³¢¾î ³ÖÀ» ¼ö µµ ÀÖ´Ù.

±×¸² 10. Barchart & Spreadsheet Beans
±×¸² 10. Barchart & Spreadsheet Beans

ÀÚ¹ÙºóÀº °£´ÜÇÑ ÄÄÆ÷³ÍÆ®ºÎÅÍ À¥ÆäÀÌÁö¿Í °°Àº º¹ÇÕµÈ ¹®¼­±îÁö ÁßÁ¡À» µÎ¸ç µðÀÚÀεǾú ´Ù. ±×·¯³ª, ClarisWorks³ª Microsoft Office¿Í °°Àº ¾ÆÁÖ º¹ÀâÇÑ ÇüÅÂÀÇ ¹®¼­ ½Ã½ºÅÛÀº Áö ¿øÇÏÁö ¾ÊÀ» °èȹÀÌ´Ù. µû¶ó¼­, ÇöÀç Áö¿øÇÏ´Â API´Â OLE ÄÁÆ®·ÑÀ̳ª ActiveX API¿Í À¯»ç ÇÑ APIÀ̰í, ¿öµå ÇÁ·Î¼¼¼­ ¹®¼­³ª ½ºÇÁ·¹µå½¬Æ® ¹®¼­¿Í °°Àº ÁÖ¿ä ¹®¼­µéÀ» ÀÚ¹ÙºóÀ¸·Î Áö ¿øÇÒ °ÍÀÌ´Ù.

ÀϹÝÀûÀ¸·Î ÀÚ¹Ùºó ÄÄÆ÷³ÍÆ®´Â ¾îµð¿¡¼­µç ½±°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï À۰ųª Áß°£ Å©±â·Î °³¹ß ÇÏ´Â °ÍÀÌ ÁÁ´Ù.

1.2 À̵¿¼º

ÀÚ¹Ùºó ±¸Á¶ÀÇ °¡Àå Å« ¸ñÀûÀº Ç÷¿Æû Á߸³ÀûÀÎ ÄÄÆ÷³ÍÆ® ±¸Á¶¸¦ Á¦°øÇϴµ¥ ÀÖ´Ù. ÀÚ¹Ùºó ÀÌ ´Ù¸¥ ÀÚ¹ÙºóÀÇ ¾ÈÂÊÀ¸·Î °ãÄ¡°Ô µÇ´õ¶óµµ ¸ðµç Ç÷¿Æû¿¡¼­ ¸ðµç ±â´ÉÀ» Áö¿øÇÑ´Ù. ±×·¯ ³ª, ÀÚ¹ÙºóÀÌ Word, Visual Basic, ClarisWorks, Netscape Navigator¿Í °°Àº °÷¿¡ »ðÀ﵃ ¶§ ÀÚ¹Ùºó API´Â ÁöÁ¤µÈ ·ÎÄà Ç÷¿ÆûÀÇ ±¸Á¶¿¡ ¸Â°Ô ÇÕ¼ºµÇµµ·ÏÇÑ´Ù.

¿¹¸¦ µé¾î¼­, Microsoft Ç÷¿Æû ȯ°æ¿¡¼­ ÀÚ¹Ùºó API´Â COM, ActiveX »çÀÌ¿¡¼­ ±³·®¿ªÇÒ À» ÇÑ´Ù. ¸¶Âù°¡Áö·Î ÀÚ¹ÙºóÀº Netscape Navigator»ó¿¡¼­´Â LiveConnect¿Í ÇÔ²² ¿¬°á µÇ°Å ³ª, Live Objectó·³ ó¸®µÈ´Ù.

µû¶ó¼­, ´Ü ÇϳªÀÇ ÀÚ¹ÙºóÀº ¾ÆÁÖ ´Ù¾çÇÑ ÇüÅ·ΠÀÛ¿ëÇÑ´Ù. ÁöÁ¤µÈ ȯ°æ¿¡¼­ ´Ù¸¥ ¾î¶² ÄÄÆ÷ ³ÍƮó·³ À̺¥Æ®¸¦ ¹ß»ý½Ã۰í, ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù.

¿©±â¿¡¼­ ±¸Ã¼ÀûÀÎ ÀÚ¹Ùºó ºê¸´Áö¿¡ ´ëÇØ¼­ ´Ù·çÁö´Â ¾Ê´Â´Ù. ºê¸®Áö´Â °¢ Ç÷¿Æû¿¡ ¸Âµµ·Ï ³ª¸§´ë·Î ÀÚ¹Ùºó API¸¦ Áö¿øÇÏ¸ç °³¹ßµÇ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù.

1.3 ±ÕÀÏÇÏ°í °í¼º´ÉÀÎ API

¼­·Î ´Ù¸¥ Ç÷¿Æû¿¡¼­ ÀÚ¹Ùºó API¸¦ Áö¿øÇÏ´Â ´É·Â ¶ÇÇÑ ´Ù¾çÇÏ´Ù. ±×·¯³ª, ÇØ´ç Ç÷¿Æû¿¡ ¼­ ÀÚ¹ÙºóÀÇ ±â´ÉÀ» ÃÖ´ë·Î Á¦°øÇÏÁö ¸øÇÒ ¼ö µµ ÀÖÀ¸¹Ç·Î, ÀÚ¹ÙºóÀ» »ç¿ëÇϴµ¥ º° ¹«¸® °¡ µû¸£Áö ¾Êµµ·Ï ±âº»ÀûÀ¸·Î ÀûÀýÇÑ ±â´ÉÀ» Á¦°øÇØ¾ß ÇÑ´Ù.

¿¹¸¦ µé¾î¼­, ÇØ´ç Ç÷¿Æû¿¡¼­ ¸Þ´º¹Ù¸¦ ÇÕÄ¡´Âµ¥ ¹®Á¦°¡ ÀÖ´Ù¸é ÀÌ ¸Þ´º¹Ù¸¦ ÆË¾÷À¸·Î ¶ç ¿î´Â ÇüÅÂÀÇ ±â´ÉÀ» Á¦°øÇØ¾ß ÇÑ´Ù.

ÀÌ ¸»Àº ÀÚ¹Ùºó °³¹ßÀÚ´Â ÀϰüµÈ API¸¦ »ç¿ëÇÏ¿© ¾î´À °÷¿¡¼­ Á¦´ë·Î ½ÇÇàµÇµµ·Ï ÇÁ·Î±×·¡ ¹Ö ÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ´ë½Å, ÀÚ¹ÙºóÀÌ ÇØ´ç Ç÷¿Æû¿¡¼­ ±¸Ã¼ÀûÀ¸·Î ¾î¶² ±â´ÉÀ¸·Î »ç¿ëµÉ °ÍÀÎÁö °í¹ÎÇÒ ÇÊ¿ä´Â ¾ø´Ù´Â °ÍÀÌ´Ù.

1.4 ´Ü¼ø¼º

ÀÚ¹Ùºó API´Â ºñ±³Àû ½±°Ô µÇ¾îÀÖ´Ù. Áß·®ÀÇ ÄÄÆ÷³ÍÆ® º¸´Ù´Â °æ·®ÀÇ ÄÄÆ÷³ÍÆ®¸¦ ¸¸µå´Âµ¥ ÁßÁ¡À» µÎ¾î¾ß ÇÑ´Ù.

ÀϹÝÀûÀ¸·Î java.beans.Everything Ŭ·¡½º¸¦ »ó¼Ó¹ÞÀº ÇüÅÂÀÇ ÀÚ¹Ùºó ÄÄÆ÷³ÍÆ®´Â ÁÁÁö ¾Ê´Ù. ÀÚ¹ÙºóÀÌ »ó¼ÓÀ» ÅëÇØ ½ÇÇàÁß¿¡ Çã¿ëµÇÁö ¾ÊÀº ¾î¶°ÇÑ ÇüÅÂÀÇ ±âº»ÀûÀÎ ±â´ÉÀ» Áö¿øÇϱ⠺¸ ´Ù´Â, java.beans.Something ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ ÁÖ¾îÁø ƯÁ¤ ¿ªÇÒÀ» ÇÏ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù.

¶ÇÇϳªÀÇ ÀÚ¹ÙºóÀÇ Æ¯Â¡Àº °³¹ßÀÚ°¡ ÀÚ¹ÙºóÀÇ ±âº»ÀûÀÎ °³³äµéÀ» ºü¸£°Ô ÀÌÇØÇÏ¿©, ¾à°£ÀÇ ³ë·ÂÀ¸·Îµµ ½±°í ºü¸£°Ô ÀÚ¹ÙºóÀ» °³¹ßÇÒ ¼ö ÀÖµµ·Ï ÀÚ¹ÙºóÀº ±¸¼ºµÇ¾ú´Ù.

2. Visual CafeÀÇ °£´ÜÇÑ ÇÁ·Î±×·¡¹Ö.

ÀÚ¹ÙºóÀ» Å« ¾È¸ñÀ¸·Î ÀÌÇØÇϱâ À§ÇØ Visual Cafe¸¦ ¿¹·Î µé°Ú´Ù. ±×·¯³ª, ºñ´Ü Visual Cafe ¸¸ÀÌ ¾Æ´Ï°í ¸ðµç ÀÚ¹Ù ºô´õ ÅøÀº ÀÌ·¯ÇÑ ÇüŸ¦ ¶ì°Ô µÈ´Ù. ¿ÀÈ÷·Á Áö±Ý ¿¹¸¦ µé°í ÀÖ´Â Visual Cafe 1.0Àº ¾ÆÁ÷ ¿Ïº®ÇÑ ÀÚ¹ÙºóÀÇ °³³äÀ» ¼³¸íÇÏÁö´Â ¾ÊÁö¸¸, ÀÚ¹ÙºóÀÇ ¹ß´ÜÀÌ ÀÌ·¸ °Ô µÈ´Ù´Â °ÍÀ» ÀÌÇØÇÒ ¼ö´Â ÀÖ´Ù.

Visual Cafe·Î ÀÚ¹ÙºóÀ» ¼³¸íÇÒ ¤¨ °¡Àå Áß¿äÇÑ 3°¡Áö ¿ä¼Ò´Â Component Window or Componet Palette, Property Window, Form or Client WindowÀÌ´Ù. °¢°¢Àº ´ÙÀ½°ú °°ÀÌ µÇ ¾îÀÖ´Ù.

±×¸² 11. Component Window
±×¸² 11. Component Window
±×¸² 12. Component Palette
±×¸² 12. Component Palette
±×¸² 13. Form or Client Window
±×¸² 13. Form or Client Window
±×¸² 14. Property Window
±×¸² 14. Property Window

À§ÀÇ ±×¸²¿¡¼­ Component Palette´Â ÄÄÆ÷³ÍÆ®¸¦ ¸ðµÎ ¸ð¾Æ³õÀº Componet WindowÀÇ ¸î °³ ¸¦ ¸Þ´º·Î µî·Ï ½ÃÄѳõÀº °ÍÀÌ´Ù.

¼ÒÇÁÆ®¿þ¾î¸¦ °³¹ßÇÒ ¶§ °³¹ßÀÚ´Â Component Window·ÎºÎÅÍ ÄÄÆ÷³ÍÆ®¸¦ ¼±ÅÃÇØ Client Window¿¡ ³õ´Â´Ù. ±×¸®°í, ¼±ÅÃÇÑ ÄÄÆ÷³ÍÆ®ÀÇ ¼Ó¼º°ªµéÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ½±°Ô »ý°¢Çؼ­ ¾î¼¸é À̰ÍÀÌ ÀÚ¹Ù ÇÁ·Î±×·¡¹Ö ¶Ç´Â ÀÚ¹ÙºóÀ» »ç¿ëÇÏ´Â ÀüºÎ°¡ µÉ ¼ö ÀÖ´Ù. ¾Æ·¡ ±×¸²Àº Æû¿¡(Client Window)¿¡ µÎ °³ÀÇ ¹öư°ú ÇϳªÀÇ ¸®½ºÆ®¸¦ Ãß°¡Çß´Ù. ¹öưÀÇ ¼Ó¼º¿¡¼­ ·¹ÀÌºí °ªÀ» ¹Ù²Ù°í, ¸®½ºÆ® ÄÄÆ÷³ÍÆ®ÀÇ ¼Ó¼ºÀ¸·Î´Â ¸®½ºÆ®ÀÇ ¾ÆÀÌÅÛÀ» Ãß°¡ÇÏ¿´´Ù.

±×¸² 15. Æû µðÀÚÀÎ
±×¸² 15. Æû µðÀÚÀÎ

ÇѰ¡Áö ´õ Ãß°¡ÇÏÀÚ¸é °¢ ÄÄÆ÷³ÍÆ®°£¿¡ À̺¥Æ®¸¦ ¼³Á¤ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¿¹¸¦ µé¾î¼­ Add Item ¹öưÀÌ ¼±Åà µÇ¾úÀ» ¶§ ¸®½ºÆ®¿¡ "chaconne@hei.co.kr" ¹®ÀÚ¿­ÀÇ ¾ÆÀÌÅÛÀ» Ãß°¡ Çϰí, Clear List ¹öưÀÌ ¼±Åà µÇ¾úÀ» ¶§ ¸®½ºÆ®ÀÇ ¸ðµç ¾ÆÀÌÅÛÀ» »èÁ¦ÇÏ´Â ±â´ÉÀ» ºñÁê¾óÇÏ °Ô ÇÁ·Î±×·¡¹Ö ÇÒ ¼ö ÀÖ´Ù. Visual CafeÀÇ °æ¿ì¿¡´Â Palette WindowÀÇ ¿ÞÂÊ ÇÏ´Ü¿¡ µÎ °³ ÀÇ Ç÷¯±×°¡ ±×·ÁÁ® ÀÖ´Â ¹öưÀ» ¼±ÅÃÇÑ ÈÄ ¸ÕÀú À̺¥Æ®¸¦ ¹ß»ý(Event Source)½ÃŰ´Â ÄÄÆ÷ ³ÍÆ®¸¦ ÁöÁ¤Çϰí(¿©±â¿¡¼­´Â Add Item ¹öư), ±× ´ÙÀ½ ±× À̺¥Æ®¸¦ ¹Þ¾Æ(Event Listener) »õ·Î¿î ÇൿÀ» ÃëÇÏ´Â ÄÄÆ÷³ÍÆ®¸¦ ÁöÁ¤ÇÏ¸é µÈ´Ù. Visual Cafe¿¡¼­´Â À̰ÍÀ» InteractionÀ̶ó °í À̾߱â Çϴµ¥, °á±¹Àº À̺¥Æ®ÀÇ ¿¬°áÀÌ´Ù. ´ÙÀ½Àº ±× ½ÇÇà ¿¹ÀÌ´Ù.

±×¸² 16. À̺¥Æ® ¿¬°á
±×¸² 16. À̺¥Æ® ¿¬°á
±×¸² 17.  Source Event¿Í   TargetÀÇ ±â´É ¼³Á¤;   ¹öưŬ¸¯°ú ¾ÆÀÌÅÛ Ãß°¡¼±ÅÃ
±×¸² 17. Source Event¿Í TargetÀÇ ±â´É ¼³Á¤; ¹öưŬ¸¯°ú ¾ÆÀÌÅÛ Ãß°¡¼±ÅÃ
±×¸² 18. Ãß°¡ÇÏ·Á´Â ¾ÆÀÌÅÛÀÇ ¹®ÀÚ¿­ ÁöÁ¤
±×¸² 18. Ãß°¡ÇÏ·Á´Â ¾ÆÀÌÅÛÀÇ ¹®ÀÚ¿­ ÁöÁ¤

¸ðµç °ÍÀÌ ÀÚµ¿À¸·Î ÀÌ·ç¾îÁ³´Ù. À̰ÍÀ¸·Î ¸ðµç ÀÚ¹Ù ÇÁ·Î±×·¡¹ÖÀÌ ³¡³µ´Ù. ÀÌ·¸°Ô ºñÁê¾óÇÏ °Ô ÇÁ·Î±×·¡¹ÖÇÑ ·çƾÀº ÀÚµ¿À¸·Î ¼Ò½ºÄڵ尡 »ý¼ºµÇ¾î ¹«³­ÇÏ°Ô ½ÇÇàµÈ´Ù. ¸¸¾à ÆÄ¿ö ÇÁ·Î ±×·¡¸ÓÀÎ °æ¿ì ¼Ò½ºÄڵ带 º¸°íÀÚ ÇÑ´Ù¸é ¹°·Ð ¼Ò½ºÅ©µå¸¦ ¼öÁ¤ÇÒ ¼ö µµ ÀÖ´Ù. ÀÌ·¯ÇÑ ±â´É Àº ¾Õ¿¡¼­ ¸»ÇÑ¹Ù¿Í °°ÀÌ °³¹ßÅø¿¡ µû¶ó ½ºÅ©¸³Æ®¸¦ Áö¿øÇϴ°͵µ ÀÖ´Ù. ´ÙÀ½Àº ´Ù¸¥ °³¹ß ÅøÀÎ Mojo¿¡¼­ÀÇ ¼Ò½ºÅ©µå ÆíÁý È­¸éÀÌ´Ù.

±×¸² 19. ¼Ò½ºÄÚµå ÆíÁý
±×¸² 19. ¼Ò½ºÄÚµå ÆíÁý

±×·¯¸é, Áö±Ý±îÁö ¼³¸íÇÑ ÀÚ¹ÙºóÀÇ º¯ÇüÀÇ ¿øÇüÀ» ¾Ë¾Æº¸°í °ú¿¬ ÀÚ¹ÙºóÀº ÇÁ·Î±×·¥À¸·Î ¾î ¶»°Ô ±¸ÇöµÇ´ÂÁö ¾Ë¾Æº¸°Ú´Ù.

3 ÀÚ¹ÙºóÀÇ ¼Ó¼º(Property)

ÀÚ¹ÙºóÀÇ ¼Ó¼º°ªÀº publicÀ¸·Î ¼±¾ðµÇ¾î Àаí/¾²±â, Àбâ, ¾²±â°¡ °¡´ÉÇÏ´Ù. ÀÌµé ¼Ó¼ºÀÇ Á¾ ·ù¿¡´Â °ªÀÇ ÀÔ·Â ÇüÅÂ¿Í ¾²ÀÓ¿¡ µû¶ó ´Ü¼øÇü(simple property), ¹è¿­Çü(indexed property), °æ°èÇü(bound property), ¼Ó¹ÚÇü(constrained property)ÀÌ ÀÖ´Ù.

±×¸² 20. BDKÀÇ BeanBox¸¦ ÀÌ¿ëÇÑ ºñÁê¾ó ÇÁ·Î±×·¡¹Ö (I)
±×¸² 20. BDKÀÇ BeanBox¸¦ ÀÌ¿ëÇÑ ºñÁê¾ó ÇÁ·Î±×·¡¹Ö (I)
±×¸² 21. BDKÀÇ BeanBox¸¦ ÀÌ¿ëÇÑ ºñÁê¾ó ÇÁ·Î±×·¡¹Ö (II)
±×¸² 21. BDKÀÇ BeanBox¸¦ ÀÌ¿ëÇÑ ºñÁê¾ó ÇÁ·Î±×·¡¹Ö (II)


3.1 ´Ü¼øÇü ¼Ó¼º°ª(Simple property)

´Ü¼øÇü ¼Ó¼º°ªÀº ÇϳªÀÇ °ªÀ¸·Î Ç¥ÇöµÇ¸ç get/setÀ¸·Î ½ÃÀÛÇÏ´Â À̸§ÀÇ ¸Þ¼Òµå·Î ¦À» ÀÌ·ç °í ¼Ó¼ºÀÇ À̸§Àº ÀÌµé ¸Þ¼Òµå¿¡ ÀÇÇØ¼­ ¾Ë·ÁÁø´Ù. ¿¹¸¦ µé¾î¼­ setX, getX ¸Þ¼Òµå°¡ ÀÖ´Ù ¸é À̰ÍÀº ¼Ó¼º À̸§ÀÌ XÀÓÀ» ³ªÅ¸³½´Ù. ±×¸®°í, isX¶ó´Â À̸§ÀÇ ¸Þ¼Òµå°¡ ÀÖ´Ù¸é X´Â boolean °ªÀ» °¡ÁüÀ» ¾Ë¸®´Â °ÍÀÌ´Ù. ´ÙÀ½Àº ´Ü¼øÇü ¼Ó¼º°ªÀ» »ç¿ëÇÏ´Â °£´ÜÇÑ ¿¹Á¦ÀÌ´Ù.

public class kojang1 extends Canvas {
    String ourString = "Hello";
    public kojang1() {
        setBackground(Color.red);
        setForeground(Color.blue);
    }
    public void setString(String newString) {
        outString = newString;
    }
    public String getString() {
        return outString;
    }
    public Dimension getMinimumSize() {
        return new Dimension(50, 50);
    }
}

setString(String newString)¸Þ¼Òµå·Î ¼Ó¼º°ªÀ» ¼³Á¤Çϰí, getString() ¸Þ¼Òµå·Î ¼Ó¼º°ªÀ» ¾ò ¾î³½´Ù.

3.2 ¹è¿­Çü ¼Ó¼º°ª(Indexed Property)

¹è¿­Çü ¼Ó¼º°ªÀº ¹è¿­ÀÇ °ªÀ» °¡Áø´Ù. ¼Ó¼ºÀÇ ¿ø¼ÒµéÀº get/set ¸Þ¼Òµå·ÎºÎÅÍ Á¤¼öÇü ÀÎÅØ½º ¸¦ ¾ò¾î³»¾î ¹è¿­ÀÇ ÇÑ ¿ø¼ÒÀÇ °ªÀ» ¼³Á¤Çϰųª ¾ò¾î³¾ ¼ö ÀÖ°í, Àüü ¹è¿­ÀÇ °ªµµ ¸¶Âù°¡ Áö·Î ¼³Á¤Çϰųª ¾ò¾î³¾ ¼ö ÀÖ´Ù. ´ÙÀ½Àº »ç¿ë ¿¹ÀÌ´Ù.

public class kojang2 extends Canvas {
    int[] dataSet = {1, 2, 3, 4, 5, 6};
    public kojang2() {
        setBackground(Color.red);
        setForeground(Color.blue);
    }
    pubilc void setDataSet(int[] x) {
        dataSet = x;
    }
    public void setDataSet(int index, int x) {
        dataSet[index] = x;
    }
    public int[] getDataSet() {
        return dataSet;
    }
    public int getDataSet(int x) {
        return dataSet[x];
    }
}

setDataSet(int[] x) ¸Þ¼Òµå·Î ¹è¿­ Àüü °ªÀ» ¼³Á¤Çϰí, getDataSet()¸Þ¼Òµå¸¦ ÅëÇØ¼­ Àüü ¹è¿­ °ªÀ» ¾ò¾î³½´Ù. ¶ÇÇÑ, setDataSet(int index, int x) ¸Þ¼Òµå·Î ¹è¿­ÀÇ ÇÑ ¿ø¼ÒÀÇ °ªÀ» ¼³ Á¤Çϰí, getDataSet(int x) ¸Þ¼Òµå·Î ¹è¿­ÀÇ ÇÑ ¿ø¼ÒÀÇ °ªÀ» ¾ò¾î³½´Ù.

3.3 °æ°èÇü ¼Ó¼º°ª(Bound Property)

°æ°èÇü ¼Ó¼º°ªÀº ÀÚ½ÅÀÇ °ªÀÌ ¹Ù²î¸é ´Ù¸¥ °´Ã¼¿¡°Ô ¾Ë¸°´Ù. °ªÀÌ ¸Å¹ø ¹Ù²ð ¶§ ¸¶´Ù ¼Ó¼º ÀÇ À̸§, ÀÌÀü °ª°ú »õ·Î¿î °ª¿¡ ´ëÇÑ Á¤º¸¸¦ ½ÇÀº PropertyChange À̺¥Æ®¸¦ ¹ß»ý½ÃŲ´Ù.

public class kojang3 extends Canvas {
    String ourString = "Hello";
    private PropertyChangeSupport change = 
                                new PropertyChangeSupport(this);
    public kojang3()
    {
        setBackground(Color.red);
        setForeground(Color.blue);
    }
    public void setString(String newString) {
        String oldString = ourString;
        ourString = newString;
        changes.firePropertyChange("string", oldString, newString);
    }
    public String getString() {
        return outString;
    }
    public Dimension getMinimumSize() {
        return new Dimension(50, 50);
    }
    public void addPropertyChangeListener(PropertyChangeListener l) {
        changes.addPropertyChangeListener(l);
    }
    public void removePropertyChangeListener(
                                PropertyChangeListener l) {
        changes.removePropertyChangeListener(l);
    }
}

¿ì¼± ProperyChangeSupport °´Ã¼¸¦ »ý¼ºÇÏ°í ¸¸¾à ¼Ó¼º°ªÀÌ ¹Ù²î°Ô µÇ¸é(setString ¸Þ¼Òµå °¡ È£ÃâµÇ¸é) À̺¥Æ® ¼ö½ÅÀÚ(listener)¿¡°Ô À̺¥Æ®¸¦ ¹ß»ý½ÃÄÑ Á¤º¸¸¦ Àü´ÞÇÑ´Ù. ÇÑÆí, addPropertyChangeListener, removePropertyChangeListener ¸Þ¼Òµå¸¦ ÅëÇØ¼­ À̺¥Æ® ¼ö½Å ÀÚ¸¦ Ãß°¡Çϰųª »èÁ¦ÇÒ ¼ö ÀÖ´Ù.

3.4 ¼Ó¹ÚÇü ¼Ó¼º°ª(Constrained Property)

¼Ó¹ÚÇü ¼Ó¼º°ªÀ» °¡Áö´Â °´Ã¼´Â ´Ù¸¥ °´Ã¼·Î ÇÏ¿©±Ý ÀÚ½ÅÀÇ ¼Ó¼º°ªÀ» ¹Ù²Ù´Â °ÍÀ» °ÅºÎÇÒ ¼ö ÀÖ´Ù. ¼Ó¹ÚÇü ¼Ó¼º°ªÀ» ¼ö½ÅÇÏ´Â °´Ã¼´Â °ªÀ» ¹Ù²ÙÁö¾Ê°í PropertyVetoExceptionÀ» ¼öÇà (throw)Çϸ鼭 ´Ù¸¥ ·çƾÀ» ½ÇÇà½ÃŲ´Ù.

public class JellyBean extends Canvas {
    private PropertyChangeSupport changes = 
                                new PropertyChangeSupport(this);
    private VetoableChangeSupport vetos =
                                new VetoableChangeSupport(this);
    ......
    public void setPriceInCents(int newPriceInCents)
                                throws PropertyVetoException {
        int oldPriceInCents = ourPriceInCents;
        vetos.fireVetoableChange("priceInCents",
                                new Integer(oldPriceInCents),
                                new Integer(newPriceInCents));
        ourPriceInCents = newPriceInCents;
        changes.firePropertyChange("priceInCents",
                                new Integer(oldPriceInCents),
                                new Integer(newPriceInCents));
    }
    public void addVetoableChangeListener(VetoableChangeListener l) {
        vetos.addVetoableChangeListener(l);
    }
    public void removeVetoableChangeListener(
                                                leChangeListener l) {
    }
    ......
}

À§ÀÇ ¿¹Á¦ ÇÁ·Î±×·¥¿¡¼­ º¯¼ö °ªÀ» ¹Ù²Ü ¼ö ÀÖ´Â °æ¿ì´Â vetoableChange À̺¥Æ®·Î ÀÎÇØ µî ·ÏµÈ ¸ðµç VetoableChangeListener°´Ã¼°¡ ¼Ó¼º°ª º¯°æÀ» Çã¶ôÇÒ °æ¿ì¿¡¸¸ °ªÀ» º¯°æÇϰí propertyChange À̺¥Æ®¸¦ ¹ß»ý½ÃÄÑ ¸¶¹«¸®¸¦ ÇÒ ¼ö ÀÖ´Ù. ¸¸¾à, VetoableChangeListener °´ ü Çϳª¶óµµ Çã¶ôÇÏÁö ¾ÊÀ¸¸é PropertyVetoExceptionÀÌ ¹ß»ýÇÏ¿© ¼Ó¼º°ªÀ» º¯°æÇÒ ¼ö ¾ø°Ô µÈ´Ù.

4. À̺¥Æ®(Event)

4.1. AWTÀÇ »õ·Î¿î À̺¥Æ® ¸ðµ¨

AWT¿¡ »õ·Ó°Ô Á¤ÀÇÇÑ À̺¥Æ® ¸ðµ¨Àº JavaBeans¿¡¼­µµ »ç¿ëÇÏ´Â À̺¥Æ® ¸ðµ¨·Î½á ¸¹Àº ºÎ ºÐ¿¡¼­ °³¼±µÇ¾ú´Ù. ÀÌÀüÀÇ À̺¥Æ® ¸ðµ¨Àº ¿©·¯ °¡Áö ¹®Á¦Á¡À» ³»ÀçÇϰí ÀÖ¾ú´Ù. ¿ì¼±, À̺¥ Æ®¸¦ ó¸®Çϱâ À§Çؼ­´Â AWT ÄÄÆ÷³ÍÆ®¸¦ »ó¼Ó ¹Þ¾Æ¾ß¸¸ °¡´ÉÇß°í, GUI ÄÄÆ÷³ÍÆ®ÀÇ ±¸Á¶ ¿¡ µû¶ó À̺¥Æ®°¡ Àü´Þ µÇ¾ú´Ù. ¸ðµç À̺¥Æ®´Â handleEvent¿Í action¿¡¼­ ¸ðµÎ 󸮵ǹǷΠÄڵ尡 È¥¶õ½º·¯¿ü°í, µû¶ó¼­ ¿À·ù°¡ ¹ß»ýÇϱ⠽¬¿î ȯ°æÀ̾ú´Ù.

»õ·Ó°Ô ±¸¼ºµÈ À̺¥Æ® ¸ðµ¨Àº ¹è¿ì±â ½±°í, ÈξÀ ±¸Á¶ÀûÀ¸·Î µðÀÚÀÎ µÇ¾ú´Ù. ƯÈ÷ GUI ÄÚµå ¿Í È®½ÇÇÏ°Ô ±¸ºÐµÇ¾î È¥µ·À¸·Î ÀÎÇÑ ÇÁ·Î±×·¥ ¿À·ù¸¦ ¹æÁöÇϰí, ºñÁê¾ó ÅøÀ» »ç¿ëÇØ¼­ ½± °Ô ÇÁ·Î±×·¡¹Ö ÇÒ ¼ö ÀÖ°Ô µÇ¾ú´Ù. ¶ÇÇÑ ÇϳªÀÇ Event Ŭ·¡½º¿¡¼­ ¸ðµç À̺¥Æ®¸¦ Á¤¼ö ÇüÅ ÀÇ ID·Î Ç¥ÇöÇÏÁö ¾Ê°í ÈξÀ ´Ù¾çÇÑ ÇüÅÂÀ̸鼭 ÀÌÀü ÄÚµå¿Í ȣȯ¼º ÀÖµµ·Ï µðÀÚÀÎ µÇ¾ú´Ù.

»õ·Î¿î AWTÀÇ À̺¥Æ®´Â ÇÏÀ§·¹º§ÀÇ À̺¥Æ®¿Í »óÀ§·¹º§ÀÇ À̺¥Æ®·Î ³ª´©¾îÁ® ÀÖ´Ù.

ÇÏÀ§·¹º§ÀÇ À̺¥Æ®
java.util.EvnetObject
    java.awt.AWTEvent
        (À©µµ¿ìÀÇ À̵¿, Å©±â º¯È­µî¿¡ ÀÇÇÑ À̺¥Æ®)
        java.awt.event.ComponentEvent 
            (Űº¸µå Æ÷Ä¿½º¿¡ ÀÇÇÑ À̺¥Æ®)
            java.awt.event.FocusEvent
            java.awt.event.InputEvent
                (Űº¸µå ÀԷ¿¡ ÀÇÇÑ À̺¥Æ®)
                java.awt.event.KeyEvent
                (¸¶¿ì½º ÀԷ¿¡ ÀÇÇÑ À̺¥Æ®)
                java.awt.event.MouseEvnet

»óÀ§·¹º§ÀÇ À̺¥Æ®
java.util.EventObject
    java.awt.event.AWTEvent
        (¸í·ÉÀÇ ½ÇÇà¿¡ µû¸¥ À̺¥Æ®)
        java.awt.event.ActionEvent
        (°ªÀÇ º¯È­¿¡ µû¸¥ À̺¥Æ®)
        java.awt.event.AdjustmentEvent
        (¾ÆÀÌÅÛÀÇ »óÅ¿¡ µû¸¥ À̺¥Æ®)
        java.awt.event.ItemEvent

AWTÀÇ À̺¥Æ®´Â À̺¥Æ®¸¦ ¹ß»ý½ÃŰ´Â °ÍÀ» EventSource¶ó°í Çϰí À̺¥Æ®¸¦ ¼ö½ÅÇÏ´Â °Í À» EventListener¶ó°í ºÎ¸¥´Ù. EventListener´Â AWTÀÇ »õ·Î¿î À̺¥Æ®ÀÇ ÇüÅ¿¡ µû¶ó ´ÙÀ½ °ú °°ÀÌ ±¸ºÐµÇ¾î ÀÖ´Ù.

ÇÏÀ§·¹º§ÀÇ Event Listener
java.util.EvnetListener
    java.awt.event.ComponentListener 
    java.awt.event.FocusListener 
    java.awt.event.KeyListener 
    java.awt.event.MouseListener 
    java.awt.event.MouseMotionListener 
    java.awt.event.WindowListener 
»óÀ§·¹º§ÀÇ À̺¥Æ®
java.util.EventListener
    java.awt.event.ActionListener
    java.awt.event.AdjustmentListener
    java.awt.event.ItemListener

¶ÇÇÑ, EventSource´Â ÄÄÆ÷³ÍÆ®ÀÇ Æ¯¼º¿¡ µû¶ó ¹ß»ý ½Ãų ¼ö ÀÖ´Â À̺¥Æ®°¡ Á¤ÇØÀÖ´Ù. ´ÙÀ½ Àº °¢°¢ÀÇ ÄÄÆ÷³ÍÆ®¿¡ µû¸¥ EventSource¸¦ µî·ÏÇÏ´Â ¸Þ¼ÒµåµéÀÌ´Ù.

* java.awt.Component
    addComponentListener(ComponentListener l)
    addFocusListener(FocusListener l)
    addKeyListener(KeyListener l)
    addMouseListener(MouseListener l)
    addMouseMotionListener(MouseMotionListener l)
* java.awt.Dialog
    addWindowListener(WindowListener l)
* java.awt.Frame
    addWindowListener(WindowListener l)
* java.awt.Button
    addActionListener(ActionListener l)
* java.awt.Choice
    addItemListener(ItemListener l)
* java.awt.Checkbox
    addItemListener(ItemListener l)
* java.awt.CheckboxMenuItem
    addItemListener(ItemListener l)
* java.awt.List
    addActionListener(ActionListener l)
    addItemListener(ItemListener l)
* java.awt.MenuItem
    addActionListener(ActionListener l)
* java.awt.Scrollbar
    addAdjustmentListener(AdjustmentListener l)
* java.awt.TextField
    addActionListener(ActionListener l)

´ëºÎºÐÀÇ EventListener´Â ¿©·¯ °³ÀÇ À̺£Æ®¸¦ ó¸®ÇÑ´Ù. ÇÑ ¿¹·Î ¸¶¿ì½ºÀÇ À̺¥Æ®´Â mouse-down, mouse-up, mouse-enter µî ´Ù¾çÇѵ¥ ¸ðµÎ MouseListener¿¡¼­ ó¸®ÇÑ´Ù. µû ¶ó¼­, AWT ¿©·¯°³ÀÇ ¾î´ðÅÍ Å¬·¡½º¸¦ ÀçÁ¤ÀÇ ÇÏ¿© »ç¿ëÇÔÀ¸·Î½á ÇÊ¿äÇÑ À̺¥Æ®¸¸ ó¸®ÇÒ ¼ö ÀÖµµ·Ï Çϰí ÀÖ´Ù. ÀÌ·¯ÇÑ ¾î´ðÅÍ Å¬·¡½º¿¡´Â ´ÙÀ½°ú °°´Ù.

java.awt.event.ComponentAdapter
java.awt.event.FocusAdapter
java.awt.event.KeyAdapter
java.awt.event.MouseAdapter
java.awt.event.MouseMotionAdapter
java.awt.event.WindowAdapter

±×·¯¸é, ÀÌ·¯ÇÑ »õ·Î¿î À̺¥Æ® ±¸Á¶¸¦ »ç¿ëÇÏ´Â ¿¹Á¦ ÇÁ·Î±×·¥À» Çϳª »ìÆìº¸°Ú´Ù.

import java.awt.*;
import java.awt.event.*;

public class App {
    public void search() { // °Ë»ö ±â´ÉÀÌ ÀÖ´Â °ÍÀ¸·Î ÇÑ´Ù....}
    public void sort() { // Á¤·Ä ±â´ÉÀÌ ÀÖ´Â °ÍÀ¸·Î ÇÑ´Ù....}
    static public void main(String args[]) {
        App app = new App();
        GUI gui = new GUI(app);
    }
}
class Command implements ActionListener {
    static final int SEARCH = 0;
    static final int SORT = 1;
    int id;
    App app;
    public Command(int id, App app) {
        this.id = id;
        this.app = app;
    }
    public void actionPerformed(ActionEvent e) {
        switch(id) {
            case SEARCH :
                 app.search();
                 break;
            case SORT :
                 app.sort();
                 break;
        }
    }
}
class GUI {
    public GUI(App app) {
        Frame f = new Frame();
        f.setLayout(new FlowLayout()); 
        Command searchCmd = new Command(Command.SEARCH, app);
        Command sortCmd = new Command(Command.SORT, app);
        Button b;
        f.add(b = new Button("Search"));
        b.addActionListener(searchCmd);
        f.add(b = new Button("Sort"));
        b.addActionListener(sortCmd);
        List l;
        f.add(l = new List());
        l.add("Alphabetical");
        l.add("Chronological");
        l.addActionListener(sortCmd);
        f.pack();
        f.show();
    }
}

À̺¥Æ®´Â AWT ÄÄÆ÷³ÍÆ®¿¡¼­ ÀÚµ¿ ¹ß»ýµÇ´Â °Í¸¸ÀÌ ÀÖ´Â °ÍÀÌ ¾Æ´Ï¶ó, °³¹ßÀÚ°¡ Çʿ信 µû ¶ó¼­ ÀÚ½ÅÀÇ À̺¥Æ®¸¦ Á¤ÀÇÇØ¼­ À̺¥Æ®¸¦ Àü´ÞÇÏ°í ¼ö½ÅÇÒ ¼ö ÀÖ´Ù. ÀÌÀü AWT¿¡¼­´Â postEvent¸¦ ÀÌ¿ëÇØ¼­ Event °´Ã¼¸¦ Àü´ÞÇϰí handleEvent¿¡¼­ ¼ö½ÅÇÏ´Â ÇüÅÂÀ̾ú´Âµ¥, »õ ·Î¿î AWT¿¡¼­´Â Áö±Ý±îÁö ¼³¸íÇÑ À̺¥Æ® ±¸Á¶¿Í ºñ½ÁÇÑ ÇüÅÂÀÇ »õ·Î¿î À̺¥Æ® ±¸Á¶¸¦ °¡ Áø´Ù. ´ÙÀ½Àº ÀÌ·¯ÇÑ À̺¥Æ® ±¸Á¶¸¦ »ç¿ëÇÏ´Â ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù.

public class TextCanvas extends Canvas {
    boolean haveFocus = false;
    public TextCanvas() {
        enableEvents(AWTEvent.FOCUS_EVENT_MASK);
        ...
    }
    protected void processFocusEvent(FocusEvent e) {
        switch(e.getId()) {
            case FocusEvent.FOCUS_GAINED :
                haveFocus = true;
                break;
            case FocusEvent.FOCUS_LOST :
                haveFocus = false;
        }
        repaint();
        super.processFocusEvent(e);
    }
    public void paint(Grahpics g) {
        if(haveFocus) {
            // Űº¸µå Æ÷Ä¿½º¸¦ °®´Â È­¸é °»½Å
        }
    }
    ... Áß·« ...
}

enableEvents¿¡¼­ ÀÚ½ÅÀÌ ÇÊ¿äÇÑ Æ÷Ä¿½º À̺¥Æ®¸¦ Çã¿ëÇÔÀ» ¾Ë¸®°í, processFocusEvent¿¡¼­ ÀÌ¿¡ µû¸¥ À̺¥Æ®¸¦ ó¸®ÇÑ´Ù. ÀÌ·¯ÇÑ ¸Þ¼Òµå·Î´Â

        protected void processEvent(AWTEvent e)
        protected void processActionEvent(ActionEvent e)
        protedted void processItemEvent(ItemEvent e)

°¡ ÀÖ´Ù. ÇÑÆí, À§ÀÇ ¿¹Á¦¿¡¼­ ÀÚ½ÅÀÌ Ã³¸®ÇÏÁö ¸øÇÏ´Â ºÎºÐ¿¡ ´ëÇØ¼­´Â »óÀ§ Ŭ·¡½ºÀÇ processFocusEvent¸¦ È£ÃâÇÔÀ¸·Î½á ÇØ°áÇϰí ÀÖ´Ù.

JDK 1.1 AWT´Â À̺¥Æ® Å¥(Event Queue)¸¦ Á¦°øÇϴµ¥ java.awt.EventQueue·Î ±¸ÇöµÇ¾î ÀÖ´Ù. À̺¥Æ® Å¥´Â getEventQueue, postEvent, getNextEvent, peekEvent µîÀÇ ¸Þ¼Òµå¸¦ Åë ÇØ¼­ Á÷Á¢ À̺¥Æ® Å¥¸¦ Á¶ÀÛÇÒ ¼ö ÀÖ´Ù.

4.2. ÀÚ¹ÙºóÀÇ À̺¥Æ®

À̺¥Æ®´Â source °´Ã¼¿Í Ÿ°ÙÀÌ µÇ´Â listener °´Ã¼ »çÀÌÀÇ »óÅ º¯È­¸¦ ¾Ë¸®´Â ¸ÞÄ¿´ÏÁòÀ¸ ·Î, ÄÄÆ÷³ÍÆ®¸¦ °³¹ßÅø°ú ¿«¾î¼­ ½ÇÇàÇÒ ¼ö ÀÖ´Â ¸ÞÄ¿´ÏÁòÀ» Á¦°øÇÑ´Ù. À̺¥Æ®´Â ¾ÆÁÖ ´Ù¾ç ÇÏ°Ô »ç¿ëµÇÁö¸¸ ÀϹÝÀûÀ¸·Î ¸¶¿ì½ºÀÇ ÀÔ·ÂÀ̳ª, Űº¸µå ÀÔ·Â, À§Á¬ÀÇ °»½ÅÀ» ¾Ë¸®´Âµ¥ ÁÖ·Î »ç¿ëµÇ°í ÀÖ´Ù. ¿©±â¿¡¼­´Â WaterSource, Valve, Pipe ÀÚ¹ÙºóÀÇ ¿¹Á¦ ÇÁ·Î±×·¥À» º¸¸é¼­ ÀÌ º¥Æ®ÀÇ ÀÌÇØ¸¦ µ½°Ú´Ù.

±×¸² 18. JavaBeanÀÇ °´Ã¼°£ÀÇ À̺¥Æ® È帧
±×¸² 18. JavaBeanÀÇ °´Ã¼°£ÀÇ À̺¥Æ® È帧

À§ÀÇ ±×¸²¿¡¼­ WaterSource´Â ÃÊ´ç ÇϳªÀÇ WaterEventObject¸¦ WaterListener¿¡°Ô Àü´ÞÇÑ ´Ù. WaterListener´Â ¿©·¯ °³°¡ µÉ ¼ö Àִµ¥ ¿©±â¿¡¼­´Â Valve¿Í Pipe°¡ ±× ¿ªÇÒÀ» ´ã´çÇÏ °í ÀÖµû. Valve°¡ ¿­¸®¸é WaterEventObject¸¦ ÀÚ½ÅÀÇ WaterListener¿¡ ´Ù½Ã Àü¼ÛÇÏ°Ô µÇ°í, ´ÝÇôÀÖÀ¸¸é WaterEventObject´Â Àü´ÞµÇÁö ¾Ê´Â´Ù. ±×¸®°í, Pipe´Â ¿­·ÁÀÖ´Â ValveÀÇ ¿ªÇÒÀ» Çϰí ÀÖ´Ù.

´ÙÀ½Àº ¹°ÀÇ ¿ªÇÒ·Î½á °´Ã¼µé°£¿¡ Àü¼ÛµÇ´Â À̺¥Æ®ÀÎ WaterEventObject¸¦ Á¤ÀÇÇÑ °ÍÀÌ´Ù. ÀçºÎÀûÀ¸·Î´Â ½Ã°£ Á¤º¸¸¸À» °¡Áö°í ÀÖ´Ù.

public class WaterEventObject extends EventObject {
    long timeOfEvent;
    public WaterEventObject(Object o) {
        super(o);
        timeOfEvent = System.currentTimeMillis();
    }
    public long getTimeOfEvent() {
        return timeOfEvent;
    }
}

´ÙÀ½ Ŭ·¡½º´Â ¹°ÀÇ ±Ù¿øÁö·Î½á À̺¥Æ®¸¦ ¹ß»ý½ÃŰ´Â À̺¥Æ®ÀÇ ±Ù¿øÀÌ µÇ´Â Ŭ·¡½ºÀÌ´Ù. waterListeners´Â À̺¥Æ®¸¦ Àü¼ÛÇÒ °´Ã¼µéÀ» ÀúÀåÇϰí ÀÖ´Â Vector °´Ã¼ÀÌ´Ù. °³¹ßÅøÀº addWaterListener¿Í removeWaterListener ¸Þ¼Òµå¸¦ ÅëÇØ¼­ listener¸¦ µî·ÏÇÒ ¼ö ÀÖ°í, splash ¸Þ¼Òµå ¿¡¼­´Â µî·ÏµÈ listener¿¡°Ô ¹°¿¡ ÇØ´çÇÏ´Â 1ÃÊ¿¡ Çѹø¾¿ À̺¥Æ®¸¦ Àü¼ÛÇÏ´Â ±â´ÉÀ» °¡Áö°í ÀÖ´Ù.

public class WaterSource extends Canvas implements Runnable {
    private Vector waterListeners = new Vector();
    Thread thread;
    public WaterSource() {
        setBackground(Color.blue);
        thread = new Thread(this);
        thread.start();
    }
    public Dimension getMinimumSize() {
        return new Dimension(15, 15);
    }
    public void run() {
        while(true) {
            splash();
            try {
            thread.sleep(1000);
            }catch(Exception e) {}
        }
    }
    public synchronized void addWaterListener(WaterListener l) {
        waterListeners.addElement(l);
    }
    public synchronized void removeWaterListener(WaterListener l) {
        waterListeners.removeElement(l);
    }
    private void splash() {
        Vector l;
        WaterEventObject weo = new WaterEventObject(this);
        synchronized(this) {
            l = (Vector)waterListeners.clone();
        }
        for(int i=0 ; i<l.size() ; i++) {
            WaterListener wl = (WaterLIstener)l.elementAt(i);
            wl.handleSplash(weo);
        }
    }
}

¹ëºê´Â ¹°ÀÇ È帧À» Á¶ÀýÇÒ ¼ö ÀÖ´Â ÀåÄ¡ÀÌ´Ù. ¸¶Âù°¡Áö·Î ¿©±â¿¡¼­ Valve´Â À̺¥Æ®ÀÇ È帧 À» Á¶ÀýÇÏ´Â ¿ªÇÒÀ» ´ã´çÇϰí ÀÖ´Ù. Valve´Â À§¿¡¼­ ¹ÞÀº À̺¥Æ®¸¦ ´Ù½Ã ÀڽŰú ¿¬°üµÈ listener¿¡ Àü´ÞÇÏ°Ô µÇ´Âµ¥, À̵é listener °´Ã¼¸¦ ÀúÀåÇÏ´Â °´Ã¼°¡ waterListenersÀ̰í, ¸¶Áö ¸· À̺¥Æ®´Â lastWaterEvent¿¡ ÀúÀåÇÑ´Ù. ³í¸®Çü open º¯¼ö´Â ÇöÀç ¹ëºêÀÇ °³Æó »óŸ¦ Àú ÀåÇϰí ÀÖ´Ù.

isOpen, setOpen ¸Þ¼Òµå·Î ¼Ó¼º°ªÀ» º¯°æÇϰųª ¾òÀ» ¼ö ÀÖ°í, À§ÀÇ WaterSource¿Í ¸¶Âù°¡ Áö·Î °³¹ßÅøÀ» ÅëÇØ listener¸¦ µî·ÏÇϰųª »èÁ¦ÇÏ´Â ¸Þ¼Òµå·Î addWaterListener, removeWaterListener°¡ ÀÖ´Ù.

handleSplash ¸Þ¼Òµå´Â WaterListener ÀÎÅÍÆäÀ̽º¿¡ ÀÇÇØ Á¤ÀÇÇÑ ¸Þ¼Òµå·Î½á, ¹°(À̺¥Æ®)À» WaterSource·ÎºÎÅÍ Àü¼Û¹Þ¾Æ ÇöÀç ÀÚ½ÅÀÇ ¹ëºê »óŰ¡ ¿­·ÁÀÖÀ¸¸é È­¸éÀ» ÆÄ¶õ»öÀ¸·Î Ä¥ÇÏ °í, ÀÚ½ÅÀÇ listener¿¡ ¹°À»(À̺¥Æ®)¸¦ splash¸Þ¼Òµå¸¦ ÅëÇØ¼­ ´Ù½Ã Àü´ÞÇÑ´Ù. ÇÑÆí, ½º·¹µå¿¡ ÀÇÇØ¼­ È£ÃâµÇ´Â run¸Þ¼Òµå¿¡¼­´Â ÇöÀç ÀÚ½ÅÀÇ ¹ëºê »óÅ¿¡ µû¶ó È­¸éÀ» ´Ù½Ã Èò»öÀ¸·Î µ¹ ¸®´Â ÀÏÀ» ÇÑ´Ù.

public class Valve extends Canvas implements WaterListener, Runnable {
    private Vector waterListeners = new Vector();
    private WaterEventObject lastWaterEvent;
    private boolean open = true;
    Thread thread;
    public Valve() {
        setBackground(Color.white);
        thread = new Thread(this);
        thread.start();
    }
    public boolean isOpen() {
        return open;
    }
    public void setOpen(boolean x) {
        open = x;
    }
    public Dimension getMinimumSize() {
        return new Dimension(20, 30);
    }
    public void handleSplash(WaterEventObject e) {
        lastWaterEvent = e;
        if(isOpen()) {
            setBackground(Color.blue);
            repaint();
            splash();
        }
    }
    public void run() {
        while(true) {
            try {
                thread.sleep(1000);
            } catch(Exception e) {}
        }
        if(lastWaterEvent != null) {
            long dt = System.currentTimeMillis() - 
                                        lastWaterEvent.getTimeOfEvent();
            if((dt > 2000) || (!isOpen())) {
                setBackground(Color.white);
                repaint();
            }
        }
    }
    public synchronized void addWaterListener(WaterListener l) {
        waterListeners.addElement(l);
    }
    public synchronized void removeWaterListener(WaterListener l) {
        waterListeners.removeElement(l);
    }
    private void splash() {
        Vector l;
        WaterEventObject weo = new WaterEventObject(this);
        synchronized(this) {
            l = (Vector)waterListeners.clone();
        }
        for(int i=0 ; i<l.size() ; i++) {
            WaterListener wl = (WaterListener)l.elementAt(i);
            wl.handleSplash(weo);
        }
    }
}

´ÙÀ½¿¡ Á¤ÀÇÇÑ Pipe´Â ¹°À» Èê·¯³»¸®´Â Åë·Î·Î½á ¹ëºê¿Í ºñ±³Çϸé Ç×»ó ¿­·ÁÁø ¹ëºê¶ó°í º¼ ¼ö ÀÖ´Ù. µû¶ó¼­, ±â´ÉÀûÀÎ Ãø¸é¿¡¼­ Pipe´Â Valve Ŭ·¡½ºÀÇ Ãà¼ÒµÈ ±â´ÉÀ» °¡Áö°í ÀÖ´Ù. ¸¶Âù°¡Áö·Î, listenerÀÇ Á¤º¸¸¦ ´ã°í ÀÖ´Â °´Ã¼´Â waterListenersÀ̰í, ¸¶Áö¸· Àü¼Û¹ÞÀº À̺¥ Æ®´Â lastWaterEvent°¡ ÀúÀåÇÑ´Ù. handleSplash¿¡¼­ Àü¼Û¹ÞÀº À̺¥Æ®°¡ ÀÖÀ¸¸é È­¸éÀ» ÆÄ¶õ »öÀ¸·Î °»½ÅÇÏ´Â ÀÏÀ» ÇÑ´Ù. ±×¸®°í, run ¸Þ¼Òµå¿¡¼­´Â ½Ã°£ÀÌ Á¶±Ý Áö³²¿¡ µû¶ó È­¸éÀ» ´Ù ½Ã Èò»öÀ¸·Î ÀüȯÇÑ´Ù.

public class Pipe extends Canvas implements WaterListener, Runnable {
    private Vector waterListeners = new Vector();
    private WaterEventObject lastWaterEvent;
    Thread thread;
    public Pipe() {
        setBackground(Color.white);
        thread = new Thread(this);
        thread.start();
    }
    public Dimension getMinimumSize() {
        return new Dimension(150, 10);
    }
    public void handleSplash(WaterEventObject e) {
        lastWaterEvent = e;
        setBackground(Color.blue);
        repaint();
        splash();
    }
    public void run() {
        while(true) {
            try {
                thread.sleep(1000);
            } catch(Exception e) {}
        }
        if(lastWaterEvent != null) {
            long dt = System.currentTimeMillis() - 
                                        lastWaterEvent.getTimeOfEvent();
            if(dt > 2000) {
                setBackground(Color.white);
                repaint();
            }
        }
    }
    public synchronized void addWaterListener(WaterListener l) {
        waterListeners.addElement(l);
    }
    public synchronized void removeWaterListener(WaterListener l) {
        waterListeners.removeElement(l);
    }
    private void splash() {
        WaterEventObject weo = new WaterEventObject(this);
        for(int i=0 ; i<waterListeners.size() ; i++) {
            WaterListener wl = 
                        (WaterListener)waterListeners.elementAt(i);
            wl.handleSplash(weo);
        }
    }
}

ÀÌÁ¦ À̺¥Æ®ÀÇ °³³ä¿¡ ´ëÇØ¼­ Àß ÀÌÇØÇßÀ» °ÍÀÌ´Ù. À̺¥Æ®´Â °¢°¢ÀÇ °´Ã¼ »çÀÌ¿¡¼­ À̺¥Æ® ÀÇ ¼ö½ÅÀÚ¿Í ¼Û½ÅÀÚ°¡ Á¸ÀçÇÏ°í Æ¯Á¤ ÀÔ·ÂÀ̳ª ½Ã°£¿¡ µû¶ó ÀÌµé °´Ã¼ÀÇ »óŸ¦ º¯È¯½ÃŰ´Â µµ±¸·Î »ç¿ëµÇ´Â ¸ÞÄ¿´ÏÁòÀÌ´Ù.

5. ÀÚ¹ÙºóÀ» º¸´Ù ½±°Ô

5.1. Introspection

¾Õ¿¡¼­ ¼³¸íÇÑ Property¿Í Event¸¦ µðÀÚÀÎ Çϴµ¥¿¡´Â ±ÔÄ¢ÀÌ ÀÖ¾ú´Ù. ±×·¡¾ß¸¸, ºô´õ Åø¿¡ ¼­ ÀÚ¹ÙºóÀ» Á¦´ë·Î ºÐ¼®Çؼ­ ÃæºÐÇÏ°Ô ÀÚ¹ÙºóÀÇ ¸ðµç ±â´ÉÀ» Áö¿øÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ÀÌ ·¯ÇÑ °ÍÀ» ³»¼º(Introspection)À̶ó°í Çϴµ¥ ´ÙÀ½°ú °°Àº µðÀÚÀÎ ÆÐÅÏÀ» µû¸¥´Ù.

Simple properties
public  get();
public void set( a);

Boolean properties
public boolean is();
public void set( a);

Indexed properties
public  get(int a);
pubic void set(int a,  b);

Event Design Pattern
public void add( a)
pubic void remove( a)

5.2. Customization

ÀÚ¹ÙºóÀº ¾Õ¿¡¼­ ¸»ÇÑ ¹Ù¿Í °°ÀÌ ºñÁê¾ó °³¹ß ÅøÀ» À§ÇØ °³¹ßµÈ ¶óÀ̺귯¸®ÀÌ´Ù. µû¶ó¼­, ÀÚ ¹ÙºóÀ» °³¹ß Åø¿¡¼­ º¸´Ù È¿À²ÀûÀÌ°í ½±°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØ¾ß ÇÑ´Ù. ±×·¯¸é Áö±ÝºÎÅÍ ÀÚ¹ÙºóÀÇ Çüųª Çൿ ¾ç½ÄÀ» °³¹ßÅøÀÌ ¿øÇÏ´Â ÇüÅÂ, Áï °³¹ßÀÚ°¡ »ç¿ëÇϱ⠽±°Ô °íÃ帵µ ·Ï ÇϰڴÙ.

Á¦ÀÏ ¸ÕÀú java.beans.Customizer ÀÎÅׯäÀ̽º¸¦ »ç¿ëÇÏ´Â ¹æ¹ýÀÌ´Ù. ÀÌ ÀÎÅÍÆäÀ̽º¸¦ »ç¿ëÇÔ À¸·Î½á addPropertyChangeListener¿Í removePropertyChangeListener ¸Þ¼Òµå¸¦ Á¤ÀÇÇÏ°Ô µÈ ´Ù. ±×·¯¸é, ÀÚ¹ÙºóÀ» Áö¿øÇÏ´Â °³¹ßÅøµéÀº ±â»µÇÒ °ÍÀÌ´Ù. ÀÌµé ¸Þ¼Òµå¸¦ ÅëÇØ¼­ °³¹ßÅøÀº º¸´Ù Á¤È®ÇÏ°Ô ÀÚ¹ÙºóÀ» Áö¿øÇÒ °ÍÀÌ´Ù. ´ÙÀ½Àº ½ÇÁ¦ »ç¿ë ¿¹Á¦ÀÌ´Ù.

public OutButtonCustomizer extends Panel implements Customizer {
    public PropertyChangeSupport support =
                                new PropertyChangeSupport(this);
    public void addPropertyChangeListener(PropertyChangeListener l) {
        support.addPropertyChangeLIstener(l);
    }
    public void removePropertyChangeListener(
                                        PropertyChangeListener l) {
        support.removePropertyChangeListener(l);
    }
}
´ÙÀ½Àº ¼Ó¼º°ª ÆíÁýÀ» À§ÇÑ ÀÎÅÍÆäÀ̽ºÀÌ´Ù. À̶§ »ç¿ëÇϴ Ŭ·¡½º ´Â java.beans.PropertyEditorSupport Ŭ·¡½ºÀÌ´Ù. ´ÙÀ½Àº »ç¿ë ¿¹Á¦ÀÌ´Ù.

public class MoleculeNameEditor
                        extends java.beans.PropertyEditorSupport {
    public String[] getTage() {
        String results[] = {
            "HyaluronicaAcid",
            "benzene",
            "buckminsterfullerine",
            "cyclohexane",
            "ethane",
            "water"};
        return result;
    }
}

°¢°¢ÀÇ ÀÚ¹Ùºó Ŭ·¡½º´Â BeanInfo Ŭ·¡½º¸¦ °¡Áú ¼ö ÀÖ´Ù. ÀÌ Å¬·¡½º¸¦ »ç¿ëÇÏ¸é ºñÁê¾ó °³ ¹ßÅø¿¡¼­ ÀÚ¹ÙºóÀÌ Ç¥ÇöµÇ´Â ÇüŸ¦ Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. BeanInfo Ŭ·¡½º´Â ¼Ó¼º°ª, ¸Þ¼Òµå, ÀÌ º¥Æ®¸¦ È­¸é¿¡ Ãâ·Â °¡´ÉÇÏ°Ô ÇÑ´Ù. ´ÙÀ½Àº »ç¿ë ¿¹Á¦ÀÌ´Ù.

public class MoleculeBeanInfo extends SimpleBeanInfo {
    public PropertyDescriptor[] getPropertyDescriptors() {
        try {
            PropertyDescriptor pd = new PropertyDescriptor(
                                        "moleculeName", Molecule.class);
            pd.setPropertyEditorClass(MoleculeNameEditor.class);
            PropertyDescriptor result[] = { pd };
            return result;
        } catch (Exception ex) {
            System.err.println(
                "MoleculeBeanInfo : unexpected exception: "+ex);
            return null;
        }
    }
}


6. ÆÐŰ¡ (Packaging)

ÀÚ¹ÙºóÀº JARÆÄÀÏÀÇ ÇüÅ·ΠÁ¦°øµÈ´Ù. JARÆÄÀÏÀº ZIP ÇüÅÂÀÇ ÇÕÃà ÆÄÀÏ·Î, ÆÄÀÏÀÇ ´ÜÀ§°¡ ¸¹Àº ÀÚ¹Ù ÇÁ·Î±×·¥°ú À¥¼­¹öÀÇ Æ¯¼ºÀ» °í·ÁÇØ ¼Óµµ °³¼±°ú ¸ðµâ°ü¸®¸¦ À§ÇØ Á¦°øµÇ´Â ÆÄÀÏ ±â¹ýÀÌ´Ù. ÀÌ JARÆÄÀÏ¿¡´Â ÀϹÝÀûÀÎ ÀÚ¹Ù ÄÚµå¿Í ÀÚ¹ÙºóÀ» ±¸ºÐÇϱâ À§Çؼ­ MANIFESTÆÄ ÀÏÀÌ ÇÊ¿äÇÏ´Ù. ´ÙÀ½Àº À̺¥Æ®¸¦ ¾Ë±â À§ÇØ »ç¿ëÇß´ø ¸ðµâµéÀÇ MANIFESTÆÄÀÏÀ» ÀÛ¼ºÇÑ ¿¹ÀÌ´Ù. MANIFESTÆÄÀÏÀº È®ÀåÀÚ°¡ ".mk"·Î ÀúÀåµÇ¾î¾ß Çϰí, ³»¿ë¿¡¼­ °¡Àå Áß¿äÇÑ °ÍÀº ¾Æ¸¶µµ "Java-Bean: True" ¹®ÀåÀϰÍÀÌ´Ù. ÀÌ ¹®ÀåÀÌ ÇØ´ç Ŭ·¡½º¸¦ È­¸é¿¡ º¸ÀÏÁö ¸»Áö¸¦ °áÁ¤Çϱ⠶§¹®ÀÌ´Ù.

CLASSFILES = \
        sunw\demo\valves\WaterListener.class \
        sunw\demo\valves\WaterSource.class \
        sunw\demo\valves\Valve.class \
        sunw\demo\valves\Pipe.class \
        sunw\demo\valves\WaterEventObject.class

JARFILE= ..\jars\valves.jar

.SUFFIXES: .java .class

all: $(JARFILE)

# Create a JAR file with a shitable manifest.

$(JARFILE): $(CLASSFILES) $(GIFFIELS)
jar cfm $(JARFILE) <<manifest.tmp sunw\demo\valves\*.class $(GIFFILES)

Name: sunw\demo\valves\WaterListener.class
Java-Bean: False

Name: sunw\demo\valves\WaterSource.class
Java-Bean: True

Name: sunw\demo\valves\Valve.class
Java-Bean: True

Name: sunw\demo\valves\Pipe.class
Java-Bean: True

Name: sunw\demo\valves\WaterEventObject.class
Java-Bean: False
<<

# Rule for compiling a normal .java file
{sunw\demo\valves}.java{sunw\demo\valves}.class :
        set CLASSPATH=..\classes;.
        javac $<

clean:
        -del sunw\demo\valves\*.class
        -del $(JARFILE)

5. °á·Ð

Áö±Ý±îÁö JDK 1.1ÀÇ JavaBeansÀÇ ¸ð½ÀµéÀ» ¾Ë¾Æº¸¾Ò´Ù. Áö±Ý±îÁö ¼³¸íÇÑ ÀÚ¹ÙºóÀº ±âº»°³ ³ä ¿¡ ºÒ°úÇÏ´Ù. ÀÚ¹ÙºóÀº È®Àå AWT¿Í Object Serialization, Java Refrection, JAR, Java Security, JDBC µî°ú ÇÔ²² º¸´Ù Æø³ÐÀº ÇüÅ·Π»ç¿ëµÉ ¼ö ÀÖ´Ù. GUI ÄÄÆ÷³ÍÆ®¸¦ ÀÌ¿ëÇØ¼­ ÇÁ·Î±×·¡¹Ö ÇÑ´Ù´Â °ÍÀº ¾ÆÁÖ ½Å³ª´Â ÀÏÀÌ´Ù. ÀÚ¹ÙºóÀ» °³¹ßÇϱâ Èûµé¸é ³²µéÀÌ ¸¸µé¾î³õÀº ÀÚ¹ÙºóÀ» ±×³É ÀÌ¿ëÇÒ ÁÙ ¾Æ´Â °Í¸¸À¸·Îµµ Å« µµ¿òÀÌ µÉ°ÍÀÌ´Ù.

Âü°í¹®Çå(References)

JavaBeans 1.1 API Specification
http://www.java.sun.com/beans/
Using the Beans Development Kit 1.0 April 1997 Tutorial
http://www.javasoft.com/beans/
JavaBeans Tutorial
http://www.javasoft.com/nav/read/Tutorial/beans/index.html
AWT Enhancements
http://www.javasoft.com/

Last-Modified : 97-05-03