15-1.Object

15-1-1.·çÆ® Ŭ·¡½º

ÀÚ¹Ù SDK´Â °Å´ëÇÑ ÀÚ¹Ù API ½Ã½ºÅÛ ¶óÀ̺귯¸®¸¦ Æ÷ÇÔÇÑ´Ù. ±âº»ÀûÀÎ ÀڷᱸÁ¶¿Í ÀÚÁÖ »ç¿ëÇÏ´Â ¾Ë°í¸®ÁòÀ» Á¦°øÇÏ¸ç ³×Æ®¿÷, ±×·¡ÇÈ, µ¥ÀÌÅͺ£À̽º µî ½Ç¹«¿ë ±â´É±îÁö ´ë°Å ¸Á¶óÇÏ°í ÀÖÀ¸¸ç ½Å±â¼úµµ ¹ßºü¸£°Ô Á¦°øÇÑ´Ù.

ÀÚ¹Ù API¸¸ Àß È°¿ëÇصµ ±âº» Äڵ带 ÀÏÀÏÀÌ ÀÛ¼ºÇÒ ÇÊ¿ä°¡ ¾ø°í ºñ½Ñ ¿ÜºÎ ¶óÀ̺귯¸®¸¦ ±¸ÀÔÇÏÁö ¾Ê¾Æµµ ´ëºÎºÐÀÇ ±â´ÉÀ» ¾µ ¼ö ÀÖ´Ù. ÀÌ ¹æ´ëÇÑ ¶óÀ̺귯¸®¸¦ Àß È°¿ëÇÏ·Á¸é API ±¸Á¶¸¦ ¹Ì¸® ÆľÇÇØ µÎ¾î¾ß ÇÏ¸ç ·¹ÆÛ·±½º¸¦ Àß È°¿ëÇØ¾ß ÇÑ´Ù.

Àڹ٠Ŭ·¡½º ¶óÀ̺귯¸®ÀÇ ·çÆ® Ŭ·¡½º´Â ObjectÀÌ¸ç ¸ðµç Ŭ·¡½º°¡ Object·ÎºÎÅÍ ÆÄ»ýµÈ´Ù. Ŭ·¡½º ¼±¾ð¹®¿¡ extends ÀýÀÌ ¾ø´õ¶óµµ ÄÄÆÄÀÏ·¯´Â Object·ÎºÎÅÍ »ó¼Ó¹Þ´Â °ÍÀ¸·Î °£ÁÖÇÑ´Ù. Áö±Ý±îÁö ½Ç½ÀÀ¸·Î ¸¸µé¾ú´ø Car, Human Ŭ·¡½ºÀÇ ¼±¾ð¹®Àº ½ÇÁ¦ ´ÙÀ½°ú °°´Ù.

 

class Human extends Object {

}

 

º°µµÀÇ ºÎ¸ð Ŭ·¡½º¸¦ ÁöÁ¤ÇÑ °æ¿ìµµ °èÃþÀ» µû¶ó ¿Ã¶ó°¡¸é ½ÃÀÛÀº Ç×»ó ObjectÀÌ¸ç ¸ðµç Ŭ·¡½º´Â °£Á¢ÀûÀ¸·Î Object¸¦ »ó¼Ó¹Þ´Â´Ù. µû¶ó¼­ ÀÚ¹ÙÀÇ ¸ðµç Ŭ·¡½º´Â ObjectÀÇ ÈļÕÀ̸ç ObjectÀÇ ¸â¹ö¸¦ °øÀ¯ÇÏ°í ObjectÀÇ ¸Þ¼­µå¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. Object´Â ¸ðµç ÈÄ¼Õ Å¬·¡½º¿¡ °øÅëÀûÀ¸·Î ÇÊ¿äÇÑ ±âº» ±â´ÉÀÇ ¸ñ·ÏÀ» Á¦°øÇÑ´Ù.

ÀÚÁÖ »ç¿ëµÇ´Â Áß¿äÇÑ ±â´ÉÀ» Á¤ÀÇÇϹǷΠObject ÀÚü¸¦ Àß ¿¬±¸ÇØ µÑ ÇÊ¿ä°¡ ÀÖ´Ù. Object´Â ¸Þ¼­µå¸¸ °¡Áö¸ç Çʵå´Â ´Ü Çϳªµµ Æ÷ÇÔÇÏÁö ¾Ê´Â´Ù. ¿Ö³ÄÇÏ¸é ·çÆ®ÀÇ Çʵå´Â ¸ðµç Èļտ¡°Ô »ó¼ÓµÇ¾î ¸Þ¸ð¸® ¼Ò¸ð°¡ ½ÉÇϱ⠶§¹®ÀÌ´Ù. ¸Þ¼­µå´Â ÃÑ 9°³ ÀÖÀ¸¸ç ÀÌ Áß wait ¸Þ¼­µå´Â 3°³ÀÇ ¹öÀüÀ¸·Î ¿À¹ö·ÎµùµÇ¾î ÀÖ´Ù.

 

¸Þ¼­µå

¼³¸í

toString

°´Ã¼ÀÇ »óŸ¦ ¹®ÀÚ¿­·Î ¸®ÅÏÇÑ´Ù.

equals

´Ù¸¥ °´Ã¼¿Í ºñ±³ÇÏ¿© °°ÀºÁö Á¶»çÇÑ´Ù.

hashCode

°´Ã¼ÀÇ Çؽà Äڵ带 ¸®ÅÏÇÑ´Ù.

clone

»çº»À» ÀÛ¼ºÇÑ´Ù.

finalize

°´Ã¼°¡ Á¦°ÅµÉ ¶§ È£ÃâµÇ¾î ÀÚ¿øÀ» Á¤¸®ÇÑ´Ù.

getClass

°´Ã¼ÀÇ Å¬·¡½º Á¤º¸¸¦ ½ÇÇàÁß¿¡ Á¶»çÇÑ´Ù.

notify

°´Ã¼¸¦ ±â´Ù¸®´Â ½º·¹µå¸¦ ±ú¿î´Ù.

notifyAll

°´Ã¼¸¦ ±â´Ù¸®´Â ¸ðµç ½º·¹µå¸¦ ±ú¿î´Ù.

wait

ÇöÀç ½º·¹µå¸¦ ´ë±â »óÅ·Π¸¸µç´Ù.

 

Object´Â ÈÄ¼Õ Å¬·¡½º¿¡¼­ ÀçÁ¤ÀÇÇÒ¸¸ÇÑ ¸Þ¼­µå¸¦ Á¦°øÇÒ »Ó ±× ÀÚü´Â Ưº°ÇÑ ±â´ÉÀÌ ¾ø´Ù. µû¶ó¼­ Object °´Ã¼¸¦ »ý¼ºÇÒ ÀÏÀº °ÅÀÇ ¾øÀ¸¸ç ¸¸µé¾î ºÁ¾ß ½á ¸ÔÀ» µ¥µµ ¾ø´Ù. ´Ù¸¸ ·çÆ®Àθ¸Å­ ¸ðµç Ŭ·¡½ºÀÇ ´ëÇ¥ ŸÀÔ ÀÚ°ÝÀ» °¡Áö¸ç Object ŸÀÔÀÇ º¯¼ö´Â ¸ðµç º¯¼ö¸¦ ´ëÀÔ¹ÞÀ» ¼ö ÀÖ´Ù.

ObjectÀÇ ¸Þ¼­µå´Â ´ëºÎºÐ ¹«³­ÇÑ µðÆúÆ® ±¸ÇöÀÌ Á¦°øµÇÁö¸¸ ¸ðµç Ŭ·¡½º¿¡ ÀûÇÕÇÏÁö´Â ¾Ê¾Æ ÇÊ¿ä¿¡ µû¶ó Ŭ·¡½ºº°·Î Àû´çÈ÷ ÀçÁ¤ÀÇÇØ¾ß ÇÑ´Ù. ObjectÀÇ ¸Þ¼­µå¸¦ ¼ø¼­´ë·Î ¾Ë¾Æº¸µÇ µ¿±âÈ­ °ü·Ã ¸Þ¼­µå´Â ½º·¹µå¿Í ÇÔ²² µû·Î ¿¬±¸ÇØ º¸±â·Î ÇÏÀÚ.

15-1-2.toString

toString ¸Þ¼­µå´Â °´Ã¼ÀÇ »óŸ¦ ¹®ÀÚ¿­·Î ¸®ÅÏÇÑ´Ù. ÀÌ ¹®ÀÚ¿­Àº °´Ã¼ÀÇ »óŸ¦ ¼³¸íÇϸç Ãâ·Â, µð¹ö±ë, ·Î±× µîÀÇ  ¿©·¯ °¡Áö ¿ëµµ·Î »ç¿ëµÈ´Ù. toStringÀÌ ·çÆ®¿¡ Á¤ÀǵǾî ÀÖ¾î ÀÚ¹ÙÀÇ ¸ðµç °´Ã¼´Â ¹®ÀÚ¿­ ÇüÅ·ΠǥÇöÇÒ ¼ö ÀÖ´Ù. Á¤¼ö³ª ½Ç¼ö°°Àº ±âº»Çü º¯¼ö´Â ¹°·ÐÀÌ°í °´Ã¼µµ ¹®ÀÚ¿­·Î º¯È¯ °¡´ÉÇØ println ¸Þ¼­µå·Î ¸ðµç º¯¼ö¸¦ ´Ù Ãâ·ÂÇÒ ¼ö ÀÖ´Ù.

 

