18-2.Á¦³×¸¯ÀÇ °èÃþ

18-2-1.¹Ù¿îµå ŸÀÔ

Á¦³×¸¯ÀÇ Çü½Ä ŸÀÔ Àμö T ÀÚ¸®¿¡´Â ÀÓÀÇÀÇ Å¸ÀÔÀÌ ¿Ã ¼ö ÀÖ´Ù. ±×·¯´Ù º¸´Ï ÀÌ Å¸ÀÔÀ» »ç¿ëÇÏ´Â ¸ðµç ÄÚµå´Â ÀÓÀÇÀÇ T ŸÀÔ¿¡ ´ëÇØ Àû¹ýÇØ¾ß ÇÑ´Ù. ´Ü Çϳª¶óµµ ƯÁ¤ÇÑ Å¸ÀÔÀ» °¡Á¤ÇÑ ÄÚµå´Â ÄÄÆÄÀÏÇÒ ¼ö ¾ø´Ù. ¾Õ¼­ ¿¹·Î µç ´ÙÀ½ ¸Þ¼­µå¸¦ º¸ÀÚ.

 

<T> T max(T a, T b) {

     if (a > b) {

          return a;

     } else {

          return b;

     }

}

 

Àμö·Î Àü´ÞµÈ µÎ °³ÀÇ °´Ã¼ a¿Í bÀÇ °ªÀ» ºñ±³ÇÏ¿© ´õ Å« °ªÀ» ã¾Æ ÁÖ´Â »ó½ÄÀûÀÎ ÄÚµåÀÌ´Ù. ÀÌ ÄÚµå´Â ¿¡·¯·Î 󸮵Ǵµ¥ ¿Ö³ÄÇϸé > ¿¬»êÀÚ°¡ ¸ðµç ŸÀÔ¿¡ ´ëÇØ À¯È¿ÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. Human ŸÀÔÀÇ °´Ã¼ kim°ú lee¸¦ »ý¼ºÇØ ³õ°í kim > lee·Î ºñ±³ÇÏ¸é °ú¿¬ ¾î¶² ±âÁØÀ¸·Î ºñ±³ÇÒÁö ¾Ö¸ÅÇÏ´Ù.

ÀÌ·± ¹®Á¦°¡ ¹ß»ýÇÏ´Â ÀÌÀ¯´Â T°¡ ÀÓÀÇÀÇ Å¬·¡½º¿©¼­ Àû¿ë ¹üÀ§°¡ ³Ê¹« ±¤¹üÀ§Çϱ⠶§¹®ÀÌ´Ù. ¸Þ¼­µåÀÇ º»Ã¼ Äڵ尡 ƯÁ¤ÇÑ Å¸ÀÔÀ̳ª ±× ¼­ºê ŸÀÔ¸¸À» ´ë»óÀ¸·Î ÇÒ ¶§´Â ŸÀÔ ÀμöÀÇ ¹üÀ§¸¦ Á¦ÇÑÇØ¾ß ÇÑ´Ù. »ç¿ëÇÒ ¼ö Àִ ŸÀÔÀÌ Á¦ÇÑµÈ Å¸ÀÔ Àμö¸¦ ¹Ù¿îµå ŸÀÔ(bound type)À̶ó°í ÇÏ¸ç ´ÙÀ½°ú °°Àº Çü½ÄÀ¸·Î ÁöÁ¤ÇÑ´Ù.

 

<T extends upper>

 

extends Å°¿öµå ´ÙÀ½¿¡ Á¦ÇÑÀ» µÑ Ŭ·¡½º³ª ÀÎÅÍÆäÀ̽º¸¦ ÁöÁ¤Çϸé ÁöÁ¤ÇÑ Å¸ÀÔÀ̳ª ±× ¼­ºê ŸÀÔ¸¸ ¿Ã ¼ö ÀÖ´Ù. Áï T extends upper¶ó´Â Ç¥Çö½ÄÀº upper¸¦ Æ÷ÇÔÇÑ ¼­ºêŬ·¡½º¸¸À» ÀǹÌÇÑ´Ù. upper°¡ ÀÎÅÍÆäÀ̽ºÀÎ °æ¿ì¶óµµ ¹Ù¿îµå ŸÀÔÀ» ÁöÁ¤ÇÒ ¶§´Â implements Å°¿öµå ´ë½Å extends Å°¿öµå¸¦ »ç¿ëÇÑ´Ù.

