¼Ò¼³°°ÀºÀÚ¹Ù2ºÎ  Á¦10Àå ObjectŬ·¡½º  10.5 clone()¸Þ¼­µå  

 

10.5 clone() ¸Þ¼­µå

 

10.5.1 clone() À̶õ?

 

 clone¸Þ¼­µå´Â Object Ŭ·¡½ºÀÇ ¸â¹ö¸Þ¼­µåÀ̸ç, °´Ã¼ º¹»ç¸¦ Çϱâ À§Çؼ­´Â ¹Ýµå½Ã ÀÌ ¸Þ¼­µå¸¦ ÀÌ¿ëÇØ¾ß ÇÕ´Ï´Ù. ¿©·¯ºÐµéµµ ¾Ë´Ù½ÃÇÇ °´Ã¼´Â ÂüÁ¶¸¦ ±âº»À¸·Î Çϰí Àֱ⠶§¹®¿¡ °´Ã¼´Â ÇÒ´çÀǹÌÀÌÁö °´Ã¼ º¹»çÀÇ °³³äÀº ¾Æ´Õ´Ï´Ù. ¾Æ·¡ÀÇ ¿¹Á¦¸¦ »ìÆìº¸½Ã¸é Á¤È®ÇÑ Àǹ̸¦ ¾Ë ¼ö ÀÖÀ» °ÍÀÔ´Ï´Ù.

 

Top.java (°´Ã¼ ÂüÁ¶¿¡ °üÇÑ ¿¹Á¦)

public class Top{

             int a =10;

             int b =20;

             public static void main(String args[]){   

                           Top t = new Top();                 

                           System.out.println(t.hashCode());          

                           Top s = t;                

                           System.out.println(s.hashCode());     

                           Top w = new Top();

                           System.out.println(w.hashCode());

             }

}

C:\JavaExample\Chapter10\5-clone>javac Top.java

C:\JavaExample\Chapter10\5-clone>java Top

3852104

3852104

7434986

 

 ÀÌ ¿¹Á¦¿¡¼­ ¿ì¸®´Â Top t¿Í w´Â ¸Þ¸ð¸®¸¦ »õ·Î »ý¼ºÇÏ¿´À¸¸ç s´Â tÀÇ °ÍÀ» ÇÒ´ç¹Þ¾Ò´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. Top t = s ¶ó´Â Ç¥ÇöÀº ºÐ¸í ÇÒ´çÀÇ ¹ýÄ¢ÀÌ Àû¿ëµË´Ï´Ù. ´ç¿¬È÷ s¿Í t ´Â °°Àº ÂüÁ¶°ªÀ» °¡Áö°í ÀÖ´Ù´Â »ç½ÇÀ» À§ÀÇ ¿¹Á¦ÀÇ °á°ú·Î¼­ ¾Ë ¼ö ÀÖ½À´Ï´Ù.

 ±×·¸´Ù¸é °ú¿¬ ¾î¶°ÇÑ ¹æ¹ýÀ¸·Î °´Ã¼¸¦ º¹»çÇÒ ¼ö ÀÖÀ»±î¿ä? ¿ÏÀüÇÑ ¸Þ¸ð¸® º¹»ç´Â ObjectŬ·¡½ºÀÇ ¸â¹ö¸Þ¼­µåÀÎ cloneÀ̶ó´Â ¸Þ¼­µå°¡ Á¦°øÇϰí ÀÖ½À´Ï´Ù. º¸Åë °´Ã¼ º¹»ç¸¦ ³íÇÒ ¶§ CloneableÀÎÅÍÆäÀ̽º¿Í clone¸Þ¼­µå¸¦ ÇÔ²² ¼³¸íÇϰí ÀÖ½À´Ï´Ù. ÀÌ Àý¿¡¼­´Â ClonealbeÀÎÅÍÆäÀ̽º¿Í clone¸Þ¼­µå¸¦ Á¶ÇÕÇØ¼­ °´Ã¼¸¦ º¹»çÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¹è¿ì°Ô µÉ °ÍÀÔ´Ï´Ù. ÀÚ ±×·¸´Ù¸é clone¸Þ¼­µå ÀÚü°¡ ¾î¶»°Ô »ý°å´ÂÁöºÎÅÍ ¾Ë¾Æ º¸µµ·Ï ÇÏÁÒ.

 

 

 

 