tostring

½ÇÇà°á°ú

class Human {

     int age;

     String name;

    

     Human(int age, String name) {

          this.age = age;

          this.name = name;

     }

}

 

class JavaTest {

     public static void main(String[] args) {

          int i = 1234;

          System.out.println(i);

         

          Human kim = new Human(29, "±è»óÇü");

          System.out.println(kim);

     }

}

1234

Human@15db9742

 

°ª 1234¸¦ °¡Áö´Â Á¤¼öÇü º¯¼ö i¸¦ Ãâ·ÂÇϸé ÀÌ º¯¼öÀÇ toString ¸Þ¼­µå°¡ È£ÃâµÇ¾î ¹®ÀÚ¿­·Î È­¸é¿¡ Ãâ·ÂµÈ´Ù. Á¤¼öµµ È­¸é¿¡ "1234" ½ÄÀ¸·Î ¹®ÀÚ¿­ ÇüÅ·ΠÂï¾î¾ß ±× °ªÀ» È®ÀÎÇÒ ¼ö Àִµ¥ printlnÀÌ º¯¼öÀÇ toStringÀ» È£ÃâÇÏ¿© ¹®ÀÚ¿­·Î ¹Ù²ã ÁÖ´Â °ÍÀÌ´Ù.

Human °´Ã¼µµ println ¸Þ¼­µå·Î Àü´ÞÇϸé È­¸é¿¡ Ãâ·ÂµÈ´Ù. Human ŸÀÔÀ» ¹Þ´Â println ¸Þ¼­µå´Â ¾øÁö¸¸ HumanÀÌ ObjectÀÇ ÈļÕÀ̸ç Object°¡ toStringÀ» Á¤ÀÇÇÏ°í ÀÖ¾î ÀÌ»ó ¾øÀÌ ÄÄÆÄÀϵȴÙ. ±×·¯³ª Human °´Ã¼¿¡ ´ëÇÑ Ãâ·Â¹®Àº ¼³¸íÀûÀÌÁö ¾Ê¾Æ ¾î¶² Á¾·ùÀÇ »ç¶÷ÀÎÁö ÆľÇÇÒ ¼ö ¾ø´Ù. ObjectÀÇ toString ¸Þ¼­µå´Â Ŭ·¡½º À̸§°ú 16Áø Çؽà ÄÚµåÀÇ Á¶ÇÕÀ» Ãâ·ÂÇÑ´Ù.

 

getClass().getName() + '@' + Integer.toHexString(hashCode())

 

»ç¿ëÀÚ°¡ Á¤ÀÇÇÑ Å¬·¡½º´Â ¾ÆÁÖ ¸¹Àº Çʵ带 °¡Áö´Âµ¥ ±× Áß ¾î¶² Çʵ尡 Áß¿äÇÑ Á¤º¸ÀÎÁö ÆǺ°Çϱ⠾î·Á¿ö ±âº» toString ¸Þ¼­µå´Â À¯¿ëÇÑ Á¤º¸¸¦ º¸¿©ÁÙ ¼ö ¾ø°í °´Ã¼³¢¸® ±¸º° °¡´ÉÇÑ °íÀ¯ÇÑ Ç¥½Ä¸¸ º¸¿©ÁØ´Ù. ¼³¸íÀûÀÎ ¹®ÀÚ¿­À» Ãâ·ÂÇÏ°í ½Í´Ù¸é toString ¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇÏ¿© °´Ã¼ ÆǺ°¿¡ ¿ëÀÌÇÑ Á¤º¸¸¦ ¸®ÅÏÇØ¾ß ÇÑ´Ù.

 

humanstring

½ÇÇà°á°ú

class Human {

     int age;

     String name;

    

     Human(int age, String name) {

          this.age = age;

          this.name = name;

     }

    

     public String toString() {

          return age + "¼¼ÀÇ " + name;

     }

}

 

class JavaTest {

     public static void main(String[] args) {

          int i = 1234;

          System.out.println(i);

         

          Human kim = new Human(29, "±è»óÇü");

          System.out.println(kim);

         

          String str = "¹üÀÎ : " + kim;

          System.out.println(str);

     }

}

1234

29¼¼ÀÇ ±è»óÇü

¹üÀÎ : 29¼¼ÀÇ ±è»óÇü

 

»ç¶÷À» ƯÁ¤Çϴµ¥´Â ³ªÀÌ¿Í À̸§ÀÌ °¡Àå ÀûÇÕÇÏ´Ù. Human Ŭ·¡½º´Â toString ¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇÏ¿© age¿Í name Çʵ带 Á¶ÇÕÇÑ ¹®ÀÚ¿­À» ¸®ÅÏÇÔÀ¸·Î½á »ç¶÷ÀÇ ½Å»ó Á¤º¸¸¦ ³ëÃâÇÑ´Ù. ´õ º¹ÀâÇÑ Å¬·¡½º´Â ¿©·¯ ÇʵåÀÇ °ªÀ» Á¶ÇÕÇϰųª °è»êÇÏ¿© ´ë·®ÀÇ °á°ú¸¦ ¸®ÅÏÇÑ´Ù.

Object´Â Á÷Á¢ÀûÀÎ ±â´ÉÀº ¾øÁö¸¸ ÀçÁ¤ÀÇÇÒ¸¸ÇÑ ¸Þ¼­µåÀÇ ¸ñ·ÏÀ» Á¦°øÇÑ´Ù. ObjectÀÇ toStringÀÌ publicÀ̾ ÀçÁ¤ÀÇÇÒ ¶§µµ ¹Ýµå½Ã publicÀ̾î¾ß ÇÑ´Ù. ÀÌÁ¦ printlnÀ¸·Î Human °´Ã¼¸¦ Ãâ·ÂÇϸé toString ¸Þ¼­µå°¡ ¸®ÅÏÇÏ´Â ³ªÀÌ¿Í À̸§ÀÌ Ãâ·ÂµÇ¾î ¾î¶² »ç¶÷ÀÎÁö ¹Ù·Î ¾Ë¾Æº¼ ¼ö ÀÖ´Ù.

´Ù¸¥ ¹®ÀÚ¿­¿¡ + ¿¬»êÀÚ·Î ¿¬°áÇÒ ¶§µµ toString ¸Þ¼­µå°¡ È£ÃâµÇ¾î µÚÂÊ¿¡ µ¡ºÙ¿©Áø´Ù. °­Á¦ÀûÀÎ »çÇ×Àº ¾Æ´ÏÁö¸¸ toString ¸Þ¼­µå¸¦ Àß Á¤ÀÇÇØ ³õÀ¸¸é µð¹ö±ëÀ̳ª ·Î±× Á¤º¸ ±â·Ï½Ã¿¡ À¯¿ëÇÏ°Ô »ç¿ëµÇ¹Ç·Î Ŭ·¡½º Ư¼º¿¡ ¸Â°Ô ÀçÁ¤ÀÇÇØ µÎ´Â °ÍÀÌ ÁÁ´Ù.

¹è¿­, File, Date µîÀÇ Ç¥ÁØ Å¬·¡½º´Â toStringÀ» ÀûÀýÈ÷ ÀçÁ¤ÀÇÇÏ¿© ÀÚ½ÅÀÇ °ªÀ» ¹®ÀÚ¿­·Î Ãâ·ÂÇÏ´Â ±â´ÉÀ» Á¦°øÇÑ´Ù. ±×·¡¼­ º°µµÀÇ º¯È¯À» ÇÏÁö ¾Ê´õ¶óµµ È­¸éÀ̳ª ÆÄÀÏ·Î Ãâ·ÂÇÏ¸é ´ëÃæÀÇ Á¤º¸¸¦ Áï½Ã È®ÀÎÇÒ ¼ö ÀÖ´Ù.

15-1-3.equals

±âº»Çü³¢¸® »óµî¼ºÀ» ºñ±³ÇÒ ¶§´Â == ¿¬»êÀÚ¸¦ »ç¿ëÇÏ¸ç °ªÀÌ °°À¸¸é true¸¦ ¸®ÅÏÇÑ´Ù. ¹Ý¸é °´Ã¼¿¡ ´ëÇؼ­´Â °ªÀÌ ¾Æ´Ñ ÂüÁ¶°¡ °°ÀºÁö¸¸ º»´Ù. µÎ °´Ã¼°¡ °°Àº ´ë»óÀ» °¡¸®Å³ ¶§ true¸¦ ¸®ÅÏÇÏ¸ç ¼³»ç ³»¿ëÀÌ ¿ÏÀüÈ÷ °°¾Æµµ ÂüÁ¶°¡ ´Ù¸£¸é ´Ù¸¥ °´Ã¼·Î ÆǺ°ÇÑ´Ù. Ŭ·¡½ºÀÇ ¾î¶² Çʵ尡 Áß¿äÇÑÁö °áÁ¤ÇÒ ¼ö ¾ø°í ¸ðµç Çʵ带 ´Ù ºñ±³ÇØ º¼ ¼öµµ ¾ø±â ¶§¹®ÀÌ´Ù.

 

equals

class Human {

     int age;

     String name;

    

