Core Java Technologies Tech Tip¿¡ ¿À½Å ¿©·¯ºÐÀ» ȯ¿µÇÕ´Ï´Ù
Core Java Technologies
TECHNICAL TIPS
2006³â 2¿ù 8ÀÏÀÚ
  À̹ø È£¿¡¼­´Â,

» Singleton ÆÐÅÏ
» Observer ÆÐÅÏ

À» ´Ù·ì´Ï´Ù.

ÀÌ ¹®¼­´Â Java 2 Platform, Standard Edition Development Kit 5.0 (JDK 5.0)À» ±â¹ÝÀ¸·Î °³¹ßµÇ¾ú½À´Ï´Ù. JDK 5.0 ´Ù¿î·Îµå
PDF ÆÄÀϹޱ⠠  

Singleton ÆÐÅÏ
 

¼³°è ÆÐÅÏÀº ¼ÒÇÁÆ®¿þ¾î ¼³°è¿¡¼­ »ó¿¡¼­ÀÇ °øÅë ¹®Á¦¿¡ ´ëÇÑ ÀϹÝÀûÀÎ ¼Ö·ç¼ÇÀ̶ó ÇÒ ¼ö Àִµ¥, ±× ±âº» °³³äÀº ¼Ö·ç¼ÇÀ» ÄÚµå·Î º¯È¯ÇÏ¸é ±× Äڵ带 ´Ù¾çÇÑ ¹®Á¦ »óȲ¿¡ Àû¿ëÇÒ ¼ö ÀÖ´Ù´Â °ÍÀÌ´Ù. ¼³°è ÆÐÅÏ¿¡ °üÇÑ ³íÀÇ´Â Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides µîÀÌ °øµ¿ ÁýÇÊÇÑ Design Patterns: Elements of Reusable Object-Oriented Software¿¡¼­ ½ÃÀ۵Ǿú´Ù. ÀÌ Ã¥¿¡¼­´Â ÆÐÅÏÀ» »ý¼º, ±¸Á¶, µ¿ÀÛÀÇ ¼¼ °¡Áö ÁÖ¿ä ¿µ¿ªÀÌ Æ÷ÇÔÇÏ¿© ´Ù¾çÇÑ ÁÖÁ¦ ¿µ¿ªÀ¸·Î ºÐ·ùÇϰí ÀÖ´Ù. »ý¼º ÆÐÅÏ(Creational patterns)Àº °´Ã¼°¡ »ý¼ºµÇ´Â(°´Ã¼ ÁöÇâ ¿ë¾î·Î´Â ¡®¿¹½ÃµÇ´Â(instantiated)¡¯) ¹æ½ÄÀ» ±â¼úÇÑ´Ù. ±¸Á¶ ÆÐÅÏ(Structural patterns)Àº °´Ã¼µéÀ» ¿¬°áÇÏ°í °áÇÕÇÏ´Â ¹æ½ÄÀ» µµ¿ÍÁÖ°í, µ¿ÀÛ ÆÐÅÏ(Behavioral patterns)Àº ¾Ë°í¸®Áò ¶Ç´Â Åë½Å ¸ÞÄ¿´ÏÁòÀ» ±â¼úÇÑ´Ù. ¸î °¡Áö °øÅë ÆÐÅÏÀÇ À̸§À¸·Î´Â »ý¼º ¿µ¿ªÀÇ Singleton, µ¿ÀÛ ¿µ¿ªÀÇ Observer, ±¸Á¶ ¿µ¿ª Facade¸¦ µé ¼ö ÀÖ´Ù. º» Å×Å© ÆÁ¿¡¼­´Â ÀÚ¹Ù ÇÁ·Î±×·¡¹Ö ¾ð¾îÀÇ ¸Æ¶ô¿¡¼­ Singleton ÆÐÅÏÀ» ¸é¹ÐÈ÷ »ìÆìº¸µµ·Ï ÇÑ´Ù.

Singleton ÆÐÅÏÀº ÈçÈ÷ »ç¿ëµÇ´Â »ý¼º ÆÐÅÏÀÇ ÇϳªÀÌ´Ù. ÀÌ´Â ÇϳªÀÇ Å¬·¡½º¿¡¼­ ¿ÀÁ÷ ÇϳªÀÇ ÀνºÅϽº¸¸ »ý¼ºµÇµµ·Ï º¸ÀåÇÏ´Â ±â¹ýÀ» ±â¼úÇÑ´Ù. ÀÌ´Â º»ÁúÀûÀ¸·Î, Ŭ·¡½º ¿ÜºÎÀÇ ´©±¸µµ °´Ã¼ÀÇ ÀνºÅϽº¸¦ »ý¼ºÇÏÁö ¸øÇÏ°Ô ÇÏ´Â Á¢±Ù¹ýÀ» »ç¿ëÇÑ´Ù. ÀϹÝÀûÀ¸·Î SingletonÀº ´À¸®°Ô »ý¼ºµÇ¾î ÇÊ¿ä ½ÃÁ¡±îÁö ¸Þ¸ð¸®ÀÇ ¿ä±¸¸¦ ÁÙ¿©ÁØ´Ù. ÀÌ Á¢±Ù¹ýÀº ´Ù¾çÇÑ ¹æ½ÄÀ¸·Î ±¸ÇöÀÌ °¡´ÉÇÏ´Ù.