10.5.2  protected native Object clone()

 ÀÌ Àý¿¡¼­´Â clone¸Þ¼­µåÀÇ »ý±è»õ¸¸ Çѹø ¾Ë¾Æ º¸µµ·Ï ÇϰڽÀ´Ï´Ù. ¸î °³ ¾ø½À´Ï´Ù. cloneÀ̶ó´Â À̸§À» »©°í³ª¸é ¹ÝȯÇüÀº ObjectÇüÀ̸ç Á¢±ÙÁöÁ¤ÀÚ´Â protectedÀÔ´Ï´Ù. ±×¸®°í ÀÌ»óÇÑ °ÍÀÌ Çϳª ºÙ¾î ÀÖ½À´Ï´Ù. native¶ó´Â °ÍÀÌ ºÙ¾î ÀÖ½À´Ï´Ù.

 

n        ¿øÇü: protected native Object clone()

ü         native ¸Þ¼­µå´Â ÀÚ¹Ù°¡ ¾Æ´Ñ ¾ð¾î(º¸ÅëÀº C, C++)·Î ±¸ÇöÇÏ¿© ÀÚ¹Ù¿¡¼­ »ç¿ëÇÏ·Á°í ÇÒ ¶§ ÀÌ·¯ÇÑ ¹æ¹ýÀ» ÀÌ¿ëÇÕ´Ï´Ù.

ü         Native¿¡ °üÇÑ ÀÚ¼¼ÇÑ ³»¿ëÀº 20ÀåÀÇ JNI¿¡¼­ native¸Þ¼­µå¸¦ ¸¸µå´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¹è¿ì°Ô µÉ °ÍÀÔ´Ï´Ù.

ü         protected´Â Á¢±ÙÁöÁ¤ÀÚÁÒ. private°ú ºñ½ÁÇÑ ¼º°ÝÀ» Áö´Ï°í ÀÖÁö¸¸ ÆÐŰÁö³»¿¡¼­´Â ¿ÏÀüÇÑ publicÀ¸·Î Ȱµ¿ÇÏ¸ç ±×¸®°í »ó¼Ó°ü°è¿¡¼­µµ ¿ÏÀüÇÑ publicÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖÁö¸¸ ÆÐŰÁö ¿ÜºÎ³ª »ó¼ÓÀ̿ܿ¡ »ç¿ëÇÒ ¶§´Â ¿ÏÀüÇÑ privateÀÌ µÇ´Â ³ðÀÌ ¹Ù·Î protectedÀÔ´Ï´Ù.