     Human(int age, String name) {

          this.age = age;

          this.name = name;

     }

}

 

class JavaTest {

     public static void main(String[] args) {

          Human kim = new Human(29, "±è»óÇü");

          Human lee = new Human(43, "À̽¿ì");

          Human kimcopy = kim;

          Human kim2 = new Human(29, "±è»óÇü");

         

          System.out.println("kim == lee : " + (kim == lee ? "°°´Ù":"´Ù¸£´Ù"));

          System.out.println("kim == kimcopy : " + (kim == kimcopy ? "°°´Ù":"´Ù¸£´Ù"));

          System.out.println("kim == kim2 : " + (kim == kim2 ? "°°´Ù":"´Ù¸£´Ù"));

     }

}

½ÇÇà°á°ú

kim == lee : ´Ù¸£´Ù

kim == kimcopy : °°´Ù

kim == kim2 : ´Ù¸£´Ù

 

 

Human ŸÀÔÀÇ °´Ã¼ ¿©·¯ °³¸¦ »ý¼ºÇÏ°í == ¿¬»êÀÚ·Î ºñ±³ÇÏ¿© °á°ú¸¦ Ãâ·ÂÇß´Ù. ÄÚµå¿Í Ãâ·Â °á°ú¸¦ Àß ºñ±³ÇØ º¸ÀÚ. kim°ú lee´Â ³ªÀ̵µ ´Ù¸£°í À̸§µµ ´Þ¶ó ´ç¿¬È÷ ´Ù¸¥ °´Ã¼ÀÌ´Ù. kimÀÇ »çº»ÀÎ kimcopy´Â kim°ú ¶È°°Àº ´ë»óÀ» °¡¸®Å°°í ÀÖ¾î °°Àº °´Ã¼·Î Æò°¡µÈ´Ù. ¿©±â±îÁö´Â ¾ÆÁÖ »ó½ÄÀûÀ̶ó ÀÌÇØÇϱ⠽±´Ù.

Á¦ÀÏ ÀÌ»óÇÑ °ÍÀº kim°ú kim2ÀÇ ºñ±³°á°úÀÌ´Ù. ³ªÀ̵µ °°°í À̸§µµ °°Áö¸¸ ÂüÁ¶ÇÏ´Â ½Çü°¡ ´Þ¶ó µÎ °´Ã¼´Â ´Ù¸£´Ù°í Æò°¡ÇÑ´Ù. == ¿¬»êÀÚ·Î °´Ã¼¸¦ ºñ±³ÇÏ¸é °¡¸®Å°´Â ´ë»óÀÌ °°ÀºÁö¸¸ º¸¸ç ³»¿ë±îÁö º¸Áö ¾Ê´Â´Ù. »ç½Ç == ¿¬»êÀÚ´Â ¾î¶² Çʵ尡 »ç¶÷ÀÇ ÁÖ¿ä Á¤º¸ÀÎÁöµµ ¸ð¸¥´Ù.

°´Ã¼³¢¸® ÂüÁ¶°¡ ¾Æ´Ñ ½ÇÁ¦ ³»¿ëÀ¸·Î ºñ±³ÇÒ ¼ö ÀÖ´Â º°µµÀÇ ¹æ¹ýÀÌ ÇÊ¿äÇѵ¥ ÀÌ°ÍÀÌ ¹Ù·Î equals ¸Þ¼­µåÀÌ´Ù. equals ¸Þ¼­µå´Â µÎ °´Ã¼ÀÇ ³»¿ëÀ» ºñ±³ÇÏ¿©(ÂüÁ¶¸¦ ºñ±³ÇÏ´Â°Ô ¾Æ´Ï¶ó) °°ÀºÁö Æò°¡ÇÑ´Ù. °´Ã¼³¢¸® ºñ±³ÇÒ ÀÏÀÌ ¸¹À¸¹Ç·Î Object¿¡ ÀÌ ¸Þ¼­µå°¡ ¹Ì¸® Æ÷ÇԵǾî ÀÖ´Ù. == ¿¬»êÀÚ ´ë½Å equals ¸Þ¼­µå·Î ºñ±³ÇØ º¸ÀÚ.

 

System.out.println("kim.equals(lee) : " + (kim.equals(lee) ? "°°´Ù":"´Ù¸£´Ù"));

System.out.println("kim.equals(kimcopy) : " + (kim.equals(kimcopy) ? "°°´Ù":"´Ù¸£´Ù"));

System.out.println("kim.equals(kim2) : " + (kim.equals(kim2) ? "°°´Ù":"´Ù¸£´Ù"));

 

ºñ±³ ¹æ¹ýÀ» ¹Ù²Ù¾úÁö¸¸ °á°ú´Â ¾Õ ¿¹Á¦¿Í °°´Ù. ÀÌ·¸°Ô µÇ´Â ÀÌÀ¯´Â Object Ŭ·¡½º¿¡ Æ÷ÇÔµÈ equals ¸Þ¼­µåÀÇ ±âº» µ¿ÀÛÀÌ ´ÙÀ½°ú °°ÀÌ Á¤ÀǵǾî ÀÖÀ¸¸ç »ç½Ç»ó == ¿¬»êÀÚ¿Í °°±â ¶§¹®ÀÌ´Ù.

 

public boolean equals(Object obj) {

     return (this == obj);

}

 

°´Ã¼¸¦ ºñ±³ÇÏ´Â ¹æ¹ýÀº Ŭ·¡½º¸¶´Ù °íÀ¯ÇØ Å¬·¡½º°¡ ½º½º·Î ºñ±³ÇÏ´Â ¹æ½ÄÀ» Á¤ÀÇÇØ¾ß Çϸç ÀÌ ¿ªÇÒÀ» ÇÏ´Â °ÍÀÌ ¹Ù·Î equals ¸Þ¼­µåÀÌ´Ù. Á¤È®ÇÑ ºñ±³¸¦ À§ÇØ Object·ÎºÎÅÍ »ó¼Ó¹ÞÀº equals ¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇÏ¿© °´Ã¼ÀÇ °íÀ¯¼ºÀ» °áÁ¤ÇÏ´Â Çʵ带 ºñ±³ÇØ¾ß ÇÑ´Ù.

 

humanequals

class Human {

     int age;

     String name;

    

     Human(int age, String name) {

          this.age = age;

          this.name = name;

     }

    

     public boolean equals(Object obj) {

          if (obj instanceof Human) {

              Human other = (Human)obj;

              return (age == other.age && name.equals(other.name));

          } else {

              return false;

          }

     }

}

 

class JavaTest {

     public static void main(String[] args) {

          Human kim = new Human(29, "±è»óÇü");

          Human lee = new Human(43, "À̽¿ì");

          Human kimcopy = kim;

          Human kim2 = new Human(29, "±è»óÇü");

         

          System.out.println("kim.equals(lee) : " + (kim.equals(lee) ? "°°´Ù":"´Ù¸£´Ù"));

          System.out.println("kim.equals(kimcopy) : " + (kim.equals(kimcopy) ? "°°´Ù":"´Ù¸£´Ù"));

          System.out.println("kim.equals(kim2) : " + (kim.equals(kim2) ? "°°´Ù":"´Ù¸£´Ù"));

     }

}

½ÇÇà°á°ú

kim.equals(lee) : ´Ù¸£´Ù

kim.equals(kimcopy) : °°´Ù

kim.equals(kim2) : °°´Ù

 

equals ¸Þ¼­µå´Â ºñ±³ ´ë»óÀ» obj Àμö·Î ¹Þ¾Æ ÀÚ±â ÀÚ½ÅÀÎ this¿Í ºñ±³ÇÑ °á°ú¸¦ ¸®ÅÏÇÑ´Ù. ºñ±³ ´ë»óÀº ´ç¿¬È÷ °°Àº ŸÀÔÀÇ °´Ã¼¿©¾ß Çϴµ¥ È£Ãâ¿ø¿¡¼­ ¾û¶×ÇÑ °´Ã¼¸¦ ³Ñ±æ ¼öµµ ÀÖ¾î instanceof ¿¬»êÀڷΠŸÀÔÀ» ¸ÕÀú üũÇÏ´Â ¹æ¾î Äڵ尡 ÇÊ¿äÇÏ´Ù. Human ŸÀÔÀÇ °´Ã¼°¡ ¾Æ´Ï¶ó¸é ´õ ºñ±³ÇÒ ÇÊ¿äµµ ¾øÀÌ false¸¦ ¸®ÅÏÇÑ´Ù.

ŸÀÔÀÌ ¸Â´Ù¸é obj¸¦ Human ŸÀÔÀ¸·Î ij½ºÆÃÇÑ ÈÄ À̸§°ú ³ªÀÌ Çʵ带 °¢°¢ ºñ±³ÇÏ¿© ±× °á°ú¸¦ ¸®ÅÏÇÑ´Ù. À̸§°ú ³ªÀÌ°¡ µÑ ´Ù ÀÏÄ¡ÇÏ¸é °°Àº °´Ã¼ÀÌ¸ç µÑ Áß Çϳª¶óµµ ´Ù¸£¸é °°Àº °´Ã¼°¡ ¾Æ´Ï´Ù. equals¸¦ ÀçÁ¤ÀÇÇÑ ÈÄ ½ÇÇàÇØ º¸¸é kim°ú kim2°¡ °°Àº °´Ã¼·Î Æò°¡µÈ´Ù.