»ý¼ºµÇ°í ÀÖ´Â ÇϳªÀÇ ÀνºÅϽº°¡ ¼­ºêŬ·¡½º°¡ µÇ¸®¶ó´Â °ÍÀ» ¾Ë°í ÀÖ´Ù¸é, »óÀ§(parant) Ŭ·¡½º¸¦ Ãß»óÈ­ÇÏ°í ¸Þ¼Òµå¸¦ Á¦°øÇÏ¿© ÇöÀçÀÇ ÀνºÅϽº¸¦ ¾òµµ·Ï ÇÑ´Ù. ±× ÀÏ·Ê·Î AWT ÆÐŰÁöÀÇ Toolkit Ŭ·¡½º¸¦ µé ¼ö ÀÖÀ¸¸ç, ToolkitÀ» À§ÇÑ »ý¼ºÀÚ´Â public(ÀÌ Æ¯Á¤ °æ¿ì¿¡´Â µðÆúÆ® »ý¼ºÀÚ)ÀÌ´Ù.
   public Toolkit()
±×¸®°í Ŭ·¡½º´Â ƯÁ¤ ¼­ºêŬ·¡½º(ÀÌ °æ¿ì¿¡´Â Ç÷§ÆûÀ» µû¸§)¸¦ ¾ò±â À§ÇÑ getDefaultToolkit() ¸Þ¼Òµå¸¦ °¡Áø´Ù.
   public static Toolkit getDefaultToolkit()
½ã ÀÚ¹Ù ·±Å¸ÀÓÀ» žÀçÇÑ Linux Ç÷§Æû »ó¿¡¼­ ƯÁ¤ ¼­ºêŬ·¡½º´Â sun.awt.X11.XToolkit ŸÀÔÀÌ´Ù. ÇÏÁö¸¸ »ç¿ëÀÚ´Â °øÅë Ãß»ó »óÀ§ Ŭ·¡½ºÀÎ ToolkitÀ» ÅëÇØ Ŭ·¡½º¿¡ ¾×¼¼½ºÇÒ »ÓÀ̹ǷΠÀÌ ºÎºÐ±îÁö ¾Ë¾Æ¾ß ÇÒ ÇÊ¿ä´Â ¾ø´Ù.

Collator Ŭ·¡½º´Â ÀÌ ÆÐÅÏÀÇ ¶Ç ´Ù¸¥ ¿¹·Î, ¾à°£ÀÇ Â÷À̰¡ ÀÖ´Ù. ÀÌ Å¬·¡½º´Â 2°³ÀÇ getInstance() ¸Þ¼Òµå¸¦ Á¦°øÇϰí, ¹«ÀÎÀÚ(no-argument) ¹öÀüÀº µðÆúÆ® localeÀ» À§ÇÑ Collator¸¦ ¾ò´Â´Ù. ÀÌ ¶§, »ç¿ëÀÚ´Â ÀÚü localeÀ» Àü´ÞÇÏ¿© ÇØ´ç localeÀ» À§ÇÑ Collator ÀνºÅϽº¸¦ ¾òÀ» ¼ö ÀÖ´Ù. µ¿ÀÏ locale¿¡ ´ëÇÑ Collator¸¦ ¿©·¯ Â÷·Ê ¿äÃ»ÇØµµ µ¿ÀÏÇÑ Collator ÀνºÅϽº¸¦ µ¹·Á¹Þ°Ô µÇ¸ç, »ý¼ºÀÚ ÀÚü´Â º¸È£µÈ´Ù. ÇÑÆí, J2SE Ç¥ÁØ ¶óÀ̺귯¸® Àü¹Ý¿¡ °ÉÃÄ Å¬·¡¼­ »ý¼ºÀ» Á¦ÇÑÇÏ´Â À¯»çÇÑ ¹æ½ÄÀ» ¹ß°ßÇÒ ¼ö ÀÖ´Ù.