ü         °¡»ó¸Ó½Å¿¡¼­ ¸Þ¸ð¸®¸¦ º¹»çÇÑ ÈÄ °á°ú°ªÀ» ObjectÇüÀ¸·Î ¹ÝȯÇÕ´Ï´Ù.

 

 native´Â º° ½Å°æ ¾µ °ÍÀÌ ¾ø½À´Ï´Ù. Clone¸Þ¼­µå¸¦ ´Ù¸¥ ¾ð¾î·Î ±¸ÇöÇÏ¿© ÀÌ¹Ì ¿ì¸®°¡ »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ¿ÏÀüÇÏ°Ô ¸¸µé¾î µÎ¾úÀ¸´Ï  ½Å°æ ¾µ °ÍÀº ¾ø½À´Ï´Ù. ¿©±â¼­ Àá±ñ, native ´Â ¿Ö ¾µ±î¿ä. ¾Æ¸¶µµ ÀÚ¹Ù·Î ±¸ÇöÇϱ⠱î´Ù·Î¿î °ÍÀ» ´Ù¸¥ ¾ð¾î·Î ±¸ÇöÇÏ¿© ÀÚ¹Ù¿¡¼­ »ç¿ëÇϵµ·Ï Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù°¡ Á¤´äÀ̰ÚÁÒ. ±×¸®°í ¼Óµµ¿Í ¼Ò½º°ø°³¹®Á¦°¡ ±× ´ÙÀ½ ¹®Á¦°ÚÁÒ.

 ±×·±µ¥ ¿©±â¼­ ¹®Á¦°¡ »ý±â´Â °ÍÀº ¿ÀÈ÷·Á protected¶ó´Â Á¢±ÙÁöÁ¤ÀÚ¶õ ³ðÀÔ´Ï´Ù. public¸Þ¼­µå³ª public¸â¹öÇʵå´Â ƯÁ¤°´Ã¼¿¡¼­ Á¡(.)Âï°í Á¢±Ù °¡´ÉÇÏÁö¸¸ protected´Â ¿ÜºÎ¿¡¼­ Á¢±ÙÇÒ ¶§ ¿ÏÀüÇÑ privateó·³ ÇൿÇϱ⠶§¹®¿¡ Á¢±Ù ºÒ°¡´ÉÇÕ´Ï´Ù. À̰ÍÀ» ÇØ°áÇÏÁö ¾Ê°í¼­´Â clone¸Þ¼­µå´Â ¿ÏÀüÈ÷ ±×¸²ÀÇ ¶±ÀÔ´Ï´Ù. ÀÌ ¹®Á¦¸¦ ÇØ°áÇÏ´Â °ÍÀÌ ¹Ù·Î protectedÀÇ °³³äÀ» ¶Ù¾î ³Ñ´Â °ÍÀÔ´Ï´Ù. ÀÚ ±×·¸´Ù¸é clone¸Þ¼­µå¸¦ ÀÌ¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ¼­ ¾Ë¾Æ º¸µµ·Ï ÇÏÁÒ.

 

 

10.5.3 ¾î¶»°Ô ÇÏ¸é ¸Þ¸ð¸® Â÷¿øÀÇ º¹»ç¸¦ ÇÒ ¼ö ÀÖÀ»±î?

 

°´Ã¼¸¦ º¹»çÇϱâ À§Çؼ­´Â ÀÏ´Ü 2´Ü°è ÀýÂ÷¸¦ °ÅÃÄ¾ß ÇÕ´Ï´Ù. ±× ÀýÂ÷´Â ´ÙÀ½°ú °°½À´Ï´Ù.

n         Cloneable ÀÎÅÍÆäÀ̽º·Î ±¸ÇöÇϱâ

n         public Object clone()¸Þ¼­µåÀÇ ÀçÁ¤ÀÇ¿Í protected native Object clone¸Þ¼­µå »ç¿ë

CloneableÀº 5Àå¿¡¼­ ¹è¿ü´ø interfaceÀÇ ÇÑ Á¾·ùÀÔ´Ï´Ù. ÀÎÅÍÆäÀ̽ºÀÇ ±âº»Àº ÀÎÅÍÆäÀ̽º ³»¿¡ Á¸ÀçÇÏ´Â Ãß»ó¸Þ¼­µå¸¦ ¸ðµÎ ±¸ÇöÇÏ¿©¾ß¸¸ »ç¿ë °¡´ÉÇÏÁö¸¸, °ø±³·Ó°Ôµµ CloneableÀÎÅÍÆäÀ̽º´Â Ãß»ó¸Þ¼­µå¸¦ Çϳªµµ °¡Áö°í ÀÖÁö ¾Ê½À´Ï´Ù. ¸»·Î¸¸ ÀÎÅÍÆäÀ̽ºÁÒ. ÀÌ·¯ÇÑ ÀÎÅÍÆäÀ̽º¸¦ º¸Åë Ç¥½Ã ÀÎÅÍÆäÀ̽º¶ó°í ºÎ¸¨´Ï´Ù. ¹«´Ì¸¸ ÀÎÅÍÆäÀ̽ºÀε¥  Serializable ¶ÇÇÑ ÀÌ·± Á¾·ù¿¡ ¼ÓÇÕ´Ï´Ù. Ç¥½Ã ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϱâ À§Çؼ­´Â ¡°implements Cloneable¡±°ú °°ÀÌ ±×³É ºÙ¿©¸¸ ÁÖ¸é µË´Ï´Ù. ±×³É ºÙ¿©¸¸ ÁÖ´Ï ¾Æ¸¶µµ Ç¥½Ã ÀÎÅÍÆäÀ̽º°¡ ¾Æ´Ò±î¿ä!

 