¾î¶² Çʵ带 ºñ±³ÇÒ °ÍÀΰ¡´Â Ŭ·¡½º¸¶´Ù ´Ù¸£´Ù. À̸§°ú ³ªÀ̸¸À¸·Î µ¿¸íÀÌÀÎÀ» ±¸ºÐÇÒ ¼ö ¾ø¾î °¡±ÞÀû ¸¹Àº Çʵ带 ºñ±³ÇÏ´Â °ÍÀÌ Á¤È®ÇÏ´Ù. Human Ŭ·¡½º¿¡ ¼ºº°, Ç÷¾×Çü, Å° µûÀ§ÀÇ Á¤º¸°¡ ÀÖ´Ù¸é ´Ù ºñ±³ÇØ ºÁ¾ß Á¤È®ÇÏ´Ù.

Ŭ·¡½º¸¶´Ù ÇÊµå ¸ñ·ÏÀÌ °íÀ¯ÇÏ°í »óµî¼ºÀ» ºñ±³ÇÏ´Â ¹æ¹ýÀÌ ´Þ¶ó equals ¸Þ¼­µåµµ Ŭ·¡½º¸¶´Ù °¢°¢ Á¤ÀÇÇØ¾ß ÇÑ´Ù. equals¿¡¼­ ¾î¶²½ÄÀ¸·Î »óµî¼ºÀ» ºñ±³ÇÒ °ÍÀΰ¡´Â Ŭ·¡½ºÀÇ ±¸Á¶¿Í ÇÊµå ¸ñ·Ï¿¡ µû¶ó ÀÚÀ¯·Ó°Ô ¼±ÅÃÇÒ ¼ö ÀÖµÇ ÃÖ¼ÒÇÑ ¼öÇÐÀû º¸Æí¼ºÀº ¸¸Á·ÇØ¾ß ÇÑ´Ù.

 

l  ÀÚ±â ÀڽŰú ºñ±³ÇÒ ¶§´Â Ç×»ó trueÀÌ´Ù. a.equals(a)´Â ¾ðÁ¦³ª true¸¦ ¸®ÅÏÇØ¾ß ÇÑ´Ù.

l  ±³È¯ ºñ±³ °á°ú°¡ °°¾Æ¾ß ÇÑ´Ù. a.equals(b)´Â b.equals(a)¿Í °°´Ù.

l  ºñ±³ °á°ú°¡ ÀÏ°üµÇ¾ß ÇÑ´Ù. a¿Í b¸¦ ¿©·¯ ¹ø ºñ±³Çصµ Ç×»ó °á°ú°¡ °°¾Æ¾ß ÇÑ´Ù.

l  ÀüÀ̼ºÀ» ¸¸Á·ÇØ¾ß ÇÑ´Ù. a¿Í b°¡ °°°í b¿Í c°¡ °°À¸¸é a¿Í cµµ ´ç¿¬È÷ °°´Ù.

l  null°ú ºñ±³Çϸé Ç×»ó false¸¦ ¸®ÅÏÇÑ´Ù.

 

»ó½ÄÀûÀ¸·Î ½±°Ô ÀÌÇصǴ ±ÔÄ¢ÀÌ´Ù. Á¤È®ÇÑ ºñ±³°¡ ÇÊ¿äÇÑ Å¬·¡½º´Â equals ¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇÏ°í ¹Ýµå½Ã equals ¸Þ¼­µå·Î ºñ±³ÇØ¾ß ÇÑ´Ù. String, Date µîÀÇ Å¬·¡½ºµµ ¸ðµÎ ³»¿ëÀ» ºñ±³Çϵµ·Ï ÀçÁ¤ÀǵǾî ÀÖ´Ù.

 

stringdate

class JavaTest {

     public static void main(String[] args) {

          String korea = "´ëÇѹα¹";

          String korea2 = new String("´ëÇѹα¹");

         

          System.out.println("== ºñ±³ : " + (korea == korea2 ? "°°´Ù":"´Ù¸£´Ù"));

          System.out.println("equals ºñ±³: " + (korea.equals(korea2) ? "°°´Ù":"´Ù¸£´Ù"));

     }

}

½ÇÇà°á°ú

== ºñ±³ : ´Ù¸£´Ù

equals ºñ±³: °°´Ù

 

µÎ °³ÀÇ ¹®ÀÚ¿­ korea¿Í korea2°¡ ¼±¾ðµÇ¾î ÀÖ°í ³»¿ëÀº °°´Ù. korea2¸¦ new ¿¬»êÀÚ·Î ÃʱâÈ­ÇÑ ÀÌÀ¯´Â ÄÄÆÄÀÏ·¯ÀÇ ÃÖÀûÈ­¸¦ ȸÇÇÇϱâ À§Çؼ­ÀÌ´Ù. ¸®ÅÍ·²·Î ÃʱâÈ­ÇÒ ½Ã °°Àº ¹®ÀÚ¿­¿¡ ´ëÇØ °°Àº ÂüÁ¶¸¦ ¸®ÅÏÇϵµ·Ï µÇ¾î Àִµ¥ korea2¸¦ °­Á¦·Î Èü¿¡ »ý¼ºÇϱâ À§ÇØ new ¿¬»êÀÚ¸¦ »ç¿ëÇß´Ù. ¾Æ¹¸µç ³»¿ëÀÌ °°Àº µÎ º¯¼ö¸¦ ¸¸µç ÈÄ == ¿¬»êÀÚ¿Í equals ¸Þ¼­µå·Î ºñ±³ÇØ º¸¾Ò´Ù.

korea¿Í korea2¸¦ ==·Î ºñ±³ÇÏ¸é ¸Þ¸ð¸®»óÀÇ À§Ä¡°¡ ´Þ¶ó °°Áö ¾Ê´Ù°í ³ª¿Â´Ù. ÀÌ¿¡ ºñÇØ equals·Î ºñ±³Çϸé À§Ä¡¿¡ »ó°ü¾øÀÌ ³»¿ëÀÌ °°¾Æ °°Àº °´Ã¼¶ó°í ³ª¿Â´Ù. ±×·¡¼­ ¹®ÀÚ¿­³¢¸® ºñ±³ÇÒ ¶§´Â == ¿¬»êÀÚ°¡ ¾Æ´Ñ equals ¸Þ¼­µå·Î ºñ±³ÇØ¾ß ÇÑ´Ù. Ãʺ¸ÀÚ¿¡°Ô´Â ´Ù¼Ò Çò°¥¸®´Â ³»¿ëÀÌ¸ç ¼÷·ÃÀÚµµ °¡²û Âø°¢ÇÏ´Â °æ¿ì°¡ ÀÖ´Ù. ¾Õ ¿¹Á¦¿¡¼­ name Çʵ带 ºñ±³ÇÒ ¶§µµ equals ¸Þ¼­µå¸¦ È£ÃâÇß´Ù.

°­Á¦ÀûÀÎ °ÍÀº ¾Æ´ÏÁö¸¸ equals¸¦ ÀçÁ¤ÀÇÇϸé hashCode ¸Þ¼­µåµµ °°ÀÌ ÀçÁ¤ÀÇÇÒ °ÍÀ» ±ÇÀåÇÑ´Ù. Çؽô °ªÀ» °Ë»öÇϴµ¥ »ç¿ëµÇ´Â Å°°ªÀÌ¸ç ³»¿ëÀÌ °°À¸¸é Çؽõµ °°¾Æ¾ß ÇÑ´Ù. ÀϹÝÀûÀÎ ¿ëµµÀÇ Å¬·¡½º¶ó¸é Çؽø¦ Á¤ÀÇÇÏÁö ¾Ê¾Æµµ º° »ó°ü¾øÁö¸¸ Çؽà Ä÷º¼Ç¿¡ ÀúÀåÇÒ ¶§´Â Çؽà Äڵ带 ¹Ýµå½Ã Á¤ÀÇÇØ¾ß ÇÑ´Ù.

15-1-4.getClass

getClass ¸Þ¼­µå´Â °´Ã¼ÀÇ Å¬·¡½º Á¤º¸¸¦ Á¶»çÇÏ´Â Class °´Ã¼¸¦ ¸®ÅÏÇÑ´Ù. Class °´Ã¼´Â ´ë»ó °´Ã¼ÀÇ Á¤º¸¸¦ ±¸ÇÏ´Â ´Ù¼öÀÇ ¸Þ¼­µå¸¦ Á¦°øÇÑ´Ù.

 

¸Þ¼­µå

¼³¸í

String getName()

Ŭ·¡½ºÀÇ À̸§À» Á¶»çÇÑ´Ù.

Field[] getDeclaredFields()

¼±¾ðµÈ ÇÊµå ¸ñ·ÏÀ» Á¶»çÇÑ´Ù.

Method[] getDeclaredMethods()

¼±¾ðµÈ ¸Þ¼­µå ¸ñ·ÏÀ» Á¶»çÇÑ´Ù.

Constructor<?>[] getConstructors()

»ý¼ºÀÚ ¸ñ·ÏÀ» Á¶»çÇÑ´Ù.

Class<?>[] getClasses()

Æ÷ÇÔµÈ Å¬·¡½º ¸ñ·ÏÀ» Á¶»çÇÑ´Ù.

