JavaB
eans Programming'ÀÚ¹ÙºóÀº ºñÁê¾ó ºô´õÅøÀ» ÅëÇØ Àç»ç¿ë °¡´ÉÇÑ ¼ÒÇÁÆ®¿þ¾î ÄÄÆ÷³ÍÆ®ÀÌ´Ù.; 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ÀÇ ÇüŸ¦ ¶ìÁö ¾ÊÀº ÀÚ¹Ùºóµµ ÀÖ´Ù. ±×·¯³ª, °á±¹ ºñÁê¾ó ÅøÀ» ÅëÇØ¼ ½±°Ô ÀÀ¿ë ÇÁ·Î±×·¥À» ±¸¼ºÇÒ ¼ö ÀÖ ´Ù. ´ÙÀ½Àº ÀÚ¹Ù ÄÄÆ÷³ÍÆ®ÀÇ ¿¹ÀÌ´Ù. À̵éÀº Å©°Ç ÀÛ°Ç ÀÚ¹ÙºóÀ¸·Î ±¸ÇöµÇ¾î Àְųª ±¸ÇöµÉ ¼ö ÀÖ´Ù.







ºô´õÅøÀº ÀÚ¹ÙºóÀ» ¿«´Â ÇüÅÂÀÇ ¿ÏÀüÇÑ ºñÁê¾ó ȯ°æÀÏ ¼ö ÀÖ°í, °³¹ßÀÚ°¡ ´õ¿í À¯¿¬ÇÏ°Ô °³ ¹ßÇÒ ¼ö ÀÖµµ·Ï Àڹ٠Ŭ·¡½º¸¦ Á÷Á¢ ÀÛ¼ºÇÒ ¼ö ÀÖ´Â °Íµµ ÀÖÀ¸¸ç, ½ºÅ©¸³Æ®¸¦ Á¦°øÇÏ´Â °Í µµ ÀÖ´Ù.
JavaBeans APIÀÇ ±Ã±ØÀûÀÎ ¸ñÀûÀº ÀÚ¹Ù·Î Software component modelÀ» Á¤ÀÇÇÏ¿© À̵é ÀÚ
¹Ù ÄÄÆ÷³ÍÆ®¸¦ Á¶ÇÕÇÏ´Â °Í¸¸À¸·Î ÇϳªÀÇ ÀÀ¿ë ÇÁ·Î±×·¥À» °³¹ßÇÒ ¼ö ÀÖµµ·Ï Çϴµ¥ ÀÖ´Ù.
ÀÚ¹Ùºó ÄÄÆ÷³ÍÆ®¸¦ ±»ÀÌ ³ª´©ÀÚ¸é ´ÙÀ½°ú °°´Ù.


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