CloneableÀ» ±¸ÇöÇÏ´Â °ÍÀº ±×·¸°Ô ¾î·ÆÁö ¾Ê½À´Ï´Ù. ÇÏÁö¸¸, protected¸Þ¼­µå¸¦ »ç¿ëÇÏ´Â °ÍÀº ¾à°£ ±î´Ù·Ó½À´Ï´Ù. ÀÏ´Ü ´ÙÀ½°ú °°ÀÌ public Object clone()¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇÕ´Ï´Ù.

 

Clone ¸Þ¼­µåÀÇ ÀçÁ¤ÀÇ

public class Top implements Cloneable{

    public Object clone() {

         return super.clone();

    }

}

Implements CloneableÀ» ºÙÀÎ ÈÄ clone()¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇϰí ÀÖ½À´Ï´Ù.(ÇöÀç´Â Exception󸮴 Á¦¿Ü)

 

À§ÀÇ ¿¹Á¦¿¡¼­ ¿ì¸®´Â ¾à°£ ´Ù¸¥ ¸éÀ» º¼ ¼ö ÀÖ½À´Ï´Ù. ¿©±â¼­ super.clone()¸Þ¼­µå¿¡ ´ëÇØ¼­ Çѹø µûÁ® º¸ÁÒ. ¸¸¾à ±×³É cloneÀ» »ç¿ëÇß´Ù¸é ¾î¶»°Ô µÉ±î¿ä. ±×°ÍÀº ÀÚ½ÅÀÇ clone¸Þ¼­µå¸¦ È£ÃâÇÏ´Â °á°ú¸¦ ÃÊ·¡ÇÕ´Ï´Ù. ¿ì¸®°¡ È£ÃâÇϰíÀÚÇÏ´Â °ÍÀº ObjectŬ·¡½ºÀÇ clone¸Þ¼­µåÀÔ´Ï´Ù. ProtectedÀÇ Æ¯¼º»ó ºÎ¸ð¿Í ÀڽŰ£¿¡´Â ¸¶À½´ë·Î È£ÃâÇÒ ¼ö Àִ Ư¼ºÀ» °¡Áö°í ÀÖ°í È£ÃâÇÏ·Á°í ÇÏ´Â clone¸Þ¼­µå´Â ºÎ¸ðÀÇ ¸Þ¼­µåÀ̱⠶§¹®¿¡ ´ç¿¬È÷ super·Î Á¢±ÙÇØ¼­ cloneÀ» È£ÃâÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇϰí ÀÖ½À´Ï´Ù. ½±°Ô »ý°¢µÇÁö¸¸ ÀÌ·¯ÇÑ ¹æ¹ýÀ» »ç¿ëÇÏ´Â °ÍÀº ObjectÀÇ protected native Object clone()¸Þ¼­µå¸¦ °´Ã¼¿¡¼­ Á÷Á¢È£Ãâ ÇÒ ¼ö ¾ø±â ¶§¹®¿¡ ³»ºÎ¿¡¼­ È£ÃâÇØ ÁÖ°í ¿ÜºÎ¿¡¼­´Â ÀçÁ¤ÀÇµÈ ¸Þ¼­µå·Î Á¢±ÙÇϰí ÀÖ´Â °ÍÀÔ´Ï´Ù. ±×¸®°í, °´Ã¼ º¹»ç¸¦ ±¸ÇöÇß´Ù´Â °ÍÀ» ¾Ë¸®´Â implements Cloneableµµ ÀØÁö ¸¶½Ã±â ¹Ù¶ø´Ï´Ù.

 

10.5.4 °´Ã¼ º¹»çÀÇ ¿¹

 