À§ÀÇ ¸Þ¼­µå¸¦ ¹Ù¿îµå ŸÀÔÀ¸·Î Á¦´ë·Î ÀÛ¼ºÇØ º¸ÀÚ. µÑ Áß Å« °ªÀ» °¡·Á ³»·Á¸é µÎ °ªÀ» ºñ±³ÇÒ ¼ö ÀÖ¾î¾ß ÇÏ¸ç ±×·¯±â À§Çؼ­´Â Comparable<T> ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇØ¾ß ÇÑ´Ù. ÀÌ ÀÎÅÍÆäÀ̽ºÀÇ compareTo ¸Þ¼­µå´Â µÎ °ªÀÇ ´ë¼Ò °ü°è¿¡ µû¶ó ¾ç¼ö³ª À½¼ö ¶Ç´Â 0À» ¸®ÅÏÇÏ¿© °ªÀÇ ´ë¼Ò¸¦ ÆÇ´ÜÇÑ´Ù.

 

comparable

½ÇÇà°á°ú

class JavaTest {

     static <T extends Comparable<T>> T max(T a, T b) {

          if (a.compareTo(b) > 0) {

              return a;

          } else {

              return b;

          }

     }

    

     public static void main(String[] args) {

          int result = JavaTest.max(1, 2);

          System.out.println(result);

     }

}

2

 

max ¸Þ¼­µåÀÇ Å¸ÀÔ Àμö·Î T´Â ¹Ýµå½Ã Comparable<T> ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÑ Å¸ÀÔÀ̾î¾ß ÇÑ´Ù. Á¦³×¸¯ ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ´Â Á¦³×¸¯ Ŭ·¡½º¸¦ ĪÇÏ´Ù º¸´Ï < > °ýÈ£°¡ ÁßøµÇ¾î ¹«Ã´ º¹ÀâÇØ º¸ÀδÙ. ½ÉÇϸé 3ÁßÀ¸·Î ÁßøµÇ±âµµ ÇØ °¡µ¶¼ºÀÌ ¶³¾îÁö°í ¾î·Æ´Ù.

º»Ã¼¿¡¼­´Â ¼öÄ¡Çü¸¸ ºñ±³ÇÏ´Â > ¿¬»êÀÚ ´ë½Å °´Ã¼¿¡ ´ëÇؼ­µµ ¾µ ¼ö ÀÖ´Â compareTo ¸Þ¼­µå·Î µÎ °´Ã¼ÀÇ ´ë¼Ò¸¦ ºñ±³ÇÑ´Ù. main¿¡¼­´Â 1°ú 2Áß Å« °ªÀ» ã¾Æ Ãâ·ÂÇϴµ¥ ¿ø·¡´Â ´ÙÀ½°ú °°ÀÌ ¸Þ¼­µå·Î Àü´ÞµÇ´Â ½Ç ŸÀÔ Àμö¸¦ ¹àÇô¾ß ÇÏÁö¸¸ Ãß·Ð °¡´ÉÇϹǷΠ»ý·«Çß´Ù.

 

int result = JavaTest.<Integer>max(1, 2);

 

Integer´Â ´ë¼Ò ºñ±³°¡ °¡´ÉÇÏ°í Comparable<T> ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇϹǷΠmax ¸Þ¼­µå·Î Àü´ÞÇÒ ¼ö ÀÖÀ¸¸ç ´ëºÎºÐÀÇ ¼öÄ¡Çü ŸÀÔÀº ÀÌ ÀÎÅÍÆäÀ̽º¸¦ Áö¿øÇÑ´Ù. DoubleÀ̳ª Float´Â ¹°·ÐÀÌ°í String °´Ã¼¿¡ ´ëÇؼ­µµ ÀÌ ¸Þ¼­µå¸¦ È£ÃâÇÒ ¼ö ÀÖ´Ù. ±×·¯³ª ´ÙÀ½ ÄÚµå´Â ¿¡·¯·Î 󸮵ȴÙ.

 

Human man = JavaTest.max(new Human(23, "¿¬¾Æ"), new Human(34, "ÅÂÈñ"));

 