ÀÌ ½ÃÁ¡¿¡¼­ Ŭ·¡½º »ý¼ºÀÚ¿¡ ´ëÇÑ ¾×¼¼½º¸¦ Á¦ÇÑÇϸé ÀÚµ¿ÀûÀ¸·Î SingletonÀÌ µÈ´Ù°í »ý°¢ÇÒ ¼öµµ ÀÖ°ÚÀ¸³ª, ±×·¸Áö ¾Ê´Ù. ¹®Á¦°¡ µÇ´Â ÄÉÀ̽º´Â Calendar Ŭ·¡½ºÀε¥, Calendar Ŭ·¡½º »ý¼ºÀÚ´Â º¸È£µÇ¸ç, ÀÌ Å¬·¡½º´Â Ŭ·¡½º ÀνºÅϽº¸¦ ¾ò±â À§ÇÑ getInstance() ¸Þ¼Òµå¸¦ Á¦°øÇÑ´Ù. ±×·¯³ª getInstance() ¸Þ¼Òµå¸¦ È£ÃâÇÒ ¶§¸¶´Ù »õ·Î¿î Ŭ·¡½º ÀνºÅϽº°¡ ¾ò¾îÁüÀ¸·Î °á±¹ ÀÌ´Â SingletonÀÌ ¾Æ´Ñ °ÍÀÌ´Ù.

»ç¿ëÀÚÀÇ ÀÚü Singleton Ŭ·¡½º »ý¼º ½Ã¿¡´Â ¿ÀÁ÷ ÇϳªÀÇ ÀνºÅϽº¸¸ »ý¼ºµÇµµ·Ï À¯ÀÇÇØ¾ß ÇÑ´Ù.
   public class MySingleton {
     private static final MySingleton INSTANCE = 
       new MySingleton();

     private MySingleton() {
     }

     public static final MySingleton getInstance() {
       return INSTANCE;
     }
   }
Á¤Àû ¸Þ¼Òµå getInstance()´Â ´ÜÀÏ Å¬·¡½º ÀνºÅϽº¸¦ ¸®ÅÏÇÑ´Ù. ´ÜÀÏ ÀνºÅϽº°¡ ¼­ºêŬ·¡½ºÀÏ Çʿ䰡 ÀÖ´õ¶óµµ API¸¦ º¯°æÇÒ ÇÊ¿ä´Â ¾ø´Ù´Â Á¡¿¡ ÁÖ¸ñÇÒ °Í.

ÀÌ·ÐÀûÀ¸·Î´Â INSTANCE º¯¼ö°¡ publicÀÏ ¼ö ÀÖÀ¸¹Ç·Î getInstance() ¸Þ¼Òµå´Â ÇÊ¿äÄ¡ ¾ÊÀ¸³ª getInstance() ¸Þ¼Òµå´Â ÇâÈÄ¿¡ ½Ã½ºÅÛÀ» º¯°æÇÒ °æ¿ì À¯¿¬¼ºÀ» Á¦°øÇÑ´Ù. ¹Ù¶÷Á÷ÇÑ °¡»ó ¸Ó½Å ±¸ÇöÀ̶ó¸é Á¤Àû getInstance() ¸Þ¼Òµå¿¡ ´ëÇÑ È£ÃâÀ» Áï½Ã ó¸®(inline)ÇØ¾ß ÇÑ´Ù.

Singleton »ý¼º ÀÛ¾÷Àº À̰ÍÀ¸·Î ±×Ä¡Áö ¾Ê´Â´Ù. Áï, Singleton Ŭ·¡½º¸¦ Serializable·Î ¸¸µé Çʿ䰡 ÀÖ´Ù¸é ¹Ýµå½Ã readResolve() ¸Þ¼Òµå¸¦ Á¦°øÇØ¾ß ÇÑ´Ù.
  /**
   * Ensure Singleton class
   */
  private Object readResolve() throws ObjectStreamException {
    return INSTANCE;
  }
readResolve() ¸Þ¼Òµå°¡ °®Ãß¾îÁø »óÅ¿¡¼­ deserializationÀº ´ÜÀÏ(¿ÀÁ÷ ÇϳªÀÇ) °´Ã¼(getInstance() ¸Þ¼Òµå¿¡ ´ëÇÑ È£Ãâ¿¡ ÀÇÇØ »ý¼ºµÇ´Â °Í°ú µ¿ÀÏÇÑ °´Ã¼ÀÌ´Ù)·Î ±Í°áµÇ´Âµ¥, »ç¿ëÀÚ°¡ readResolve() ¸Þ¼Òµå¸¦ Á¦°øÇÏÁö ¾ÊÀ» °æ¿ì¿¡´Â °´Ã¼¸¦ deserializeÇÒ ¶§¸¶´Ù °´Ã¼ ÀνºÅϽº°¡ »ý¼ºµÈ´Ù.

