Á¦³×¸¯ÀÇ Çü½Ä ŸÀÔ Àμö 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·Î
Àü´ÞµÉ ¼ö ÀÖ´Ù.
ºÎ¸ð ŸÀÔÀÇ °´Ã¼°¡ ÀÚ½Ä °´Ã¼¸¦ ´ëÀÔ¹ÞÀ» ¼ö ÀÖÀ¸¸ç ÀÌ´Â ´ÙÇü¼ºÀÇ ±Ù°£ÀÌ µÇ´Â Áß¿äÇÑ ¹®¹ýÀÌ´Ù. ÀÌ °ü°è¸¦ ¿¬±¸ÇØ º¸±â À§ÇØ Àͼ÷ÇÑ Å¬·¡½º¸¦ È°¿ëÇØ º¸ÀÚ.
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>´Â »ó¼Ó °ü°è°¡ ¾Æ´Ï´Ù.
Á¦³×¸¯ÀÇ ¼ºê ŸÀÔ °ü°è°¡ º¹ÀâÇÏ°í Á¦¾àÀÌ ¸¹¾Æ Á» ´õ À¯¿¬ÇÑ Å¸ÀÔÀÌ ÇÊ¿äÇÏ´Ù.
¿¹¸¦ µé¾î 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 µîÀÇ ¸Þ¼µå·Î ¹è¿ ÀÚü¸¸
Á¶ÀÛÇÑ´Ù¸é ¿ä¼ÒÀÇ Å¸ÀÔÀÌ ¹«¾ùÀÌ°Ç »ó°ü¾ø´Ù.