Human Ŭ·¡½ºÀÇ °´Ã¼´Â ¼­·Î ´ë¼Ò¸¦ ºñ±³ÇÒ ¹æ¹ýÀÌ ¾ø±â ¶§¹®ÀÌ´Ù. HumanÀÌ Comparable<T> ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ¿© ³ªÀ̼øÀ¸·Î ºñ±³ÇÏ´Â ¸Þ¼­µå¸¦ Á¦°øÇÑ´Ù¸é ÀÌ Äڵ嵵 ÄÄÆÄÀÏ °¡´ÉÇÏ´Ù.

¹Ù¿îµå ŸÀÔÀ» »ç¿ëÇÏ¸é ½Ç Å¸ÀÔ Àμö°¡ Á¦ÇѵǹǷΠÇã¿ëµÇ´Â ŸÀÔ¿¡ ´ëÇؼ­´Â ¸Þ¼­µå¸¦ ÀÚÀ¯·Ó°Ô È£ÃâÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ Äڵ带 º¸ÀÚ.

 

class Human {

     void intro() { System.out.println("³ª »ç¶÷"); }

}

 

class Student extends Human {

     void intro() { System.out.println("³ª Çлý"); }

}

 

class Box<T> {

     T value;

     Box(T value) { this.value = value; }

     T get() { return value; }

     void set(T value) { this.value = value; }

     void intro() {

          value.intro();

     }

}

 

»ç¶÷°ú Çлý Ŭ·¡½º°¡ ÀÖ°í ÀÌ °´Ã¼¸¦ ÀúÀåÇÏ´Â Box Á¦³×¸¯À» ¼±¾ðÇß´Ù. Box´Â »ç¶÷À̳ª ÇлýÀ» ÀúÀåÇÏ¸ç ¼Ò°³¸¦ Ãâ·ÂÇÏ´Â intro ¸Þ¼­µå¸¦ Á¤ÀÇÇÑ´Ù. ¾ð¶æ º¸±â¿¡´Â µÉ °Í °°Áö¸¸ value.intro() ±¸¹®ÀÌ ¿¡·¯·Î 󸮵ȴÙ.

¿Ö³ÄÇϸé BoxÀÇ Çü½Ä ŸÀÔ Àμö T´Â ¹Ù¿îµåµÇÁö ¾Ê¾Æ ÀÓÀÇÀÇ Å¸ÀÔÀÌ ¿Ã ¼ö Àִµ¥ ¸ðµç Ŭ·¡½º°¡ intro ¸Þ¼­µå¸¦ Áö¿øÇÏÁö ¾Ê±â ¶§¹®ÀÌ´Ù. ¹®Á¦¸¦ ÇØ°áÇÏ·Á¸é Box°¡ ¹Þ¾ÆµéÀ̴ ŸÀÔ Àμö T¸¦ intro ¸Þ¼­µå¸¦ Áö¿øÇϴ Ŭ·¡½º·Î Á¦ÇÑÇÑ´Ù.

 

bound

½ÇÇà°á°ú

class Human {

     void intro() { System.out.println("³ª »ç¶÷"); }

}

 

class Student extends Human {

     void intro() { System.out.println("³ª Çлý"); }

}

 

class Box<T extends Human> {

     T value;

     Box(T value) { this.value = value; }

     T get() { return value; }

     void set(T value) { this.value = value; }

     void intro() {

          value.intro();

     }

}

 

class JavaTest {

     public static void main(String[] args) {

          Human h = new Human();

          Box<Human> bh = new Box<Human>(h);

          bh.intro();

 

          Student s = new Student();

          Box<Human> bs = new Box<Human>(s);

          bs.intro();

     }

}

³ª »ç¶÷

³ª Çлý

 

Box°¡ ¹ÞÀ» ¼ö Àִ ŸÀÔÀ» Human ¼­ºê Ŭ·¡½º·Î Á¦ÇÑÇÔÀ¸·Î½á ÀÌ Å¬·¡½º ³»ºÎ¿¡¼­ TŸÀÔÀÇ intro ¸Þ¼­µå¸¦ ÀÌ»ó ¾øÀÌ È£ÃâÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½ ÄÚµå´Â ¿¡·¯ÀÌ´Ù. String Ŭ·¡½º´Â Human°ú´Â ¾Æ¹«·± ¿¬°üÀÌ ¾ø°í intro ¸Þ¼­µåµµ ¾ø¾î Box¿¡ ÀúÀåÇÒ ¼ö ¾ø´Ù.

 