Field[] getFields()

»ó¼Ó¹ÞÀº °ÍÀ» Æ÷ÇÔÇÏ¿© °ø°³µÈ ÇÊµå ¸ñ·ÏÀ» Á¶»çÇÑ´Ù.

Method[] getMethods()

»ó¼Ó¹ÞÀº °ÍÀ» Æ÷ÇÔÇÏ¿© °ø°³µÈ ¸Þ¼­µå ¸ñ·ÏÀ» Á¶»çÇÑ´Ù.

Class<? super T> getSuperclass()

½´ÆÛ Å¬·¡½º¿¡ ´ëÇÑ Á¤º¸¸¦ Á¶»çÇÑ´Ù.

boolean isEnum()

¿­°Å ŸÀÔÀÎÁö Á¶»çÇÑ´Ù.

boolean isInterface()

ÀÎÅÍÆäÀ̽ºÀÎÁö Á¶»çÇÑ´Ù.

boolean isPrimitive()

±âº» ŸÀÔÀÎÁö Á¶»çÇÑ´Ù.

 

Ŭ·¡½ºÀÇ À̸§Àº ¹°·ÐÀÌ°í ÇÊµå ¸ñ·Ï, ¸Þ¼­µå ¸ñ·ÏÀ» ÁË´Ù Á¶»çÇÒ ¼ö ÀÖ´Ù. ¶ÇÇÑ ½´ÆÛ Å¬·¡½º¸¦ Á¶»çÇÏ¿© »ó¼Ó °èÃþÀ» °Å½½·¯ ¿Ã¶ó°¡¸ç ¸ðµç ¼±Á¶¿¡ ´ëÇÑ ¸ñ·Ï±îÁö ¾Ë¾Æ³½´Ù. Class °´Ã¼¸¦ ÅëÇØ ¼Ò½º¿¡¼­ »ç¶÷ÀÌ ÀÐÀ» ¼ö ÀÖ´Â ¸ðµç Á¤º¸¸¦ ½ÇÇàÁß¿¡ Á¶»çÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ¿¹Á¦´Â ¼Ò½º¿¡¼­ ¼±¾ðÇÑ Human Ŭ·¡½ºÀÇ Á¤º¸¸¦ Class °´Ã¼¸¦ ÅëÇØ ½ÇÇàÁß¿¡ Á¶»çÇÏ¿© Ãâ·ÂÇÑ´Ù.

 

getclass

import java.lang.reflect.*;

 

class Human {

     int age;

     String name;

    

     Human(int age, String name) {

          this.age = age;

          this.name = name;

     }

    

     void intro() {

          System.out.println("¾È³ç, " + age + "»ì " + name + "ÀÔ´Ï´Ù.");

     }

}

 

class JavaTest {

     public static void main(String[] args) {

          Human kim = new Human(29, "±è»óÇü");

         

          Class cls = kim.getClass();

          System.out.println("Ŭ·¡½º À̸§ = " + cls.getName());

          System.out.println("½´ÆÛ Å¬·¡½º = " + cls.getSuperclass().getName());

 

          System.out.print("Çʵå : ");

          Field[] fields = cls.getDeclaredFields();

          for (Field F : fields) {

              System.out.print(F.getName() + " ");

          }

         

          System.out.println();

          System.out.print("¸Þ¼­µå : ");

          Method methods[] = cls.getDeclaredMethods();

          for (Method M : methods) {

              System.out.print(M.getName() + " ");

          }

     }

}

½ÇÇà°á°ú

Ŭ·¡½º À̸§ = Human

½´ÆÛ Å¬·¡½º = java.lang.Object

Çʵå : age name

¸Þ¼­µå : intro

 

Human °´Ã¼ kimÀ» ¼±¾ðÇØ ³õ°í kimÀÇ getClass ¸Þ¼­µå¸¦ È£ÃâÇÏ¿© cls °´Ã¼¸¦ ±¸Çß´Ù. °´Ã¼¸¦ »ý¼ºÇØ ³õÁö ¾Ê¾Ò´Ù¸é Ŭ·¡½º À̸§À¸·Î Class °´Ã¼¸¦ ±¸Çϴµ¥ Ŭ·¡½º¸í.class ¶ó´Â Ç¥Çö½ÄÀ» »ç¿ëÇÑ´Ù. ´ÙÀ½°ú °°ÀÌ Å¬·¡½º Á¤º¸¸¦ ±¸Çصµ °á°ú´Â µ¿ÀÏÇÏ´Ù.

 

Class cls = Human.class;

 

cls¸¦ ±¸ÇßÀ¸¸é ÀÌ °´Ã¼ÀÇ ¸Þ¼­µå¸¦ ÅëÇØ Å¬·¡½ºÀÇ ¸ðµç Á¤º¸¸¦ ³¹³¹ÀÌ Á¶»çÇÒ ¼ö ÀÖ´Ù. ´ëÇ¥ÀûÀÎ ¸î °¡Áö Á¤º¸¸¸ »Ì¾Æ ÄַܼΠÃâ·ÂÇߴµ¥ ¼Ò½º¿¡ ÀÖ´Â ¸íĪÀÌ ±×´ë·Î º¸ÀδÙ. Ŭ·¡½ºÀÇ À̸§À̳ª ¸â¹öÀÇ À̸§ °°Àº °ÍÀº ÄÄÆÄÀÏ Áß¿¡¸¸ »ç¿ëµÇ°í ÀÌÁø ÆÄÀÏ·Î ¹ø¿ªµÇ¸é ¾Ë¾Æ³¾ ¼ö ¾ø´Â °ÍÀÌ ÀϹÝÀûÀÌ´Ù.

¿¹¸¦ µé¾î int value = 5; ¶ó´Â ¼±¾ð¹®¿¡ ÀÇÇØ 5¶ó´Â °ªÀ» ½ÇÇàÁß¿¡ »ç¿ëÇÒ ¼ö ÀÖÁö¸¸ ±× °ªÀ» ÀúÀåÇÑ º¯¼ö À̸§ÀÌ value¿´´ÂÁö´Â º°·Î Áß¿äÇÏÁö ¾Ê´Ù. ÀÚ¹Ù´Â °¡»ó ¸Ó½ÅÀÌ Å¬·¡½º¸¦ ·ÎµåÇÒ ¶§ ¸ðµç Á¤º¸¸¦ °¡Áö´Â Class °´Ã¼¸¦ ¹Ì¸® »ý¼ºÇØ ³õ±â ¶§¹®¿¡ ÀÌ·± Á¤º¸¸¦ Á¶»çÇÒ ¼ö ÀÖ´Ù. ³×ÀÌƼºê ¾ð¾î¿¡¼­´Â ²Þµµ ²Ù±â ¾î·Á¿î ±â´ÉÀÌ´Ù.

C++µµ RTTI ±â´ÉÀ¸·Î ½ÇÇàÁß¿¡ Ŭ·¡½º Á¤º¸¸¦ Á¶»çÇÏ´Â ¹æ¹ýÀ» Á¦°øÇÏÁö¸¸ ¿É¼ÇÀ» ÄÑ¾ß »ç¿ëÇÒ ¼ö ÀÖ°í ¼º´É °¨¼Ò°¡ ½ÉÇÏ´Ù. C#Àº ¸®Ç÷º¼ÇÀ̶ó´Â À̸§À¸·Î Ŭ·¡½ºÀÇ Á¤º¸ Á¶»ç ±â´ÉÀ» Á¦°øÇÑ´Ù. ÀÚ¹Ùµµ ÀÌ ±â´ÉÀ» ¸®Ç÷º¼ÇÀ̶ó°í ºÎ¸¥´Ù. ¸®Ç÷º¼ÇÀº ÄÚµåÀÇ ½ÇÇຸ´Ù °ü¸®³ª À¯Áö¿¡ ÁÖ·Î »ç¿ëµÈ´Ù.

ÀÌŬ¸³½º´Â ¸®Ç÷º¼ÇÀ» ÅëÇØ °´Ã¼ÀÇ ¸â¹ö ¸ñ·Ï, ¸Þ¼­µåÀÇ Àμö ¸ñ·ÏÀ» ¾Ë¾Æ³»°í µµ¿ò¸»À» Á¦°øÇÑ´Ù. ¼Ò½ºÃ¢¿¡¼­ kim. ±îÁö¸¸ ÂïÀ¸¸é ¸â¹ö ¸ñ·ÏÀÌ ÁÂ¾Ç ³ª¿­µÇ´Âµ¥ ¸®Ç÷º¼Ç¿¡ ÀÇÇØ ½Ç½Ã°£ Á¶»çÇÑ Á¤º¸ÀÌ´Ù.

15-1-5.clone

ÂüÁ¶Çü º¯¼ö³¢¸® ´ëÀÔÇÏ¸é °°Àº ´ë»óÀ» °¡¸®Å°¸ç ÀÌ »óÅ¿¡¼­ »çº»À» º¯°æÇÏ¸é ¿øº»µµ °°ÀÌ ¹Ù²ï´Ù. ÀÌ·± Ư¼ºÀº ¾Õ¿¡¼­ ¿©·¯ ¹ø »ìÆ캸¾Ò´Âµ¥ µÎ ÂüÁ¶ º¯¼ö°¡ °°Àº ´ë»óÀ» °¡¸®Å°°í Àֱ⠶§¹®ÀÌ´Ù. ¿ÏÀüÈ÷ µ¶¸³ÀûÀÎ »çº»À» ¸¸µé ¶§´Â clone ¸Þ¼­µå¸¦ »ç¿ëÇϴµ¥ ÀÌ ¸Þ¼­µå´Â ¿ÏÀüÇÑ »çº»À» ¸¸µé¾î ±× º¹»çº»À» ¸®ÅÏÇÑ´Ù.

 

