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