Box<String> bs = new Box<String>("¹®ÀÚ¿­");

 

¹Ù¿îµå ŸÀÔÀº & ±âÈ£·Î ±¸ºÐÇÏ¿© ¿©·¯ Ŭ·¡½º³ª ÀÎÅÍÆäÀ̽º¿¡ ´ëÇØ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. ¿©·¯ °³ÀÇ ¹Ù¿îµå¸¦ ÁöÁ¤ÇÏ¸é ¸ñ·ÏÀÇ ¸ðµç ŸÀÔ¿¡ ´ëÇÑ ¼­ºê ŸÀÔ¸¸ Çã¿ëµÈ´Ù. º¸Åë Ŭ·¡½º Çϳª¿Í ÀÎÅÍÆäÀ̽º ¿©·¯ °³¸¦ ¹Ù¿îµå·Î ÁöÁ¤Çϴµ¥ Ŭ·¡½º°¡ ¸ñ·ÏÀÇ Á¦ÀÏ Ã³À½¿¡ ¿Í¾ß ÇÑ´Ù. A, B, C ¼¼ °³ÀÇ Å¸ÀÔÀ» ¹Ù¿îµå·Î ÁöÁ¤ÇÏ°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÑ´Ù.

 

<T extends A & B & C>

 

ÀÌ·¸°Ô µÇ¸é ¼¼ °¡Áö ŸÀÔÀ» ¸ðµÎ Áö¿øÇÏ´Â °æ¿ì·Î¸¸ Á¦ÇѵȴÙ. A Ŭ·¡½º ¶Ç´Â ±× ÈÄ¼Õ Å¬·¡½º°¡ B, C ÀÎÅÍÆäÀ̽º¸¦ Áö¿øÇؾ߸¸ T·Î Àü´ÞµÉ ¼ö ÀÖ´Ù.

18-2-2.¼­ºê ŸÀÔ

ºÎ¸ð ŸÀÔÀÇ °´Ã¼°¡ ÀÚ½Ä °´Ã¼¸¦ ´ëÀÔ¹ÞÀ» ¼ö ÀÖÀ¸¸ç ÀÌ´Â ´ÙÇü¼ºÀÇ ±Ù°£ÀÌ µÇ´Â Áß¿äÇÑ ¹®¹ýÀÌ´Ù. ÀÌ °ü°è¸¦ ¿¬±¸ÇØ º¸±â À§ÇØ Àͼ÷ÇÑ Å¬·¡½º¸¦ È°¿ëÇØ º¸ÀÚ.

 

Human h = new Human();

Student s = new Student();

h = s;

//s = h;

 

»ó¼Ó °ü°è¿¡ ÀÖ´Â Human°ú Student °´Ã¼¸¦ °¢°¢ »ý¼ºÇÑ »óÅ¿¡¼­ ºÎ¸ð ŸÀÔ º¯¼ö h¿¡ ÀÚ½Ä Å¸ÀÔ °´Ã¼ s¸¦ ´ëÀÔÇß´Ù. h·Î °¡´ÉÇÑ µ¿ÀÛÀº s·Î ¸ðµÎ °¡´ÉÇÏ¿© ÇÕ´çÇÑ ´ëÀÔÀÌ´Ù. ±×·¯³ª ¹Ý´ëÀÇ ´ëÀÔÀÎ s = h´Â s°¡ °¡´ÉÇÑ ¸ðµç µ¿ÀÛÀ» h°¡ ´Ù Áö¿øÇÏÁö ¾Ê¾Æ ºÒ°¡´ÉÇÏ´Ù. ¿©±â±îÁö´Â ÀÍÈ÷ Àß ¾Æ´Â ³»¿ëÀÌ´Ù. ±×·¸´Ù¸é Á¦³×¸¯ÀÇ °æ¿ì´Â ¾î¶³±î?

 

Human h = new Human();

Student s = new Student();

Box<Human> bh = new Box<Human>(s);

 