clone

½ÇÇà°á°ú

class JavaTest {

     public static void main(String[] args) {

          int[] ar = { 1, 2, 3, 4, 5 };

          int[] ar2 = ar.clone();

         

          ar2[0] = 1000;

         

          System.out.println("ar[0] : " + ar[0]);

          System.out.println("ar2[0] : " + ar2[0]);

     }

}

ar[0] : 1

ar2[0] : 1000

 

¹è¿­ÀÇ »çº»À» ¸¸µé±â À§ÇØ ´ëÀÔ ¿¬»êÀÚ ´ë½Å clone ¸Þ¼­µå¸¦ È£ÃâÇß´Ù. ÀÌÈÄ ar°ú ar2´Â ¿ÏÀüÈ÷ ºÐ¸®µÇ¾î ¼­·ÎÀÇ º¯°æ¿¡ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù. ar2[0]¿¡ ¹» ´ëÀÔÇÏ´õ¶óµµ ar[0]´Â ¿ø·¡°ªÀÎ 1À» À¯ÁöÇÑ´Ù. ar2 = ar; ¹®ÀåÀ¸·Î ´ëÀÔÇß´Ù¸é ÇÑÂÊÀ» ¹Ù²Ù¸é ´Ù¸¥Âʵµ °°ÀÌ ¹Ù²ï´Ù.

´ëÀÔ ¿¬»êÀÚ·Î ´ëÀÔÇßÀ» ¶§¿Í clone ¸Þ¼­µå·Î »çº»À» ¸¸µé¾úÀ» ¶§ÀÇ ¸Þ¸ð¸® ³»ºÎ ¸ð¾çÀ» ±×·Á º¸ÀÚ. ´ëÀÔÀº ÇϳªÀÇ ¹è¿­À» µÎ °³ÀÇ º¯¼ö°¡ °øÀ¯ÇÏÁö¸¸ »çº»À» ¶á °æ¿ì´Â °¢ÀÚÀÇ ¹è¿­À» µû·Î °¡Áø´Ù. ±×·¡¼­ »çº»À» º¯°æÇصµ ¿øº»ÀÌ ¿µÇâÀ» ¹ÞÁö ¾Ê´Â´Ù.

¹è¿­»Ó¸¸ ¾Æ´Ï¶ó Vector, ArrayList µîÀÇ Ä÷º¼Çµµ clone ¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇÏ¿© °°Àº ¹æ½ÄÀ¸·Î »çº»À» ¸¸µç´Ù. »ç¿ëÀÚ Á¤ÀÇ Å¬·¡½ºµµ »çº» Á¦ÀÛÀ» Áö¿øÇÏ·Á¸é clone ¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇÏ¿© ÀÚ½ÅÀÇ ¸â¹ö¸¦ º¹»çÇÏ´Â Äڵ带 ÀÛ¼ºÇÑ´Ù. Human Ŭ·¡½º¿¡ »çº»À» ÀÛ¼ºÇÏ´Â ±â´ÉÀ» Ãß°¡ÇØ º¸ÀÚ.

 

humanclone

½ÇÇà°á°ú

class Human {

     int age;

     String name;

    

     Human(int age, String name) {

          this.age = age;

          this.name = name;

     }

    

     public Object clone() {

          return new Human(age, name);

     }

}

 

class JavaTest {

     public static void main(String[] args) {

          Human kim = new Human(29, "±è»óÇü");

          Human kim2 = (Human)kim.clone();

 

          kim2.name = "À̼ø½Å";

         

          System.out.println("kim.name : " + kim.name);

          System.out.println("kim2.name : " + kim2.name);

     }

}

kim.name : ±è»óÇü

kim2.name : À̼ø½Å

 

HumanÀÇ clone ¸Þ¼­µå¿¡¼­ new ¿¬»êÀÚ·Î »õ·Î¿î Human °´Ã¼¸¦ ¸¸µéµÇ ÀÚ½ÅÀÇ age¿Í name °ªÀ» Àü´ÞÇÏ¿© ¶È°°Àº »çº»À» »ý¼ºÇÑ´Ù. »ý¼ºÀÚ°¡ Àß Á¤ÀǵǾî ÀÖ¾î new ¿¬»êÀÚ·Î »õ·Î¿î °´Ã¼¸¦ ¸¸µé±â¸¸ ÇÏ¸é µÈ´Ù. clone ¸Þ¼­µå´Â Object ŸÀÔÀ» ¸®ÅÏÇϹǷΠ¹Þ´Â ÂÊ¿¡¼­ ¿øÇϴ ŸÀÔÀ¸·Î ij½ºÆÃÇÏ¿© ´ëÀÔÇÑ´Ù.

kim2 °´Ã¼´Â kim°ú ¶È°°Àº °ªÀ» °¡Áö´Â »çº»ÀÌ¸ç º°µµÀÇ Èü¿¡ ºÐ¸®µÇ¾î ¼­·Î µ¶¸³ÀûÀÌ´Ù. »ç¶÷Àº Á¤º¸°¡ ¸¹Áö ¾Ê¾Æ º¹Á¦°¡ °£´ÜÇѵ¥ ´õ º¹ÀâÇÑ Å¬·¡½º´Â º¹»ç¿¡ ²À ÇÊ¿äÇÑ Çʵ常 Ãß·Á ³»°Å³ª ÇöÀç »óűîÁöµµ º¹Á¦Çϴ ó¸®°¡ ÇÊ¿äÇÏ´Ù. À§ ¿¹Á¦´Â °³³äÀû ÀÌÇظ¦ À§ÇØ ÀÛ¼ºÇÑ °ÍÀ̸ç Á¤È®ÇÏ°Ô´Â ´ÙÀ½°ú °°ÀÌ ±¸ÇöÇØ¾ß ÇÑ´Ù.

 

humanclone2

class Human implements Cloneable {

     int age;

     String name;

    

     Human(int age, String name) {

          this.age = age;

          this.name = name;

     }

    

     public Object clone() {

          try {

              return super.clone();

          }

          catch(CloneNotSupportedException e) {

              return null;

          }

     }

}

 

class JavaTest {

     public static void main(String[] args) {

          Human kim = new Human(29, "±è»óÇü");

          Human kim2 = (Human)kim.clone();

 

          kim2.name = "À̼ø½Å";

         

          System.out.println("kim.name : " + kim.name);

          System.out.println("kim2.name : " + kim2.name);

     }

}

 

¾Æ¹«³ª °´Ã¼ÀÇ »çº»À» ¶ß´Â °ÍÀº º¸¾È»ó À§ÇèÇÒ ¼ö ÀÖÀ¸´Ï Ŭ·¡½º Á¦ÀÛÀÚ°¡ »çº» ÀÛ¼ºÀ» Çã¿ëÇØ¾ß ÇÑ´Ù. »çº» ÀÛ¼ºÀÌ °¡´ÉÇÑ Å¬·¡½º¶ó´Â °ÍÀ» ºÐ¸íÈ÷ Ç¥½ÃÇϱâ À§ÇØ Cloneable ÀÎÅÍÆäÀ̽º¸¦ »ó¼Ó¹Þ¾Ò´Ù. ÀÌ ÀÎÅÍÆäÀ̽º´Â ºñ¾î ÀÖ°í ±¸ÇöÇÒ ¸Þ¼­µåµµ ¾øÁö¸¸ º¹Á¦¸¦ Çã¿ëÇÑ´Ù´Â °ÍÀ» ºÐ¸íÈ÷ ÇÑ´Ù. ObjectÀÇ clone ¸Þ¼­µå´Â Ŭ·¡½º°¡ Cloneable ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏÁö ¾ÊÀ¸¸é ¿¹¿Ü¸¦ ´øÁ® º¹Á¦¸¦ Çã¿ëÇÏÁö ¾Ê´Â´Ù. ³»ºÎ¿¡¼­´Â ¾Æ¸¶ ´ÙÀ½°ú °°Àº Á¶°Ç¹®À» »ç¿ëÇÒ °ÍÀÌ´Ù.

 

if (this instanceof Cloneable)

 

ÀÎÅÍÆäÀ̽º´Â ¸Þ¼­µå ¸ñ·ÏÀ» Á¦°øÇÏ´Â °ÍÀÌ ¿ø·¡ÀÇ ±â´ÉÀÌÁö¸¸ CloneableÀº ¸Þ¼­µå ¸ñ·Ïº¸´Ù´Â Ŭ·¡½ºÀÇ Æ¯¼ºÀ» ¹àÈ÷´Â ¿ªÇÒÀ» ÇÑ´Ù. ÀÎÅÍÆäÀ̽º »ó¼Ó°ú ½Ç½Ã°£ ŸÀÔ Á¶»ç ¹®¹ýÀÌ Àß ±¸ºñµÇ¾î ÀÖ¾î ÀÌ·± ¸ñÀûÀ¸·Îµµ ÀÎÅÍÆäÀ̽º¸¦ È°¿ëÇÒ ¼ö ÀÖ´Ù.