Singleton ÆÐÅÏÀº ¿ÀÁ÷ ´ÜÀÏÇÑ ¸®¼Ò½º¸¸ °¡Áö°í ÀÖ°í ±× ´ÜÀÏ ¸®¼Ò½ºÀÇ »óÅ Á¤º¸¿¡ ´ëÇÑ ¾×¼¼½º¸¦ °øÀ¯ÇÒ Çʿ䰡 ÀÖÀ½À» ¾Ë°í ÀÖÀ» °æ¿ì¿¡ À¯¿ëÇÏ´Ù. ¼³°è ½Ã¿¡ Singleton ÆÐÅÏÀÇ Çʿ伺À» ÆÄ¾ÇÇÏ¸é °³¹ßÀ» °£¼ÒÈ­ÇÒ ¼ö ÀÖ´Ù. ÇÏÁö¸¸, ¶§·Î´Â ¼º´É ¹®Á¦·Î Äڵ带 refactorÇÏ°í ³ªÁß¿¡ ÆÐÅÏÀ» »ç¿ëÇÏ°Ô µÇ±â±îÁö Çʿ伺À» ÀνÄÇÏÁö ¸øÇÏ´Â ¼ö°¡ ÀÖ´Ù. ¿¹¸¦ µé¾î, ÇÁ·Î±×·¥ÀÌ µ¿ÀÏÇÑ Å¬·¡½ºÀÇ ÀνºÅϽº¸¦ ¹Ýº¹ »ý¼ºÇÏ¿© »óÅ Á¤º¸¿Í ÇÔ²² Àü´ÞÇϱ⠶§¹®¿¡ ½Ã½ºÅÛ ¼º´ÉÀÌ ÀúÇϵǴ °æ¿ì°¡ ¹ß»ýÇÒ ¼ö ÀÖ´Ù. Singleton ÆÐÅÏÀ¸·Î º¯°æÇÏ¸é µ¿ÀÏÇÑ °´Ã¼°¡ ¹Ýº¹µÇ´Â °ÍÀ» ¹æÁöÇÒ ¼ö Àִµ¥, ÀÌ´Â ½Ã½ºÅÛÀÌ °´Ã¼¸¦ Àç»ý¼ºÇϴµ¥ µå´Â ½Ã°£À» Á¦°ÅÇØÁÙ »Ó ¾Æ´Ï¶ó garbage collector°¡ ÀνºÅϽºµéÀ» »èÁ¦ÇÏ´Â µ¥ ¼Ò¿äµÇ´Â ½Ã°£À» ÁÙ¿©ÁØ´Ù.

°£´ÜÈ÷ ¸»Çؼ­, ´ÜÀÏÀÇ, ±×¸®°í ¿ÀÁ÷ ÇϳªÀÇ Å¬·¡½º ÀνºÅϽº¸¸ »ý¼ºµÇµµ·Ï ÇϰíÀÚ ÇÒ ¶§ Singleton ¼³°è ÆÐÅÏÀ» ÀÌ¿ëÇÏ¸é µÈ´Ù. »ý¼ºÀÚ°¡ ¿¬»êÀ» ¿ä±¸ÇÏÁö ¾ÊÀ» °æ¿ì¿¡´Â ºó private »ý¼ºÀÚ(¶Ç´Â ¼­ºêŬ·¡½º°¡ ÇÊ¿äÇÒ °æ¿ì¿¡´Â º¸È£µÈ »ý¼ºÀÚ)¸¦ Á¦°øÇÑ´Ù. ±×·¸Áö ¾ÊÀ¸¸é µðÆúÆ®°ªÀ¸·Î ½Ã½ºÅÛÀÌ public »ý¼ºÀÚ¸¦ Á¦°øÇÏ°Ô µÇ´Âµ¥, ÀÌ´Â SingletonÀ¸·Î ÀÛ¾÷ ½Ã ¹Ù¶÷Á÷ÇÏÁö ¾ÊÀº °á°ú¶ó ÇÒ ¼ö ÀÖ´Ù.

SingletonÀº ÁÖ¾îÁø Ŭ·¡½º ·Î´õ ³»¿¡¼­¸¸ °íÀ¯¼ºÀÌ º¸ÀåµÈ´Ù´Â Á¡¿¡ À¯ÀÇÇÒ °Í. º¹¼öÀÇ ¼­·Î ´Ù¸¥ ¿£ÅÍÇÁ¶óÀÌÁî ÄÁÅ×À̳ʿ¡ °ÉÃÄ µ¿ÀÏÇÑ Å¬·¡½º¸¦ »ç¿ëÇÒ °æ¿ì¿¡´Â °¢ ÄÁÅ×À̳ʿ¡ ´ëÇØ ÇϳªÀÇ ÀνºÅϽº¸¦ ¾ò°Ô µÈ´Ù.