HumanÀ» ÀúÀåÇÏ´Â bh °´Ã¼¿¡ Student °´Ã¼ s¸¦ ÀúÀåÇß´Ù. Student°¡ HumanÀÇ ¼­ºê ŸÀÔÀ̹ǷΠÀÌ Äڵ嵵 ÇÕ´çÇÏ´Ù. Box<Human>Àº Human°ú ±× ¼­ºê ŸÀÔ °´Ã¼¸¦ ÀúÀåÇϱ⠶§¹®ÀÌ´Ù. ´Ü, ¼­ºê ŸÀÔ °´Ã¼¸¦ ´Ù½Ã ÀÐÀ» ¶§´Â ij½ºÆÃÀÌ ÇÊ¿äÇÏ´Ù.

 

Student kim = (Student)bh.get();

 

»ç½Ç »ý¼ºÀÚ¸¦ ÅëÇØ Çʵ忡 ´ëÀÔÇÏ´Â °ÍÀº °´Ã¼³¢¸® ´ëÀÔÇÏ´Â °Í°ú °°¾Æ »ó¼Ó °ü°èÀÇ °´Ã¼³¢¸® ´ëÀÔÇÏ´Â ÄÚµå¿Í ÇüŸ¸ ´Ù¸¦»Ó °°Àº ÄÚµå¶ó°í ÇÒ ¼ö ÀÖ´Ù. ´ÙÀ½Àº Á¦³×¸¯ ŸÀÔÀÇ °æ¿ì¸¦ º¸ÀÚ. ¿©±â¼­ºÎÅÍ´Â Á» º¹ÀâÇÏ°í Çò°¥¸°´Ù.

 

Human h = new Human();

Student s = new Student();

Box<Human> bh = new Box<Human>(h);

Box<Student> bs = new Box<Student>(s);

//bh = bs;

 

HumanÀ» ÀúÀåÇÏ´Â bh¿Í Student¸¦ ÀúÀåÇÏ´Â bs °´Ã¼¸¦ »ý¼ºÇØ ³õ°í bh¿¡ bs¸¦ ´ëÀÔÇß´Ù. ÀÌ ÄÚµå´Â Çã¶ôµÇÁö ¾Ê¾Æ ÄÄÆÄÀÏ ¿¡·¯·Î 󸮵ȴÙ. Human°ú Student´Â ºÎ¸ð ÀÚ½Ä °ü°èÀÌÁö¸¸ Box<Human>°ú Box<Student>ÀÇ °ü°è´Â ±×·¸Áö ¾Ê´Ù.

½Ç ŸÀÔ Àμö°¡ »ó¼Ó °ü°è¿©¼­ ¾ð¶æ »ý°¢Çϱ⿡´Â ºÎ¸ð ÀÚ½Ä °ü°è °°Áö¸¸ µÎ Ŭ·¡½º´Â ÀüÇô »ó°ü¾øÀ¸¸ç IS A °ü°è°¡ ¾Æ´Ï´Ù. ÀÌ°ÍÀÌ Á¦³×¸¯¿¡¼­ °¡Àå ÀÌÇØÇϱ⠾î·Á¿î ³»¿ëÀÌ¸ç ¿Ö ±×·±Áö ÀÌÀ¯¸¦ Á¤È®ÇÏ°Ô ÀÌÇØÇØ¾ß ÇÑ´Ù. bh = bs ´ëÀÔÀÌ °¡´ÉÇØÁø´Ù¸é ´ÙÀ½°ú °°Àº Äڵ带 ÀÛ¼ºÇÒ ¼ö ÀÖ´Ù.

 

bh.set(h);

Student k = bs.get();

 

bh °´Ã¼¿¡ Human °´Ã¼¸¦ ÀúÀåÇÏ´Â °ÍÀº ´ç¿¬È÷ °¡´ÉÇÏ´Ù. ±×·¯³ª bh°¡ ½ÇÁ¦·Î´Â bs¸¦ ´ëÀÔ¹Þ¾ÒÀ¸¹Ç·Î À̶§ÀÇ Human °´Ã¼´Â bs¿¡ ÀúÀåµÈ´Ù. ÀÌ »óÅ¿¡¼­ bs¿¡ ÀúÀåµÈ °´Ã¼¸¦ ²¨³½´Ù°í ÇØ º¸ÀÚ. bs´Â Box<Student> ŸÀÔÀ̹ǷΠ´õ º¼ °Íµµ ¾øÀÌ Student °´Ã¼°¡ ÀÐÇôÁö¸ç µû¶ó¼­ Student ŸÀÔÀÇ °´Ã¼ k·Î ´ëÀÔ¹Þ¾Ò´Ù.