°´Ã¼ º¹»ç´Â 2°¡Áö Ãø¸é¿¡¼­ »ý°¢ÇØ º¼ ¼ö ÀÖ´Ù. ù¹øÂ°´Â ÀÌ¹Ì ±¸ÇöµÈ CloneableÀÌ ÀÖ´Ù¸é ±×³É clone() ¸Þ¼­µå¸¦ »ç¿ëÇÏ¸é µÈ´Ù. µÎ¹øÂ°´Â CloneableÀ» ¿©·¯ºÐÀÌ Á÷Á¢ ±¸ÇöÇÏ´Â °ÍÀÌ´Ù. ÀÌ¹Ì ±¸Çö ÇØ µÐ clone¸Þ¼­µå°¡ ÀÖ´Ù¸é ±»ÀÌ ±¸ÇöÇÒ Çʿ䰡 ¾ø°ÚÁÒ. ¶Ç, try, catch ³ª throws¸¦ »ç¿ëÇÏ¿© CloneNotSupportedException ó¸® ¶ÇÇÑ ÇØÁÖ¾î¾ß ÇÑ´Ù.

 

ÇÁ·Î±×·¥»óÀ¸·Î ½ÇÁ¦ Àû¿ëµÈ ¿¹¸¦ »ìÆìº¸µµ·Ï ÇϰڽÀ´Ï´Ù. ¸ÕÀú CloneableÀÇ ¿¹ºÎÅÍ »ìÆì º¸µµ·Ï ÇÏÁÒ.

 

Test.java (Cloneable ÀÎÅÍÆäÀ̽º·Î ±¸ÇöÇÑ ¿¹Á¦)

class SimpleClone implements Cloneable{       

             public int count=0;

             public SimpleClone(int count){

                           this.count = count;

             }           

             public Object clone(){                      

                           Object o = null;                  

                           try{                     

                                        o = super.clone();              

                           }catch (Exception e){System.out.println("can't clone object");}

                           return o; 

             }

}

public class LCopy{

             public static void main(String args[]){

                           SimpleClone sc1 = new SimpleClone(22);

                           SimpleClone sc2 = (SimpleClone)sc1.clone();

                           System.out.println("sc1 hashCode:"+sc1.hashCode() + ", countÀǰª:" + sc1.count);

                           System.out.println("sc2 hashCode:"+sc2.hashCode() + ", countÀǰª:" + sc2.count);

             }

}

C:\JavaExample\10>javac LCopy.java

C:\JavaExample\10>java LCopy

sc1 hashCode:2452092, countÀǰª:22

sc2 hashCode:7474923, countÀǰª:22

 

½ÇÇà °á°ú¸¦ »ìÆìº¸¸é, ¾Õ¿¡¼­ ¼³¸íÇÑ °´Ã¼ sc1°ú sc2ÀÇ hashCode°¡ ¼­·Î ´Ù¸£°Ô Ãâ·ÂµÇ¾ú´Ù´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. ±×¸®°í °´Ã¼ÀÇ ¸Þ¸ð¸®Â÷¿ø¿¡¼­ º¹»çÀ̱⠶§¹®¿¡ ¸â¹öÀÇ °ªÀº °°Àº °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.

 

µÎ ¹øÂ°·Î, ÀÌ¹Ì ±¸ÇöµÈ clone()¸Þ¼­µå¸¦ »ç¿ëÇÏ´Â ¹æ¹ý¿¡ ´ëÇØ ¾Ë¾Æº¸µµ·Ï ÇÏÁÒ. Vector Ŭ·¡½º¿¡ ¹Ì¸® ±¸ÇöµÈ clone() ¸Þ¼­µå¸¦ »ç¿ëÇϱ⸸ ÇÏ¸é µË´Ï´Ù. °£´ÜÇÑ ¿¹·Î VectorŬ·¡½º´Â CloneableÀ» ±¸ÇöÇÑ Å¬·¡½ºÀÔ´Ï´Ù. ±×·¸±â ¶§¹®¿¡ ´ÙÀ½°ú °°Àº ±¸¹®ÀÌ °¡´ÉÇÕ´Ï´Ù.

 