Singleton ÆÐÅÏÀº Á¾Á¾ Factory ÆÐÅÏÀ̶ó ºÒ¸®´Â ´Ù¸¥ ÆÐÅϰú ÇÔ²² »ç¿ëµÇ´Âµ¥, Factory ÆÐÅϵµ Singleton ÆÐÅϰú ¸¶Âù°¡Áö·Î »ý¼º ÆÐÅÏÀÇ ÀÏÁ¾ÀÌ´Ù. ÀÌ ÆÐÅÏÀº ƯÁ¤ °´Ã¼ÀÇ ¼­ºêŬ·¡½º, ¶Ç´Â º¸´Ù ÀϹÝÀûÀ¸·Î ƯÁ¤ÇÑ ÀÎÅÍÆäÀ̽ºÀÇ ±¸ÇöÀÌ ¾î¶»°Ô ½ÇÁ¦·Î °´Ã¼¸¦ »ý¼ºÇÏ´ÂÁö ±â¼úÇÑ´Ù. Factory ÆÐÅÏÀÇ ÁÁÀº º¸±â·Î Swing BorderFactory Ŭ·¡½º¸¦ µé ¼ö ÀÖ´Ù. ÀÌ Å¬·¡½º´Â ´Ù¾çÇÑ Á¾·ùÀÇ Border °´Ã¼¸¦ ¸®ÅÏÇÏ´Â ÀÏ·ÃÀÇ Á¤Àû ¸Þ¼Òµå¸¦ °¡Áö´Âµ¥, ¼­ºêŬ·¡½ºÀÇ ±¸Çö ¼¼ºÎ»çÇ×À» ¼û°Ü¼­ factory°¡ ÀÎÅÍÆäÀ̽º ±¸ÇöÀ» À§ÇÑ »ý¼ºÀÚ¸¦ Á÷Á¢ È£ÃâÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù. ´ÙÀ½Àº BorderFactoryÀÇ »ç¿ë ¿¹Á¦ÀÌ´Ù.
   Border line = BorderFactory.createLineBorder(Color.RED);
   JLabel label = new JLabel("Red Line");
   label.setBorder(line);
¿©±â¼­ BorderFactory°¡ LineBorder¸¦ »ý¼ºÇÑ´Ù´Â »ç½ÇÀ̳ª ±× »ý¼º ¹æ¹ýÀº ¼û°ÜÁ® ÀÖ´Ù. À̹ø ƯÁ¤ ¿¹Á¦¿¡¼­´Â LineBorder »ý¼ºÀÚ¸¦ Á÷Á¢ È£ÃâÇÒ ¼ö ÀÖÁö¸¸ Factory ÆÐÅÏÀ» ÀÌ¿ëÇÏ´Â ´ëºÎºÐÀÇ °æ¿ì¿¡´Â Á÷Á¢ È£ÃâÀÌ ºÒ°¡´ÉÇÏ´Ù.

Singleton ÆÐÅÏÀ» ±¸ÇöÇϴ Ŭ·¡½º´Â ´Ù¸¥ Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ »ý¼ºÇϱâ À§ÇØ Factory·Î »ç¿ëÇÒ °´Ã¼¸¦ ¸®ÅÏÇÏ´Â °æ¿ì°¡ ÈçÈ÷ Àִµ¥, ÀÌ´Â PopupFactory Ŭ·¡½º¿¡ ÀÇÇÑ Popup °´Ã¼ »ý¼º ¹æ½Ä¿¡ ÀÇÇØ ¿¹ÁõµÈ´Ù.

Singleton factory¸¦ ¾òÀ¸·Á¸é PopupFactoryÀÇ getSharedInstance() ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù.
   PopupFactory factory = PopupFactory.getSharedInstance();
±×·± ´ÙÀ½ factoryÀÇ getPopup() ¸Þ¼Òµå¸¦ È£ÃâÇÏ¿© factory¿¡¼­ Popup °´Ã¼¸¦ »ý¼ºÇϰí, »óÀ§ ÄÄÆ÷³ÍÆ®, ±× ÄÜÅÙÃ÷, Æ÷Áö¼ÇÀ» Àü´ÞÇÑ´Ù.
   Popup popup = factory.getPopup(owner, contents, x, y);
º¸¾È ÄÁÅØ½ºÆ®¿¡¼­ Factory ÆÐÅÏÀÌ ÀÚÁÖ »ç¿ëµÇ´Â °ÍÀ» º¼ ¼ö ÀÖÀ» °ÍÀÌ´Ù. ´ÙÀ½ ¿¹Á¦¿¡¼­´Â ƯÁ¤ ¾Ë°í¸®Áò¿¡ ´ëÇÑ certificate factory¸¦ ȹµæÇÑ ´ÙÀ½ stream certificate¸¦ »ý¼ºÇÑ´Ù.

   FileInputStream fis = new FileInputStream(filename);
   CertificateFactory cf = 
      CertificateFactory.getInstance("X.509");
   Collection c = cf.generateCertificates(fis);
BorderFactory¿¡¼­ º» °Íó·³, Factory ÆÐÅÏÀÌ ¹Ýµå½Ã Singleton ÆÐÅϰú ÇÔ²² »ç¿ëµÇ¾î¾ß ÇÏ´Â °ÍÀº ¾Æ´ÏÁö¸¸ ½ÇÁ¦·Î´Â µÎ ÆÐÅÏÀÌ ÇÔ²² »ç¿ëµÇ´Â °æ¿ìµµ Á¾Á¾ º¼ ¼ö ÀÖ´Ù.

¸Ç À§·Î

Observer ÆÐÅÏ
 