ÀÚ¹ÙºóÀº °£´ÜÇÑ ÄÄÆ÷³ÍÆ®ºÎÅÍ À¥ÆäÀÌÁö¿Í °°Àº º¹ÇÕµÈ ¹®¼±îÁö ÁßÁ¡À» µÎ¸ç µðÀÚÀεǾú ´Ù. ±×·¯³ª, ClarisWorks³ª Microsoft Office¿Í °°Àº ¾ÆÁÖ º¹ÀâÇÑ ÇüÅÂÀÇ ¹®¼ ½Ã½ºÅÛÀº Áö ¿øÇÏÁö ¾ÊÀ» °èȹÀÌ´Ù. µû¶ó¼, ÇöÀç Áö¿øÇÏ´Â API´Â OLE ÄÁÆ®·ÑÀ̳ª ActiveX API¿Í À¯»ç ÇÑ APIÀ̰í, ¿öµå ÇÁ·Î¼¼¼ ¹®¼³ª ½ºÇÁ·¹µå½¬Æ® ¹®¼¿Í °°Àº ÁÖ¿ä ¹®¼µéÀ» ÀÚ¹ÙºóÀ¸·Î Áö ¿øÇÒ °ÍÀÌ´Ù.
ÀϹÝÀûÀ¸·Î ÀÚ¹Ùºó ÄÄÆ÷³ÍÆ®´Â ¾îµð¿¡¼µç ½±°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï À۰ųª Áß°£ Å©±â·Î °³¹ß
ÇÏ´Â °ÍÀÌ ÁÁ´Ù.
ÀÚ¹Ùºó ±¸Á¶ÀÇ °¡Àå Å« ¸ñÀûÀº Ç÷¿Æû Á߸³ÀûÀÎ ÄÄÆ÷³ÍÆ® ±¸Á¶¸¦ Á¦°øÇϴµ¥ ÀÖ´Ù. ÀÚ¹Ùºó ÀÌ ´Ù¸¥ ÀÚ¹ÙºóÀÇ ¾ÈÂÊÀ¸·Î °ãÄ¡°Ô µÇ´õ¶óµµ ¸ðµç Ç÷¿Æû¿¡¼ ¸ðµç ±â´ÉÀ» Áö¿øÇÑ´Ù. ±×·¯ ³ª, ÀÚ¹ÙºóÀÌ Word, Visual Basic, ClarisWorks, Netscape Navigator¿Í °°Àº °÷¿¡ »ðÀ﵃ ¶§ ÀÚ¹Ùºó API´Â ÁöÁ¤µÈ ·ÎÄà Ç÷¿ÆûÀÇ ±¸Á¶¿¡ ¸Â°Ô ÇÕ¼ºµÇµµ·ÏÇÑ´Ù.
¿¹¸¦ µé¾î¼, Microsoft Ç÷¿Æû ȯ°æ¿¡¼ ÀÚ¹Ùºó API´Â COM, ActiveX »çÀÌ¿¡¼ ±³·®¿ªÇÒ À» ÇÑ´Ù. ¸¶Âù°¡Áö·Î ÀÚ¹ÙºóÀº Netscape Navigator»ó¿¡¼´Â LiveConnect¿Í ÇÔ²² ¿¬°á µÇ°Å ³ª, Live Objectó·³ ó¸®µÈ´Ù.
µû¶ó¼, ´Ü ÇϳªÀÇ ÀÚ¹ÙºóÀº ¾ÆÁÖ ´Ù¾çÇÑ ÇüÅ·ΠÀÛ¿ëÇÑ´Ù. ÁöÁ¤µÈ ȯ°æ¿¡¼ ´Ù¸¥ ¾î¶² ÄÄÆ÷ ³ÍƮó·³ À̺¥Æ®¸¦ ¹ß»ý½Ã۰í, ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù.
¿©±â¿¡¼ ±¸Ã¼ÀûÀÎ ÀÚ¹Ùºó ºê¸´Áö¿¡ ´ëÇØ¼ ´Ù·çÁö´Â ¾Ê´Â´Ù. ºê¸®Áö´Â °¢ Ç÷¿Æû¿¡ ¸Âµµ·Ï
³ª¸§´ë·Î ÀÚ¹Ùºó API¸¦ Áö¿øÇÏ¸ç °³¹ßµÇ¾î¾ß Çϱ⠶§¹®ÀÌ´Ù.
¼·Î ´Ù¸¥ Ç÷¿Æû¿¡¼ ÀÚ¹Ùºó API¸¦ Áö¿øÇÏ´Â ´É·Â ¶ÇÇÑ ´Ù¾çÇÏ´Ù. ±×·¯³ª, ÇØ´ç Ç÷¿Æû¿¡ ¼ ÀÚ¹ÙºóÀÇ ±â´ÉÀ» ÃÖ´ë·Î Á¦°øÇÏÁö ¸øÇÒ ¼ö µµ ÀÖÀ¸¹Ç·Î, ÀÚ¹ÙºóÀ» »ç¿ëÇϴµ¥ º° ¹«¸® °¡ µû¸£Áö ¾Êµµ·Ï ±âº»ÀûÀ¸·Î ÀûÀýÇÑ ±â´ÉÀ» Á¦°øÇØ¾ß ÇÑ´Ù.
¿¹¸¦ µé¾î¼, ÇØ´ç Ç÷¿Æû¿¡¼ ¸Þ´º¹Ù¸¦ ÇÕÄ¡´Âµ¥ ¹®Á¦°¡ ÀÖ´Ù¸é ÀÌ ¸Þ´º¹Ù¸¦ ÆË¾÷À¸·Î ¶ç ¿î´Â ÇüÅÂÀÇ ±â´ÉÀ» Á¦°øÇØ¾ß ÇÑ´Ù.
ÀÌ ¸»Àº ÀÚ¹Ùºó °³¹ßÀÚ´Â ÀϰüµÈ API¸¦ »ç¿ëÇÏ¿© ¾î´À °÷¿¡¼ Á¦´ë·Î ½ÇÇàµÇµµ·Ï ÇÁ·Î±×·¡
¹Ö ÇØ¾ß ÇÑ´Ù´Â °ÍÀÌ´Ù. ´ë½Å, ÀÚ¹ÙºóÀÌ ÇØ´ç Ç÷¿Æû¿¡¼ ±¸Ã¼ÀûÀ¸·Î ¾î¶² ±â´ÉÀ¸·Î »ç¿ëµÉ
°ÍÀÎÁö °í¹ÎÇÒ ÇÊ¿ä´Â ¾ø´Ù´Â °ÍÀÌ´Ù.
ÀÚ¹Ùºó API´Â ºñ±³Àû ½±°Ô µÇ¾îÀÖ´Ù. Áß·®ÀÇ ÄÄÆ÷³ÍÆ® º¸´Ù´Â °æ·®ÀÇ ÄÄÆ÷³ÍÆ®¸¦ ¸¸µå´Âµ¥ ÁßÁ¡À» µÎ¾î¾ß ÇÑ´Ù.
ÀϹÝÀûÀ¸·Î java.beans.Everything Ŭ·¡½º¸¦ »ó¼Ó¹ÞÀº ÇüÅÂÀÇ ÀÚ¹Ùºó ÄÄÆ÷³ÍÆ®´Â ÁÁÁö ¾Ê´Ù. ÀÚ¹ÙºóÀÌ »ó¼ÓÀ» ÅëÇØ ½ÇÇàÁß¿¡ Çã¿ëµÇÁö ¾ÊÀº ¾î¶°ÇÑ ÇüÅÂÀÇ ±âº»ÀûÀÎ ±â´ÉÀ» Áö¿øÇϱ⠺¸ ´Ù´Â, java.beans.Something ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ ÁÖ¾îÁø ƯÁ¤ ¿ªÇÒÀ» ÇÏ´Â °ÍÀÌ ¹Ù¶÷Á÷ÇÏ´Ù.
¶ÇÇϳªÀÇ ÀÚ¹ÙºóÀÇ Æ¯Â¡Àº °³¹ßÀÚ°¡ ÀÚ¹ÙºóÀÇ ±âº»ÀûÀÎ °³³äµéÀ» ºü¸£°Ô ÀÌÇØÇÏ¿©, ¾à°£ÀÇ
³ë·ÂÀ¸·Îµµ ½±°í ºü¸£°Ô ÀÚ¹ÙºóÀ» °³¹ßÇÒ ¼ö ÀÖµµ·Ï ÀÚ¹ÙºóÀº ±¸¼ºµÇ¾ú´Ù.
ÀÚ¹ÙºóÀ» Å« ¾È¸ñÀ¸·Î ÀÌÇØÇϱâ À§ÇØ Visual Cafe¸¦ ¿¹·Î µé°Ú´Ù. ±×·¯³ª, ºñ´Ü Visual Cafe ¸¸ÀÌ ¾Æ´Ï°í ¸ðµç ÀÚ¹Ù ºô´õ ÅøÀº ÀÌ·¯ÇÑ ÇüŸ¦ ¶ì°Ô µÈ´Ù. ¿ÀÈ÷·Á Áö±Ý ¿¹¸¦ µé°í ÀÖ´Â Visual Cafe 1.0Àº ¾ÆÁ÷ ¿Ïº®ÇÑ ÀÚ¹ÙºóÀÇ °³³äÀ» ¼³¸íÇÏÁö´Â ¾ÊÁö¸¸, ÀÚ¹ÙºóÀÇ ¹ß´ÜÀÌ ÀÌ·¸ °Ô µÈ´Ù´Â °ÍÀ» ÀÌÇØÇÒ ¼ö´Â ÀÖ´Ù.
Visual Cafe·Î ÀÚ¹ÙºóÀ» ¼³¸íÇÒ ¤¨ °¡Àå Áß¿äÇÑ 3°¡Áö ¿ä¼Ò´Â Component Window or Componet Palette, Property Window, Form or Client WindowÀÌ´Ù. °¢°¢Àº ´ÙÀ½°ú °°ÀÌ µÇ ¾îÀÖ´Ù.




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

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



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