±×·¯³ª ºÒÇàÈ÷µµ Student °´Ã¼¿¡ ÀúÀåµÈ °ÍÀº Human ŸÀÔÀÇ hÀÌ¸ç ¿©±â¼­ ij½ºÆà ¿¹¿Ü°¡ ¹ß»ýÇÏ°í ÇÁ·Î±×·¥Àº ´Ù¿îµÇ¾î ¹ö¸°´Ù. À§ÀÇ µÎ ÄÚµå´Â ³í¸®ÀûÀ¸·Î ¾Æ¹« ÀÌ»óÀÌ ¾øÁö¸¸ bh°¡ bs¸¦ ´ëÀÔ¹Þµµ·Ï Çã¶ôÇÑ bh = bs ´ëÀÔ¹®ÀÌ ¹®Á¦ÀÇ ¿øÀÎÀÌ´Ù. ÀÌ·± ÀÌÀ¯·Î Box<Human>°ú Box<Student>´Â IS A °ü°è°¡ ¾Æ´Ï¸ç extends Å°¿öµå·Î »ó¼ÓÀ» ¹ÞÀº °Íµµ ¾Æ´Ï´Ù.

Box°¡ ³Ê¹« ´Ü¼øÇؼ­ Àß ÀÌÇØ°¡ ¾ÈµÈ´Ù¸é ½ÇÁ¦ ÇÁ·ÎÁ§Æ®¿¡ »ç¿ëµÇ´Â Ä÷º¼ÇÀ¸·Î Å×½ºÆ®ÇØ º¸ÀÚ. ¾ÆÁÖ ´Ü¼øÇÏ°Ô ¸¸µé¾úÁö¸¸ »óȲÀÌ º¹ÀâÇϹǷΠÄڵ带 ÁÖÀÇ ±í°Ô ºÁ¾ß ÇÑ´Ù.

 

gensubtype

import java.util.ArrayList;

 

class Human { }

class Student extends Human { }

 

class JavaTest {

     public static void main(String[] args) {

          ArrayList<Human> ah = new ArrayList<Human>();

          ArrayList<Student> as = new ArrayList<Student>();

 

          ah.add(new Human());

          as.add(new Student());

          ah.add(new Student());

         

          //ah = as;

          ah.add(new Human());

          Student k = as.get(1);

     }

}

 

»ç¶÷ ¹è¿­ ah¿Í Çлý ¹è¿­ as¸¦ »ý¼ºÇÏ°í ah¿¡ °´Ã¼ 2°³, as¿¡ °´Ã¼ Çϳª¸¸ ÀúÀåÇß´Ù. ¿©±â¼­ ¼¼ ¹ø° Ãß°¡¹®Àº ah ¹è¿­¿¡ Student °´Ã¼¸¦ ÀúÀåÇߴµ¥ ¾Æ¹« ÀÌ»ó ¾øÀÌ Àß ÀúÀåµÈ´Ù. ¿Ö³ÄÇϸé Human°ú Student´Â »ó¼Ó °ü°èÀ̱⠶§¹®ÀÌ´Ù.

±×·¯³ª ah¿¡ as¸¦ ´ëÀÔÇÏ´Â °ÍÀº ¾ÈµÈ´Ù. ÀÌ ÄÚµåÀÇ ÁÖ¼®À» Á¦°ÅÇØ º¸¸é ´ÙÀ½°ú °°Àº ¿¡·¯ ¸Þ½ÃÁö°¡ Ãâ·ÂµÈ´Ù. ArrayList<Human>°ú ArrayList<Student>´Â »ó¼Ó °ü°è°¡ ¾Æ´Ï±â ¶§¹®ÀÌ´Ù.

 

Type mismatch: cannot convert from ArrayList<Student> to ArrayList<Human>

 