¾Õ¼­ ´Ù·é Singleton ÆÐÅϰú ¸¶Âù°¡Áö·Î, Observer ÆÐÅÏÀº ÀÚ¹Ù ÇÁ·Î±×·¥¿¡¼­ ¸¹ÀÌ »ç¿ëµÇ´Â ¼³°è ÆÐÅÏÀÌ´Ù. ÀÌ ÆÐÅÏÀº µ¿ÀÛ ¼³°è ÆÐÅÏÀ¸·Î, Ŭ·¡½º°¡ ´À½¼ÇÏ°Ô ¿¬°áµÇ´Â ¹æ½Ä°ú Ÿ Ŭ·¡½º ¾÷µ¥ÀÌÆ® ½Ã ÇϳªÀÇ(¶Ç´Â ´Ù¼öÀÇ) Ŭ·¡½º°¡ ÅëÁöµÇ´Â ¹æ½ÄÀ» Á¤ÀÇÇÑ´Ù. ±âº»ÀûÀ¸·Î, À̴ ƯÁ¤ Àå¼Ò¿¡¼­ ¹«½¼ ÀÏÀÌ ¹ß»ýÇÒ °æ¿ì, À̸¦ º¸°íÀÖ¾ú°Å³ª °ü½ÉÀ» °¡Áö°í ÀÖ´ø »ç¶÷µé¿¡°Ô »óȲÀ» ÅëÁöÇÏ´Â °ÍÀ» ÀǹÌÇÑ´Ù.

Observer ÆÐÅÏÀ» Ãë±ÞÇÏ´Â ¹æ½Ä¿¡´Â µÎ °¡Áö°¡ Àִµ¥, ù ¹øÂ° ¹æ½ÄÀº java.util package¿¡¼­ º¼ ¼ö ÀÖ´Â Observer¿Í Observable Ŭ·¡½º¸¦ ¼ö¹ÝÇÏ´Â °ÍÀ̰í, µÎ ¹øÂ° ¹æ½ÄÀº ÄÄÆ÷³ÍÆ®¿¡ À̺¥Æ® ¸®½º³Ê¸¦ µî·ÏÇÏ´Â JavaBeans ÄÄÆ÷³ÍÆ® ¸ðµ¨À» µû¸£´Â °ÍÀÌ´Ù.

JavaBeans À̺¥Æ® ¸ðµ¨ »ý¼º¿¡ ¾Õ¼­ Observer¿Í Observable Ŭ·¡½º´Â Observable ÆÐÅÏÀÇ ±¸ÇöÀ» ±â¼úÇÑ´Ù. ´Þ¸® ¸»Çؼ­ ÀÌ Å¬·¡½ºµéÀº Java Ç÷§Æû 1.0 ¹öÀü ¶§ºÎÅÍ »ç¿ëµÇ¾î ¿Ô°í, ±â¼úÀûÀ¸·Î ÇÏÀÚ°¡ ¾ø¾úÀ¸¸ç ¿©ÀüÈ÷ ¶óÀ̺귯¸®¿¡ Á¸ÀçÇϰí ÀÖ´Â °ÍÀÌ´Ù. ¶ÇÇÑ, ÀÌ Å¬·¡½ºµéÀº ¿©ÀüÈ÷ Observable ÆÐÅÏ ±¸Çö¿¡ »ç¿ëÇÒ ¼ö´Â ÀÖÁö¸¸, µÎ ¹øÂ° ¸ðµ¨ÀÎ JavaBeans ÄÄÆ÷³ÍÆ® ¸ðµ¨ÀÌ ÀϹÝÀûÀ¸·Î »ç¿ëµÈ´Ù. Observable ÆÐÅÏ ±¸ÇöÀ» À§ÇØ ÀÌ Å¬·¡½ºµéÀ» »ç¿ëÇÏ´Â µ¥ µû¸¥ ÇÑ °¡Áö Áß¿äÇÑ ¹®Á¦´Â Observable È®ÀåÀÌ ÇÊ¿äÇÏ´Ù´Â Á¡Àε¥, ÀÌ °æ¿ì ÀÚ¹Ù Ç÷§ÆûÀÇ ´ÜÀÏ »ó¼Ó ¼¼°è¿¡¼­´Â ºÒ°¡´ÉÇÒ ¼öµµ Àִ Ŭ·¡½º ÇÏÀ̾î¶óŰ ±¸Á¶¸¦ °­¿ä ¹Þ°Ô µÈ´Ù.

À̺¥Æ® ¸®½º³Ê¸¦ µî·ÏÇÏ´Â JavaBeans ÄÄÆ÷³ÍÆ® ¸ðµ¨Àº ÀÏ·ÃÀÇ add ¹× remove ¸Þ¼Òµå¸¦ ¼ö¹ÝÇϴµ¥, ¿©±â¼­ ¸®½º³Ê ŸÀÔÀº ¸Þ¼Òµå À̸§¿¡ ³»ÀåµÇ¾î ÀÖ´Ù. ¿¹¸¦ µé¾î, ¹öưÀÇ ¼±ÅÃÀ» °üÂûÇϱâ À§Çؼ­´Â ÄÄÆ÷³ÍÆ®¿¡ ActionListener¸¦ µî·ÏÇÑ´Ù.
   ActionListener listener = new ActionListener() {
      public void actionPerformed(ActionEvent actionEvent) {
          ...
      }
   }; 
   JButton button = new JButton("Pick Me");
   button.addActionListener(listener);