ÀÌ¹Ì ±¸ÇöµÈ clone()¸Þ¼­µå¸¦ »ç¿ëÇÑ ¿¹Á¦

Vector v = new Vector();

v.addElement(new Integer(3));

Vector s= v.clone();

 

Vector Ŭ·¡½º¿¡´Â ÀÌ¹Ì CloneableÀ» implementsÇÏ¿© ±¸ÇöµÈ clone() ¸Þ¼­µå°¡ ÀÖ½À´Ï´Ù.(Àǽɳª½Ã¸é API¹®¼­¸¦ È®ÀÎ ÇØ º¸½Ê½Ã¿À) À§ÀÇ ¿¹Á¦¿Í °°ÀÌ ¿ì¸®´Â °´Ã¼¸¦ º¹»çÇÒ ¶§, ´Ü¼øÈ÷ ÀÌ clone() ¸Þ¼­µå¸¦ ±×³É »ç¿ëÇÏ¸é µÇ´Â °ÍÀÔ´Ï´Ù. º¹ÀâÇÑ °ÍÀ» Vector¸¦ ¸¸µç »ç¶÷µéÀÌ ¿ì¸®¸¦ À§ÇØ ¹Ì¸® ±¸ÇöÇØ ³õÀº °ÍÀÌ´Ù. ½ÇÁ¦ ±¸ÇöµÈ ¿¹¸¦ Çϳª »ìÆìº¸µµ·Ï ÇÏÁÒ.

 

 

import java.util.Vector;

public class LCopy2{         

             public static void main(String[] args){

                           Vector v = new Vector();                 

                           v.addElement(new Integer(11));

                           v.addElement(new String("¿øº»ÀÇ ±Û"));                         

                           Vector s = (Vector)v.clone();                         

                           s.addElement(new String("º¹»çº»¿¡ Ãß°¡"));                    

                           System.out.println(v);                      

                           System.out.println(s);         

             }

}

C:\JavaExample\10>javac LCopy2.java

C:\JavaExample\10>java LCopy2

[11, ¿øº»ÀÇ ±Û]

[11, ¿øº»ÀÇ ±Û, º¹»çº»¿¡ Ãß°¡]

 

 

 

 

10.5.5 °á·Ð

ÀÚ¹Ù¿¡¼­ °´Ã¼ º¹»ç ¹æ¹ýÀº clone() ¸Þ¼­µå¸¦ »ç¿ëÇÏ´Â ¹æ¹ý ¹Û¿¡´Â ¾ø½À´Ï´Ù. ±×¸®°í ¿ì¸®°¡ °´Ã¼¸¦ ¸Þ¸ð¸® Â÷¿ø¿¡¼­ ¿Ïº®ÇÏ°Ô º¹»çÇϱâ À§Çؼ­´Â CloneableÀ» »ç¿ëÇÒ ¼ö ÀÖ¾î¾ß Çϸç À̶§ clone()¸Þ¼­µåÀÇ Á¢±Ù ÁöÁ¤ÀÚ°¡ protectedÀ̹ǷΠ¿ÜºÎ Á¢±ÙÀÌ ºÒ°¡´ÉÇϱ⠶§¹®¿¡ ³»ºÎ¿¡¼­ super·Î Á¢±ÙÇÑ´Ù´Â °Í¿¡ ÁÖÀÇÇϽñ⠹ٶø´Ï´Ù. ÀÚ¹ÙÀÇ °´Ã¼ º¹»ç´Â CloneableÀ̶õ ÀÎÅÍÆäÀ̽º¿Í protected¶õ Á¢±ÙÁöÁ¤ÀÚÀÇ »ç¿ëÀ» ÅëÇØ¼­ ¿ÏÀüÇÏ°Ô ±¸ÇöµÉ ¼ö ÀÖ½À´Ï´Ù.



jabookÀúÀÚ¸íÇÔ
Á¦¸ñ:¼Ò¼³°°ÀºÀÚ¹Ù2ºÎ
ÀúÀÚ:ÃÖ¿µ°ü