¸¸¾à ah = as ´ëÀÔ¹®ÀÌ Çã¶ôµÈ´Ù¸é ah¸¦ ÅëÇØ as¿¡ Human °´Ã¼¸¦ Ãß°¡ÇÒ ¼ö ÀÖÀ¸¸ç ÀÌ´Â Student¸¸ ÀúÀåÇÏ´Â ArrayList<Student> ŸÀÔ°ú ¸ÂÁö ¾Ê´Ù. ÀÌ·± ÀáÀçÀûÀÎ À§ÇèÀÌ Àֱ⠶§¹®¿¡ ´ëÀÔÀÌ ±ÝÁöµÇ¾î ÀÖ´Ù.

¿©±â±îÁö ¿¹Á¦¸¦ °çµé¿© »ó¼¼ÇÏ°Ô ¼³¸íÇßÁö¸¸ À¢¸¸Å­ Á¤½Å ÁýÁßÀ» ÇÏÁö ¾ÊÀ¸¸é Çò°¥¸®±â¸¸ ÇÑ´Ù. °á·ÐÀ» ¿ä¾àÇÏÀÚ¸é Child¿Í Parent°¡ »ó¼Ó °ü°è¶ó ÇÒÁö¶óµµ Generic<Child>¿Í Generic<Parent>´Â »ó¼Ó °ü°è°¡ ¾Æ´Ï´Ù.

18-2-3.¿ÍÀϵå Ä«µå

Á¦³×¸¯ÀÇ ¼­ºê ŸÀÔ °ü°è°¡ º¹ÀâÇÏ°í Á¦¾àÀÌ ¸¹¾Æ Á» ´õ À¯¿¬ÇÑ Å¸ÀÔÀÌ ÇÊ¿äÇÏ´Ù. ¿¹¸¦ µé¾î Box<Human>°ú Box<Student>´Â »ó¼Ó °ü°è°¡ ¾Æ´ÏÁö¸¸ ÀÌ µÑÀ» ¸ðµÎ ¹ÞÀ» ¼ö ÀÖ´Â ¸Þ¼­µå¸¦ ¼±¾ðÇÏ°í ½Í´Ù°í ÇÏÀÚ. ±×·¯·Á¸é BoxÀÇ ½Ç ŸÀÔ Àμö ÀÚ¸®¿¡ HumanÀ¸·ÎºÎÅÍ »ó¼ÓµÇ´Â ÀÓÀÇ Å¸ÀÔÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ÀÌ Ç¥ÇöÀº ´ÙÀ½°ú °°´Ù.

 

<? extends Human>

 

¿©±â¼­ ?°¡ ¿ÍÀϵå Ä«µåÀÌ¸ç ¾Ë ¼ö ¾ø´Â ÀÓÀÇÀÇ Å¸ÀÔÀ» ÀǹÌÇÑ´Ù. µÚÂÊ¿¡ extends HumanÀ¸·Î Á¦ÇѵǾúÀ¸¹Ç·Î HumanÀ¸·ÎºÎÅÍ ÆÄ»ýµÈ ÀÓÀÇÀÇ Å¸ÀÔÀ̶ó´Â ¶æÀÌ´Ù.

 

wildcard

½ÇÇà°á°ú

class Human {

     void intro() { System.out.println("³ª »ç¶÷"); }

}

 

class Student extends Human {

     void intro() { System.out.println("³ª Çлý"); }

}

 

class Box<T> {

     T value;

     Box(T value) { this.value = value; }

     T get() { return value; }

     void set(T value) { this.value = value; }

}

 

class JavaTest {

     static void printMan(Box<? extends Human> box) {

          box.get().intro();

     }

     public static void main(String[] args) {

          Human h = new Human();

          Box<Human> bh = new Box<Human>(h);

          printMan(bh);

 

          Student s = new Student();

          Box<Student> bs = new Box<Student>(s);

          printMan(bs);

     }

}

³ª »ç¶÷

³ª Çлý

 

¿¹Á¦ÀÇ printMan ¸Þ¼­µå´Â Human ¼­ºê ŸÀÔÀ» ÀúÀåÇÏ´Â Box °´Ã¼ box¸¦ ¹Þ´Â´Ù. ÀÌ Àμö·Î Box<Human>, Box<Student> µîÀ» ¸ðµÎ Àü´Þ¹ÞÀ» ¼ö ÀÖ´Ù. º»Ã¼¿¡¼­´Â ÀÌ ¹Ú½º¿¡ ÀúÀåµÈ °´Ã¼¸¦ ²¨³» intro ¸Þ¼­µå¸¦ È£ÃâÇÑ´Ù. Box¿¡ ÀúÀåµÈ °´Ã¼´Â HumanÀÇ ¼­ºê ŸÀÔÀ̹ǷΠintro ¸Þ¼­µå¸¦ ¾ÈÀüÇÏ°Ô È£ÃâÇÒ ¼ö ÀÖ´Ù.