½Ã½ºÅÛ Á¤ÀÇ Å¬·¡½º¸¦ À§ÇÑ Observer ÆÐÅÏÀº À̰ÍÀÌ ÀüºÎ¶ó°í ÇÒ ¼ö Àִµ¥, ¸®½º³Ê ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϰí, ±×°ÍÀ» °üÂû Subject¿¡ ÷ºÎÇÑ ´ÙÀ½ ±â´Ù¸°´Ù. Subject´Â °üÂûµÇ´Â ´ë»óÀ¸·Î, ´©°¡ °üÂûÇϰí ÀÖ´ÂÁö¸¦ ±â¾ïÇÏ´Â ÀÏÀ» Ã¥ÀÓÁø´Ù. JavaBeans ÄÄÆ÷³ÍÆ® ¸ðµ¨ÀÇ °æ¿ì, Observer °´Ã¼¸¦ ÷ºÎ, ºÐ¸®Çϱâ À§ÇÑ ÀÎÅÍÆäÀ̽º·Î add/remove ¸®½º³Ê ³×ÀÌ¹Ö ÆÐÅÏÀÌ »ç¿ëµÈ´Ù. SubjectÀÇ »óŰ¡ º¯°æµÇ¸é À̸¦ Observer °´Ã¼¿¡ ÅëÁöÇÑ´Ù.

ÆÐÅÏÀÇ ÁÖµÈ ¸ñÇ¥ Áß Çϳª´Â Subject¿Í ObserverÀÇ ´À½¼ÇÑ ¿¬°áÀ» °¡´ÉÄÉ ÇÏ´Â °ÍÀÌ´Ù. JButtonÀÌ ¼±ÅõǸé, ButtonNotificationÀ̶ó ºÒ¸®´Â °¡»ó ¼­ºêŬ·¡½ºÀÇ Æ¯Á¤ ¸Þ¼Òµå¸¦ È£ÃâÇÏ´Â ´ë½Å ´©±¸³ª ±¸ÇöÇÒ ¼ö ÀÖ´Â ÀÎÅÍÆäÀ̽º·Î ÅëÁö°¡ Ãß»óÈ­µÈ´Ù. JButtonÀº ÷ºÎµÈ Observer(¸®½º³Ê)°¡ ¾î¶² Ŭ·¡½ºÀÎÁö ÀüÇô °³ÀÇÄ¡ ¾Ê´Âµ¥, ½ÇÁ¦·Î ¹öưÀº ±¸Çö Ŭ·¡½º°¡ ¼öÁ¤µÇ´õ¶óµµ ¿À·ÎÁö Observer°¡ ¸®½º³Ê¸¦ ±¸ÇöÇÑ´Ù´Â »ç½Ç¿¡¸¸ °ü½ÉÀ» °¡Áø´Ù.

Observer ÆÐÅÏ »ç¿ë ½Ã ÁÖÀÇÇÒ Çʿ䰡 ÀÖ´Â ¿©·¯ °¡Áö º¹ÀâÇÑ ¹®Á¦µéÀÌ ÀÖ´Ù. ù°´Â ¸Þ¸ð¸® ´©ÃâÀÇ °¡´É¼ºÀÌ´Ù. Observer¿¡ ´ëÇÑ ·¹ÆÛ·±½º´Â Subject¿¡ ÀÇÇØ °ü¸®µÇ´Âµ¥, Subject°¡ ·¹ÆÛ·±½º¸¦ ÇØÁ¦ÇÒ ¶§±îÁö´Â garbage collector·Î Observer¸¦ Á¦°ÅÇÒ ¼ö ¾ø´Ù. ÀÌ·± °¡´É¼º¿¡ À¯ÀÇÇÏ¿© ÀûÀýÇÑ »óȲ¿¡¼­ Observer¸¦ Á¦°ÅÇØ¾ß ÇÑ´Ù. ¾Æ¿ï·¯ (Àû¾îµµ À̺¥Æ® ¸®½º³Ê¸¦ µî·ÏÇÒ ¶§´Â) ÀÏ·ÃÀÇ Observer °´Ã¼°¡ unordered collection¿¡¼­ °ü¸®µÈ´Ù´Â Á¡¿¡ ÁÖ¸ñÇÒ °Í. ¸ÕÀú µî·ÏµÈ ¸®½º³Ê°¡ ¸ÕÀú ÅëÁöµÇ´ÂÁö ¸¶Áö¸·¿¡ ÅëÁöµÇ´ÂÁö¸¦ ¹Ýµå½Ã ¾Ë¾Æ¾ß ÇÒ ÇÊ¿ä´Â ¾øÀ¸³ª ¹Ýµå½Ã °´Ã¼ A°¡ ¸ÕÀú ÅëÁöµÇ°í À̾ °´Ã¼ B°¡ ÅëÁöµÇ´Â cascading ¹æ½ÄÀÇ ÅëÁö°¡ ÇÊ¿äÇÑ °æ¿ì¿¡´Â Áß°£ °´Ã¼¸¦ µµÀÔÇÏ¿© ¼ø¼­°¡ ÁöÄÑÁöµµ·Ï ÇØ¾ßÇÑ´Ù. ´ÜÁö Observer¸¦ ƯÁ¤ ¼ø¼­·Î µî·ÏÇÑ´Ù°í ÇØ¼­ ¹Ýµå½Ã ±× ¼ø¼­¿¡ µû¶ó ÅëÁö°¡ ÀÌ·ç¾îÁö´Â °ÍÀº ¾Æ´Ï´Ù.