±×·¯¸é, Áö±Ý±îÁö ¼³¸íÇÑ ÀÚ¹ÙºóÀÇ º¯ÇüÀÇ ¿øÇüÀ» ¾Ë¾Æº¸°í °ú¿¬ ÀÚ¹ÙºóÀº ÇÁ·Î±×·¥À¸·Î ¾î
¶»°Ô ±¸ÇöµÇ´ÂÁö ¾Ë¾Æº¸°Ú´Ù.
ÀÚ¹ÙºóÀÇ ¼Ó¼º°ªÀº publicÀ¸·Î ¼±¾ðµÇ¾î Àаí/¾²±â, Àбâ, ¾²±â°¡ °¡´ÉÇÏ´Ù. ÀÌµé ¼Ó¼ºÀÇ Á¾ ·ù¿¡´Â °ªÀÇ ÀÔ·Â ÇüÅÂ¿Í ¾²ÀÓ¿¡ µû¶ó ´Ü¼øÇü(simple property), ¹è¿Çü(indexed property), °æ°èÇü(bound property), ¼Ó¹ÚÇü(constrained 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() ¸Þ¼Òµå·Î ¼Ó¼º°ªÀ» ¾ò
¾î³½´Ù.
¹è¿Çü ¼Ó¼º°ªÀº ¹è¿ÀÇ °ªÀ» °¡Áø´Ù. ¼Ó¼ºÀÇ ¿ø¼ÒµéÀº 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) ¸Þ¼Òµå·Î ¹è¿ÀÇ ÇÑ ¿ø¼ÒÀÇ °ªÀ» ¾ò¾î³½´Ù.
°æ°èÇü ¼Ó¼º°ªÀº ÀÚ½ÅÀÇ °ªÀÌ ¹Ù²î¸é ´Ù¸¥ °´Ã¼¿¡°Ô ¾Ë¸°´Ù. °ªÀÌ ¸Å¹ø ¹Ù²ð ¶§ ¸¶´Ù ¼Ó¼º ÀÇ À̸§, ÀÌÀü °ª°ú »õ·Î¿î °ª¿¡ ´ëÇÑ Á¤º¸¸¦ ½ÇÀº 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 ¸Þ¼Òµå¸¦ ÅëÇØ¼ À̺¥Æ® ¼ö½Å
ÀÚ¸¦ Ãß°¡Çϰųª »èÁ¦ÇÒ ¼ö ÀÖ´Ù.
¼Ó¹ÚÇü ¼Ó¼º°ªÀ» °¡Áö´Â °´Ã¼´Â ´Ù¸¥ °´Ã¼·Î ÇÏ¿©±Ý ÀÚ½ÅÀÇ ¼Ó¼º°ªÀ» ¹Ù²Ù´Â °ÍÀ» °ÅºÎÇÒ ¼ö ÀÖ´Ù. ¼Ó¹ÚÇü ¼Ó¼º°ªÀ» ¼ö½ÅÇÏ´Â °´Ã¼´Â °ªÀ» ¹Ù²ÙÁö¾Ê°í 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ÀÌ ¹ß»ýÇÏ¿© ¼Ó¼º°ªÀ» º¯°æÇÒ ¼ö ¾ø°Ô
µÈ´Ù.
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 µîÀÇ ¸Þ¼Òµå¸¦ Åë
ÇØ¼ Á÷Á¢ À̺¥Æ® Å¥¸¦ Á¶ÀÛÇÒ ¼ö ÀÖ´Ù.
À̺¥Æ®´Â source °´Ã¼¿Í Ÿ°ÙÀÌ µÇ´Â listener °´Ã¼ »çÀÌÀÇ »óÅ º¯È¸¦ ¾Ë¸®´Â ¸ÞÄ¿´ÏÁòÀ¸ ·Î, ÄÄÆ÷³ÍÆ®¸¦ °³¹ßÅø°ú ¿«¾î¼ ½ÇÇàÇÒ ¼ö ÀÖ´Â ¸ÞÄ¿´ÏÁòÀ» Á¦°øÇÑ´Ù. À̺¥Æ®´Â ¾ÆÁÖ ´Ù¾ç ÇÏ°Ô »ç¿ëµÇÁö¸¸ ÀϹÝÀûÀ¸·Î ¸¶¿ì½ºÀÇ ÀÔ·ÂÀ̳ª, Űº¸µå ÀÔ·Â, À§Á¬ÀÇ °»½ÅÀ» ¾Ë¸®´Âµ¥ ÁÖ·Î »ç¿ëµÇ°í ÀÖ´Ù. ¿©±â¿¡¼´Â WaterSource, Valve, Pipe ÀÚ¹ÙºóÀÇ ¿¹Á¦ ÇÁ·Î±×·¥À» º¸¸é¼ ÀÌ º¥Æ®ÀÇ ÀÌÇØ¸¦ µ½°Ú´Ù.