ÀçÁ¤ÀÇµÈ clone ¸Þ¼­µå¿¡¼­ superÀÇ cloneÀ» È£ÃâÇÏ¿© »çº»À» ÀÛ¼ºÇ쵂 ¿¹¿Ü°¡ ¹ß»ýÇÒ ¼ö ÀÖÀ¸¹Ç·Î try, catch¹®À¸·Î °¨½Ñ´Ù. ObjectÀÇ cloneÀº ÀÚ¹Ù Äڵ尡 ¾Æ´Ï¶ó ¿î¿µÃ¼Á¦ÀÇ Äڵ带 »ç¿ëÇÏ¿© ¸Þ¸ð¸®¸¦ ÇÒ´çÇÏ°í ¸â¹ö¸¦ º¹»çÇÏ´Â ÀÛ¾÷À» °í¼ÓÀ¸·Î ¼öÇàÇÑ´Ù. »ý¼ºÀÚ·Î °´Ã¼¸¦ Á÷Á¢ »ý¼ºÇÏ´Â °Íº¸´Ù ¿ùµîÈ÷ ºü¸£´Ù.

cloneÀÇ ±âº» ±¸ÇöÀº ¸â¹ö³¢¸® ÀÏ´ëÀÏ·Î ´ëÀÔÇϴµ¥ À̸¦ ¾èÀº º¹»ç(shallow copy)¶ó°í ÇÑ´Ù. ¸â¹öÀÇ °ªÀ» ±×´ë·Î º¹»çÇØ ¹ö¸®´Âµ¥ ±âº»ÇüÀº °ª º¹»ç·Î ¿ÏÀüÇÑ »çº»À» ¸¸µé ¼ö ÀÖÁö¸¸ ÂüÁ¶ÇüÀº ±×·¸Áö ¾Ê´Ù. Ŭ·¡½º ¾È¿¡ ±âº»°ª¸¸ ÀÖ´Ù¸é ¾èÀº º¹»ç·Îµµ »çº»À» ¸¸µé ¼ö ÀÖÁö¸¸ ÂüÁ¶Çü ¸â¹ö°¡ ÀÖ´Ù¸é ¹®Á¦°¡ ´Þ¶óÁø´Ù.

Human¾È¿¡ Notebook °´Ã¼³ª Car °´Ã¼°¡ ÀÖÀ» °æ¿ì ÂüÁ¶Çü ¸â¹öµµ º°µµÀÇ »çº»À» ¶°¾ß ÇÑ´Ù. °´Ã¼¸¦ ³Ö±â´Â ¹ø°Å·Ó°í ¼Ò½º°¡ ±æ¾îÁö¹Ç·Î °£´ÜÇÏ°Ô ¹è¿­À» ³Ö¾î º¸ÀÚ. score ¹è¿­Àº Å©±â 3ÀÇ Á¡¼ö°ªÀ» °¡Áö´Âµ¥ 1, 2, 3À¸·Î ÃʱâÈ­Çß´Ù.

 

deepclone

½ÇÇà°á°ú

class Human implements Cloneable {

     int age;

     String name;

     int[] score = new int[] { 1, 2, 3};

    

     Human(int age, String name) {

          this.age = age;

          this.name = name;

     }

    

     public Object clone() {

          try {

              return super.clone();

          }

          catch(CloneNotSupportedException e) {

              return null;

          }

     }

}

 

class JavaTest {

     public static void main(String[] args) {

          Human kim = new Human(29, "±è»óÇü");

          Human kim2 = (Human)kim.clone();

         

          kim2.score[0] = 999;

         

          System.out.println("kim.score[0] : " + kim.score[0]);

          System.out.println("kim2.score[0] : " + kim2.score[0]);

     }

}

kim.score[0] : 999

kim2.score[0] : 999

 

clone ¸Þ¼­µå´Â »çº»À» º¹»çÇϵµ·Ï Àß ÀÛ¼ºÇØ µÎ¾ú´Ù. main¿¡¼­ kim2 »çº»À» ¶ß°í kim2ÀÇ Á¡¼ö¸¦ º¯°æÇߴµ¥ ¿øº»ÀÎ kimÀÇ Á¡¼öµµ °°ÀÌ ¹Ù²ï´Ù. ÀÌ·¸°Ô µÇ´Â ÀÌÀ¯´Â °´Ã¼ÀÇ ¸â¹ö´Â °ªÀÌ º¹»çµÇÁö¸¸ score ¸â¹ö´Â ¿©ÀüÈ÷ °°Àº ÂüÁ¶¸¦ °¡¸®Å°°í Àֱ⠶§¹®ÀÌ´Ù.

¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é score ÂüÁ¶Çü ¸â¹ö¿¡ ´ëÇؼ­´Â º°µµÀÇ »çº»À» ¸¸µé¾î ¸Þ¸ð¸®¸¦ ¿ÏÀüÈ÷ ºÐ¸®ÇØ¾ß ÇÑ´Ù. clone ¸Þ¼­µå¸¸ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

deepclone2

½ÇÇà°á°ú

     ....

     public Object clone() {

          try {

              Human other = (Human)super.clone();

              other.score = this.score.clone();

              return other;

          }

          catch(CloneNotSupportedException e) {

              return null;

          }

     }

}

....

kim.score[0] : 1

kim2.score[0] : 999

 

°´Ã¼ÀÇ »çº»À» ¸ÕÀú ¶ß°í score ¸â¹ö¿¡ ´ëÇØ º°µµÀÇ ¹è¿­À» ´õ ¸¸µé¾ú´Ù. ÀÌ·¸°Ô »çº»À» ¶ß¸é ¸Þ¸ð¸®¿¡´Â ´ÙÀ½°ú °°ÀÌ µÎ °´Ã¼°¡ ¿ÏÀüÈ÷ ºÐ¸®µÈ´Ù. ÀÌÁ¦ main¿¡¼­ kim2ÀÇ Á¡¼ö¸¦ Á¶ÀÛÇصµ ¿øº»ÀÇ Á¡¼ö´Â º¯È­ ¾ø´Ù.

¹è¿­À̳ª °´Ã¼´Â ¿ÏÀüÇÑ »çº»À» ¸¸µé¾î¾ß Çϴµ¥ ºñÇØ ¹®ÀÚ¿­Àº ÂüÁ¶ÇüÀÌÁö¸¸ °ª¸¸ º¹»çÇصµ »çº»ÀÌ Àß ¸¸µé¾îÁø´Ù. À§ ¿¹Á¦¿¡¼­ name Çʵå´Â ¾èÀº º¹»ç¸¦ ÇßÁö¸¸ »çº»ÀÌ Àß ¸¸µé¾îÁö´Âµ¥ ÀÌ´Â ¹®ÀÚ¿­ÀÌ º¯°æµÇ´Â Áï½Ã º°µµÀÇ »çº»À» ¸¸µéµµ·Ï ½Ã½ºÅÛÀÌ Æ¯º°È÷ Áö¿øÇϱ⠶§¹®ÀÌ´Ù.

15-1-6.finalize

new ¿¬»êÀÚ·Î »ý¼ºÇÑ °´Ã¼´Â Èü¿¡ »ý¼ºµÈ´Ù. ¸Þ¸ð¸®°¡ ¹«ÇÑÇÏÁö ¾Ê¾Æ ´Ù »ç¿ëÇÑ °´Ã¼´Â Á¦°ÅÇØ¾ß Çϴµ¥ °¡ºñÁö Ä÷ºÅÍ°¡ ÁÖ±âÀûÀ¸·Î ¹Ì»ç¿ë °´Ã¼¸¦ ã¾Æ ¸Þ¸ð¸®¸¦ ȸ¼öÇϱ⠶§¹®¿¡ ÀÚ¹Ù¿¡´Â °´Ã¼¸¦ »èÁ¦ÇÏ´Â º°µµÀÇ ¸í·ÉÀÌ ¾ø´Ù. ¸Þ¸ð¸® ȸ¼ö°¡ ÀÚµ¿À¸·Î ¼öÇàµÇ¾î ¸Þ¸ð¸® ´©¼ö¸¦ °ÆÁ¤ÇÒ ÇÊ¿ä°¡ ¾øÀ¸¸ç °´Ã¼¸¦ »ý¼ºÇؼ­ »ç¿ëÇϱ⸸ ÇÏ¸é µÈ´Ù.

°¡ºñÁö Ä÷ºÅÍ ±â´ÉÀÌ ¾ø´Â ´Ù¸¥ ¾ð¾î °³¹ßÀÚ ÀÔÀå¿¡¼­´Â ¹«Ã´ ºÎ·¯¿î ±â´ÉÀÌ´Ù. ±×·¯³ª ¾²·¹±â ¼öÁý ±â´ÉÀº ¸Þ¸ð¸®¿¡¸¸ ±¹ÇÑµÇ¸ç ±× ¿ÜÀÇ ÀÚ¿øÀº ¼öÀÛ¾÷À¸·Î ÇØÁ¦ÇØ¾ß ÇÑ´Ù. ¿¹¸¦ µé¾î ³×Æ®¿÷¿¡ ¿¬°áÇÏ¿© Åë½ÅÇϴ Ŭ·¡½º¶ó¸é ¿¬°áÇÏ´Â µ¿ÀÛ°ú ¿¬°áÀ» ²÷´Â µ¿ÀÛÀÌ ÇÊ¿äÇÏ´Ù.

 