ÀÌó·³ extends Å°¿öµå·Î ºÎ¸ð¸¦ Á¦ÇÑÇÏ´Â °ÍÀ» À§ÂÊ Á¦ÇÑ ¿ÍÀϵåÄ«µå(upper bounded wildcard)¶ó°í ÇÑ´Ù. ºÎ¸ð·ÎºÎÅÍ ÆÄ»ýµÈ ÀÓÀÇÀÇ Å¸ÀÔÀÌ ÀÌ ÀÚ¸®¿¡ ¿Ã ¼ö ÀÖ´Ù. ¹Ý´ë·Î ¾Æ·¡ÂÊ ÀÚ½ÄÀ» Á¦ÇÑÇÏ´Â °ÍÀ» ¾Æ·¡ÂÊ Á¦ÇÑ ¿ÍÀϵåÄ«µå(lower bounded wildcard)¶ó°í Çϴµ¥ ´ÙÀ½ Çü½ÄÀ¸·Î ÁöÁ¤ÇÑ´Ù.

 

<? super child>

 

child Ŭ·¡½ºÀÇ ¸ðµç ºÎ¸ð ŸÀÔÀÌ ÀÌ ÀÚ¸®¿¡ ¿Ã ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î Box<? super Student> ŸÀÔÀº Student ÀÚü´Â ¹°·ÐÀÌ°í ºÎ¸ð ŸÀÔÀÎ Human, Object µîµµ ÇØ´çµÈ´Ù. Student °´Ã¼¸¦ ´ëÀÔ¹ÞÀ» ¼ö ÀÖ´Â ¸ðµç ŸÀÔÀ» ´Ù Çã¿ëÇÑ´Ù´Â ¶æÀÌ´Ù.

¿ÍÀϵå Ä«µå¿¡ extends³ª super Å°¿öµå¸¦ ¾²Áö ¾Ê°í <?> ±âÈ£¸¸ »ç¿ëÇϸé Á¦ÇÑÀÌ ¾ø´Â ¿ÍÀϵåÄ«µå(unbounded wildcard)°¡ µÇ¸ç ¾Ë ¼ö ¾ø´Â ŸÀÔÀ» ÀǹÌÇÑ´Ù. <?> ÀÚ¸®¿¡ ÀÓÀÇÀÇ Å¸ÀÔÀ» Çã¿ëÇ쵂 ÀÌ·¸°Ô µÇ¸é ƯÁ¤ Ŭ·¡½ºÀÇ ¸Þ¼­µå´Â È£ÃâÇÏÁö ¸øÇÑ´Ù. printManÀ» ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇØ º¸ÀÚ.

 

static void printMan(Box<?> box) {

     box.get().intro();

}

 

inrto() ¸Þ¼­µå°¡ Á¸ÀçÇÏÁö ¾Ê´Â´Ù´Â ¿¡·¯ ¸Þ½ÃÁö°¡ Ãâ·ÂµÈ´Ù. ¾Ë ¼ö ¾ø´Â ? ŸÀÔ¿¡´Â intro ¸Þ¼­µå°¡  ¾ø´Ù. Á¦ÇÑ ¾ø´Â ¿ÍÀϵå Ä«µå´Â ObjectÀÇ ±â´É¸¸ »ç¿ëÇϰųª ŸÀÔ ÀμöÀÇ ±â´ÉÀ» ÀüÇô ÇÊ¿äÄ¡ ¾Ê´Â °æ¿ì¿¡ »ç¿ëµÈ´Ù. ¿¹¸¦ µé¾î ArrayList<?>·Î ¹Þ¾Æ size, clear µîÀÇ ¸Þ¼­µå·Î ¹è¿­ ÀÚü¸¸ Á¶ÀÛÇÑ´Ù¸é ¿ä¼ÒÀÇ Å¸ÀÔÀÌ ¹«¾ùÀÌ°Ç »ó°ü¾ø´Ù.