À§ÀÇ ±×¸²¿¡¼ 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);
}
}
}
ÀÌÁ¦ À̺¥Æ®ÀÇ °³³ä¿¡ ´ëÇØ¼ Àß ÀÌÇØÇßÀ» °ÍÀÌ´Ù. À̺¥Æ®´Â °¢°¢ÀÇ °´Ã¼ »çÀÌ¿¡¼ À̺¥Æ®
ÀÇ ¼ö½ÅÀÚ¿Í ¼Û½ÅÀÚ°¡ Á¸ÀçÇÏ°í Æ¯Á¤ ÀÔ·ÂÀ̳ª ½Ã°£¿¡ µû¶ó ÀÌµé °´Ã¼ÀÇ »óŸ¦ º¯È¯½ÃŰ´Â
µµ±¸·Î »ç¿ëµÇ´Â ¸ÞÄ¿´ÏÁòÀÌ´Ù.
¾Õ¿¡¼ ¼³¸íÇÑ Property¿Í Event¸¦ µðÀÚÀÎ Çϴµ¥¿¡´Â ±ÔÄ¢ÀÌ ÀÖ¾ú´Ù. ±×·¡¾ß¸¸, ºô´õ Åø¿¡ ¼ ÀÚ¹ÙºóÀ» Á¦´ë·Î ºÐ¼®Çؼ ÃæºÐÇÏ°Ô ÀÚ¹ÙºóÀÇ ¸ðµç ±â´ÉÀ» Áö¿øÇÒ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ÀÌ ·¯ÇÑ °ÍÀ» ³»¼º(Introspection)À̶ó°í Çϴµ¥ ´ÙÀ½°ú °°Àº µðÀÚÀÎ ÆÐÅÏÀ» µû¸¥´Ù.
Simple properties publicget (); public void set ( a); Boolean properties public boolean is(); public void set ( a); Indexed properties publicget (int a); pubic void set (int a, b); Event Design Pattern public void add( a) pubic void remove ( a)
ÀÚ¹ÙºóÀº ¾Õ¿¡¼ ¸»ÇÑ ¹Ù¿Í °°ÀÌ ºñÁê¾ó °³¹ß ÅøÀ» À§ÇØ °³¹ßµÈ ¶óÀ̺귯¸®ÀÌ´Ù. µû¶ó¼, ÀÚ ¹ÙºóÀ» °³¹ß Åø¿¡¼ º¸´Ù È¿À²ÀûÀÌ°í ½±°Ô »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÇØ¾ß ÇÑ´Ù. ±×·¯¸é Áö±ÝºÎÅÍ ÀÚ¹ÙºóÀÇ Çüųª Çൿ ¾ç½ÄÀ» °³¹ßÅøÀÌ ¿øÇÏ´Â ÇüÅÂ, Áï °³¹ßÀÚ°¡ »ç¿ëÇϱ⠽±°Ô °íÃ帵µ ·Ï ÇϰڴÙ.
Á¦ÀÏ ¸ÕÀú 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;
}
}
}
ÀÚ¹ÙºóÀº 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)
Áö±Ý±îÁö JDK 1.1ÀÇ JavaBeansÀÇ ¸ð½ÀµéÀ» ¾Ë¾Æº¸¾Ò´Ù. Áö±Ý±îÁö ¼³¸íÇÑ ÀÚ¹ÙºóÀº ±âº»°³ ³ä ¿¡ ºÒ°úÇÏ´Ù. ÀÚ¹ÙºóÀº È®Àå AWT¿Í Object Serialization, Java Refrection, JAR, Java Security, JDBC µî°ú ÇÔ²² º¸´Ù Æø³ÐÀº ÇüÅ·Π»ç¿ëµÉ ¼ö ÀÖ´Ù. GUI ÄÄÆ÷³ÍÆ®¸¦ ÀÌ¿ëÇØ¼ ÇÁ·Î±×·¡¹Ö ÇÑ´Ù´Â °ÍÀº ¾ÆÁÖ ½Å³ª´Â ÀÏÀÌ´Ù. ÀÚ¹ÙºóÀ» °³¹ßÇϱâ Èûµé¸é ³²µéÀÌ ¸¸µé¾î³õÀº ÀÚ¹ÙºóÀ» ±×³É ÀÌ¿ëÇÒ ÁÙ ¾Æ´Â °Í¸¸À¸·Îµµ Å« µµ¿òÀÌ µÉ°ÍÀÌ´Ù.