finalize

½ÇÇà°á°ú

class Network {

     void connect() {

          System.out.println("¿¬°áµÇ¾ú½À´Ï´Ù.");

     }

    

     void disconnect() {

          System.out.println("¿¬°áÀÌ ²÷¾îÁ³½À´Ï´Ù.");

     }

}

 

class JavaTest {

     public static void main(String[] args) {

          communication();

     }

    

     static void communication() {

          Network net = new Network();

          net.connect();

          // ³×Æ®¿÷ Åë½Å

          net.disconnect();

     }

}

¿¬°áµÇ¾ú½À´Ï´Ù.

¿¬°áÀÌ ²÷¾îÁ³½À´Ï´Ù.

 

communication ¸Þ¼­µå¿¡¼­ Network °´Ã¼¸¦ »ý¼ºÇÏ°í ¿¬°á ¹× ÇØÁ¦Çß´Ù. net °´Ã¼´Â communication ¸Þ¼­µåÀÇ Áö¿ªº¯¼ö¿©¼­ ÀÌ ¸Þ¼­µå°¡ Á¾·áµÉ ¶§ »ç¶óÁø´Ù. °´Ã¼°¡ ¾ø¾îÁö¸é ´õ ÀÌ»ó Åë½ÅÇÒ ¼ö ¾øÀ¸´Ï ¸®ÅÏÇϱâ Àü¿¡ ¿¬°áÀ» ²÷´Â °ÍÀÌ ´ç¿¬ÇÏ´Ù.

disconnect ¸Þ¼­µå È£ÃâÀ» ±ô¹Ú Àؾú°Å³ª ¿¹¿Ü°¡ ¹ß»ýÇؼ­ ÀÌ ¸Þ¼­µå°¡ È£ÃâµÇÁö ¾ÊÀ¸¸é ¾î¶»°Ô µÉ±î? net °´Ã¼ ÀÚü´Â °¡ºñÁö Ä÷ºÅÍ¿¡ ÀÇÇØ È¸¼öµÇÁö¸¸ ¿¬°áµÈ Åë½ÅÀº ¾Æ¹«µµ ²÷¾îÁÖÁö ¾Ê¾Æ °è¼Ó ¿¬°áµÈ ä·Î ³²¾Æ Àִ´Ù. ±×·¡¼­ ¸Þ¸ð¸® ȸ¼ö¿Í´Â º°µµ·Î Ãß°¡ Á¤¸® Äڵ尡 ÇÊ¿äÇÏ´Ù.

ObjectÀÇ finalize ¸Þ¼­µå´Â °´Ã¼°¡ »ç¶óÁú ¶§ È£ÃâµÇ¸ç µÞÁ¤¸®¸¦ ¼öÇàÇÑ´Ù. ¸Þ¸ð¸® °ü·Ã Á¤¸®´Â ÇÒ ÇÊ¿ä°¡ ¾øÁö¸¸ Åë½Å ¿¬°á, ±ÇÇÑ È¹µæ, DB ¿ÀÇ µîÀÇ Áغñ ÀÛ¾÷À» Çß´Ù¸é °´Ã¼°¡ »ç¶óÁö±â Àü¿¡ Á¤¸®ÇØ¾ß ÇÑ´Ù. ÀÌ·± Á¤¸® Äڵ带 ÀÛ¼ºÇÏ´Â °÷ÀÌ finalize ¸Þ¼­µåÀÌ´Ù.

 

finalize2

class Network {

     void connect() {

          System.out.println("¿¬°áµÇ¾ú½À´Ï´Ù.");

     }

    

     void disconnect() {

          System.out.println("¿¬°áÀÌ ²÷¾îÁ³½À´Ï´Ù.");

     }

    

     protected void finalize() throws Throwable {

          super.finalize();

          disconnect();

     }

}

 

class JavaTest {

     public static void main(String[] args) {

          communication();

          System.gc();

          System.runFinalization();

     }

    

     static void communication() {

          Network net = new Network();

          net.connect();

     }

}

 

finalize ¸Þ¼­µå¸¦ ÀçÁ¤ÀÇÇÏ¿© disconnect ¸Þ¼­µå¸¦ È£ÃâÇß´Ù. finalize ¸Þ¼­µå´Â Äڵ忡¼­ È£ÃâÇÏ´Â °ÍÀÌ ¾Æ´Ï¸ç È£ÃâÇؼ­µµ ¾ÈµÈ´Ù. ½Ã½ºÅÛÀÌ Àû´çÇÑ ¶§¿¡ ¾Ë¾Æ¼­ È£ÃâÇϱ⠶§¹®¿¡ publicÀÏ ÇÊ¿ä°¡ ¾øÀ¸¸ç protected ¾×¼¼½º ÁöÁ¤À» ÁÖ¾î¾ß ÇÑ´Ù. ÀÚ½ÅÀÇ ÀÚ¿øÀ» Á¤¸®Çϱâ Àü¿¡ ºÎ¸ðÀÇ finalize¸¦ È£ÃâÇÏ¿© ºÎ¸ðÀÇ ÀÚ¿øºÎÅÍ Á¤¸®ÇÏ´Â °ÍÀÌ ¿øÄ¢ÀÌ´Ù.

Á¤¸® Äڵ带 ÀÛ¼ºÇØ µÎ¾úÀ¸´Ï °´Ã¼°¡ Á¦°ÅµÉ ¶§ ¿¬°áµµ ÀÚµ¿À¸·Î ²÷¾îÁú °ÍÀÌ´Ù. ±×·¯³ª finalize ¸Þ¼­µå¸¦ ÀÛ¼ºÇß´Ù°í Çؼ­ Äڵ尡 Áï½Ã ½ÇÇàµÇ´Â °ÍÀº ¾Æ´Ï´Ù. °¡ºñÁö Ä÷ºÅÍÀÇ È£Ãâ ½ÃÁ¡Àº °¡»ó ¸Ó½ÅÀÌ °áÁ¤Çϸç ÇÑ°¡ÇÒ ¶§ Á¤¸®ÇÑ´Ù. ÀÌ ¸Þ¼­µå°¡ È£ÃâµÇ´Â »óȲÀ» È®ÀÎÇØ º¸·Á¸é System.gc ¸Þ¼­µå¸¦ È£ÃâÇÏ¿© °­Á¦·Î ¾²·¹±â ¼öÁýÀ» Áö½ÃÇØ¾ß ÇÑ´Ù.

¾²·¹±â ¼öÁýÀ» °­Á¦ Áö½ÃÇÏ¸é °´Ã¼´Â Áï½Ã Á¦°ÅµÈ´Ù. ±×·¯³ª °­Á¦·Î ¼öÁýÇ϶ó°í Çصµ finalize ¸Þ¼­µå°¡ ¹Ù·Î È£ÃâµÈ´Ù´Â º¸ÀåÀº ¾øÀ¸¸ç ¿©·¯ °¡Áö ³»ºÎÀûÀÎ »çÁ¤¿¡ ÀÇÇØ À¯º¸µÇ°Å³ª ¿¬±âµÉ ¼öµµ ÀÖ´Ù. Áï½Ã ÀÚ¿øÀ» Á¤¸®ÇÏ·Á¸é runFinalization ¸Þ¼­µåµµ °°ÀÌ È£ÃâÇØ¾ß ÇÑ´Ù. communication ¸Þ¼­µå¿¡¼­ disconnect ¸Þ¼­µå¸¦ È£ÃâÇÏÁö ¾ÊÁö¸¸ Á¤»óÀûÀ¸·Î ¿¬°áÀÌ Àß ²÷¾îÁø´Ù.

ÀÚ¹Ù´Â ¸Þ¸ð¸® °ü¸® ±â´ÉÀÌ ÈǸ¢ÇÏ°í ½Å·Ú¼ºÀÌ ³ô¾Æ Æí¸®ÇÏ´Ù. ºñ¸Þ¸ð¸® °ü·Ã Á¤¸®´Â µ¿±âÀûÀ¸·Î ¼öÇàÇÒ ÇÊ¿ä°¡ ÀÖ¾î ¾ðÁ¦ È£ÃâµÉÁöµµ ¸ð¸£´Â finalize ¸Þ¼­µå¸¦ »ç¿ëÇÏ´Â °æ¿ì´Â µå¹°´Ù. À§ ¿¹Á¦´Â µ¿ÀÛ ¹æ½ÄÀ» º¸À̱â À§ÇØ ÀǵµÀûÀ¸·Î ÀÛ¼ºÇÑ °ÍÀÏ »Ó ½ÇÁ¦ ÇÁ·ÎÁ§Æ®¿¡¼­´Â ¸í½ÃÀûÀÎ ÀÚ¿ø Á¤¸® ¸Þ¼­µå¸¦ ¸¸µé°í ¿¹¿Ü ó¸® ±¸¹® µîÀ» ÅëÇØ Àû±ØÀûÀ¸·Î Á¤¸®ÇÏ´Â ¹æ½ÄÀÌ ¹Ù¶÷Á÷ÇÏ´Ù.