Observer ÆÐÅÏÀ» ¸ðµ¨¸µÇÏ´Â ÀÚ¹Ù Ç÷§ÆûÀÇ ¶Ç ´Ù¸¥ ¿µ¿ªÀ¸·Î´Â, guaranteed delivery, non-local distribution, persistence µîÀÇ ÀÌÁ¡À» °®Ãá JMS(Java Message Service)¸¦ µé ¼ö ÀÖ´Ù. JMS publish-subscribe ¸Þ½Ã¡ ¸ðµ¨Àº ¹«ÇÑÇÑ ¼öÀÇ °¡ÀÔÀÚ°¡ °ü½É ÀÖ´Â ÁÖÁ¦¸¦ ûÃëÇÒ ¼ö ÀÖ°Ô ÇØÁִµ¥, publishµÈ ÁÖÁ¦¿¡ ´ëÇÑ ¸Þ½ÃÁö°¡ »ý¼ºµÇ¸é ¸ðµç °¡ÀÔÀڵ鿡°Ô ³»¿ëÀÌ ÅëÁöµÈ´Ù.

±× ¹Û¿¡µµ ÀÚ¹Ù Ç÷§Æû¿¡´Â Observer ÆÐÅÏÀ» ¸ðµ¨¸µÇÏ´Â ¿©·¯ ´Ù¸¥ ºÐ¾ß°¡ ÀÖÀ¸¸ç, ÀÌ ÆÐÅÏÀº ÀÚ¹Ù Ç÷§Æû Àü¹Ý¿¡ °ÉÃÄ ÀÚÁÖ »ç¿ëµÈ´Ù.

1995³â¼³°è ÆÐÅÏ(Design Patterns)ÀÌ Ãâ°£µÈ ÀÌ·¡·Î ÀÌ ÆÐÅϵ鿡 ´ëÇØ ´Ù¾çÇÑ °üÁ¡À» Á¦½ÃÇϰí Ãß°¡ ÆÐÅÏÀ» ¼Ò°³ÇÏ´Â ´Ù¸¥ Ã¥µéÀÌ ¹ßÇ¥µÈ ¹Ù ÀÖ´Ù. ±× Áß ´ÙÀ½ µÎ °¡Áö°¡ Àα⸦ ²ø¾ú´Ù. ¶ÇÇÑ, º¸´Ù ½Éµµ ÀÖ´Â ¼³°è ÆÐÅÏ¿¡ °ü½ÉÀÌ ÀÖ´Â µ¶ÀÚ¸¦ À§ÇØ ±â¾÷ ¾ÖÇø®ÄÉÀÌ¼Ç ¾ÆÅ°ÅØÃ³ÀÇ ÆÐÅÏ(Patterns of Enterprise Application Architecture) °°Àº Ã¥µéµµ ³ª¿Í ÀÖ´Ù.

¼³°è ÆÐÅÏ ÀϹݿ¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀ» º¸·Á¸é Wikipedia ¿£Æ®¸®(¿µ¹®)À» ÂüÁ¶Çϱ⠹ٶõ´Ù.


¸Ç À§·Î

º» ¸ÞÀÏÀº ¼ö½ÅÀ» µ¿ÀÇÇÑ È¸¿ø´Ô¿¡°Ô¸¸ ¹ß¼ÛµË´Ï´Ù.
º» ¸ÞÀÏÀÇ ¼ö½ÅÀ» °ÅºÎÇϰųª ¼ö½ÅÁÖ¼Ò¸¦ º¯°æÇÏ·Á¸é SKDN@Sun.comÀ¸·Î ¹®ÀÇ Áֽñ⠹ٶø´Ï´Ù.

SKDN(Sun Korea Developers Network)¿¡¼­ J2EE/J2SE Å×Å©ÆÁ µî ´Ù¾çÇÑ ¾ÆÆ¼Å¬µéÀ» Âü°íÇϼ¼¿ä.

Copyright 2003-2006 Sun Korea, Ltd. All rights reserved.