Å×Å©´ÏÄà Ä÷³-ÀÚ¹Ù
ÀÚ¹Ù Á¦³×¸¯½º
JDK 5.0Àº ¿À·§µ¿¾È º¯ÇÏÁö ¾Ê¾Ò´ø ÀÚ¹Ù ¾ð¾îÀÇ ±¸¹®¿¡ ÀûÁö ¾ÊÀº º¯È¸¦ °¡Á®¿Ô´Ù. ¾Ö³ÊÅ×À̼Ç, for each ¹®, varargs µîµµ ±¸¹® º¯È¿¡ ±â¿©ÇßÁö¸¸, °¡Àå ´«¿¡ ¶ç´Â º¯È´Â ¿ª½Ã Á¦³×¸¯½º¶ó°í Çؾ߰ڴÙ.
Á¦³×¸¯½º´Â C++ÀÇ ÅÛÇø´À» ±â¾ïÇÏ´Â ÇÁ·Î±×·¡¸Ó¿¡°Ô´Â Ä£¼÷ÇÒ ¼ö ÀÖ´Â ±¸¹®À» »ç¿ëÇÏÁö¸¸, Á¶±Ý ´õ µé¿©´Ùº¸¸é C++ÀÇ ÅÛÇø´°ú´Â ´Ù¸¥ Á¸Àç¶ó´Â °ÍÀ» ¾Ë°Ô µÈ´Ù.
ÀÚ¹ÙÀÇ Á¦³×¸¯½º´Â ¿©Å¸ ¾ð¾îÀÇ °Í°ú´Â »ó´çÈ÷ ´Ù¸¥ ¹æ½ÄÀ¸·Î ±¸ÇöµÇ¾î ÀÖ´Ù. µû¶ó¼, C++¿Í °°Àº ¾ð¾î¿¡¼ÀÇ »ç¿ë °æÇèÀ» °¡Áö°í ½±°Ô Á¢±ÙÇÏ·Á Çß´Ù°¡ ³¶Æи¦ º¼ ¼ö ÀÖ´Ù.
Á¦³×¸¯½º°¡ ³»°Ç ½½·Î°ÇÀº ´õ ¾ÈÀüÇÑ ÀÚ·áÇüÀÇ ¼¼»óÀÌ´Ù.
ÄÄÆÄÀÏ·¯°¡ Á»´õ ¼¼¹ÐÇÏ°Ô ÀÚ·áÇü °Ë»ç¸¦ Çؼ ¾ö¹ÐÇÏ°Ô Á¤ÀÇµÈ ÀÚ·áÇüÀ» »ç¿ëÇÏ´Â ¾ð¾î¸¦ ¸¸µç´Ù´Â °Ô Á¦³×¸¯½ºÀÇ ÇÙ½ÉÀÌ´Ù.
¿©±â¿¡¼´Â Á¦³×¸¯½º¿¡ ´ëÇÑ °³°ýÀû ¼Ò°³ºÎÅÍ ¸î °¡Áö »ç¿ë »óÀÇ ÁÖÀÇÁ¡±îÁö ´Ù·ïº¸°íÀÚ ÇÑ´Ù.
À±°æ±¸ yoonforh at gmail dot com
Ƽ¸Æ½º¼ÒÇÁÆ® ±â¼ú¿¬±¸¼Ò¿¡¼ BPM ÆÀÀ» À̲ø°í ÀÖ´Ù. ÀÌÀü¿¡´Â ÀÚ¹Ù ¿öµå ÇÁ·Î¼¼¼ °³¹ß, PCS HLR ½Ã½ºÅÛ °³¹ß µî¿¡ Âü¿©Çß´Ù. ±¹³» ÃÖÃÊ·Î ÀÚ¹Ù À¥ °Ô½ÃÆÇÀÎ ÀÚ¹Ù ¹¯°í ´äÇϱ⠰ԽÃÆÇÀ» ¿î¿µÇßÀ¸¸ç(1997), ÀÔ¹®¼ÀÎ Áö³ª¿Í ÇÔ²² ÇÏ´Â ÀÚ¹Ù 2(1999), º»°ÝÀûÀÎ ÀÚ¹Ù °³¹ßÀÚ¸¦ À§ÇÑ µÎ²¨¿î Ã¥ÀÎ ÀÚ¹Ù 2 SDK 1.4 ½ÃÀÛ ±×¸®°í ¿Ï¼º(2003) µîÀÇ Ã¥À» ÁýÇÊÇß´Ù. ±×¿Ü, ÇÁ·Î±×·¥ ¼¼°è ƯÁý ¾ÖÇø´ÀÇ Çâ±â(1996), ¸¶¼Ò ÁִϾî ÀÚ¹Ù À̾߱â(1999) µî ¿©·¯ Â÷·Ê ÀÚ¹Ù °ü·Ã ±â»ç¸¦ ±â°íÇÏ¿´´Ù. ±¹³» ¼ÒÇÁÆ®¿þ¾î »ê¾÷ÀÇ ¾î·Á¿î Çö½Ç ¼Ó¿¡¼ ¿À·¡µµ·Ï ÄÚ´õ·Î ³²°í ½Í´Ù´Â ¼Ò¹ÚÇÑ Èñ¸ÁÀ» °¡Áö°í ÀÖ´Ù.
°¡À̵å
¿î¿µÃ¼Á¦ | ÀÚ¹Ù 2 SDK 5.0ÆÇ ½ÇÇà °¡´É ȯ°æ
°³¹ßµµ±¸ | ÀÚ¹Ù 2 SDK 5.0ÆÇ
±âº»Áö½Ä | ÀÚ¹Ù 2¿¡ °üÇÑ ÀÏ¹Ý Áö½Ä
ÀÚ¹Ù¿¡ Á¦³×¸¯½º¸¦ µµÀÔÇϱâ À§ÇÑ ¿¬±¸´Â ÀÌ¹Ì 8³âÀüÀÎ 1996³âºÎÅͶó°í ÇÑ´Ù. ½ÇÁ¦·Î ÀÚ¹Ù¿¡ Á¦³×¸¯½º¸¦ µµÀÔÇÏ´Â ¸î °¡Áö ¹æ¾ÈµéÀÌ ³í¹®À¸·Î ³ª¿À±â ½ÃÀÛÇÑ °ÍÀÌ 1998³â ÃÊÀÓÀ» °¨¾ÈÇÏ¸é ¹«·Á 8³âÀÌ Áö³ ÈÄ¿¡¾ß JDK 5.0¿¡ Àü°Ý äÅõǾú´Ù´Â °ÍÀº ÀÌ°ÍÀÌ ¾ó¸¶³ª ¾î·Á¿î ÀÏÀ̾ú³ª ÇÏ´Â °ÍÀ» º¸¿©ÁØ´Ù.
ÀÚ¹ÙÀÇ ½ºÆåÀ» °áÁ¤Çϴ ǥÁØÈ ÀýÂ÷ÀÎ JSRÀ» º¸¸é, Á¦³×¸¯½º¸¦ ³íÀÇÇÏ´Â JSR 14°¡ Çü¼ºµÈ °ÍÀº 1999³âÀ̾ú´Ù. ÇÏÁö¸¸, ¾Æ½±°Ôµµ JDK 1.4°¡ ³ª¿Â ½ÃÁ¡À̾ú´ø 2002³â±îÁö Á¦³×¸¯½º¸¦ ÀÚ¹Ù¿¡ Àû¿ëÇÒ ¼ö°¡ ¾ø¾ú´Ù. Á¦³×¸¯½º¸¦ ¾î¶»°Ô ±¸ÇöÇÒ °ÍÀΰ¡¿¡¼ºÎÅÍ Á¦³×¸¯½º¸¦ µµÀÔÇÑ ¿µÇâÀ» ¾î¶»°Ô ÃÖ¼ÒÈÇÏ°í ±âÁ¸ JDK ¹öÀü°úÀÇ ¿ª¹æÇâ ȣȯ¼ºÀ» À¯ÁöÇÒ ¼ö ÀÖÀ» °ÍÀΰ¡ ÇÏ´Â À̽´¿¡ À̸£±â±îÁö Á¦³×¸¯½º´Â ±×¾ß¸»·Î ¶ß°Å¿î °¨ÀÚ¿´´ø °ÍÀÌ´Ù.
Á¶±Ý µÚ´ÊÀº °¨ÀÌ ÀÖ±ä ÇÏÁö¸¸, JDK 5.0ÀÌ Ãâ½ÃµÈ Áö±Ýµµ ¿©ÀüÈ÷ ´Ù¸¥ ¹æ½ÄÀÇ Á¦³×¸¯½º ±¸ÇöÀ» ¼±È£ÇÏ´Â ±×·ìµéÀÌ ÀÖÀ¸¸ç, ¡°Thinking In Java¡±·Î À¯¸íÇÑ ºê·ç½º ¿¡ÄÌÀº ¼¿îÇÑ °¨Á¤À» ÀÚ½ÅÀÇ ºí·Î±×¿¡¼ ¿©°ú¾øÀÌ µå·¯³»°í Àֱ⵵ ÇÏ´Ù.
¹°·Ð ÃßÈÄ JDK ¹öÀü¿¡¼ ´Ù¸¥ ¹æ½ÄÀÇ Á¦³×¸¯½º ±¸ÇöÀÌ Ã¤ÅõÇÁö ¾Ê´Â´Ù´Â º¸ÀåÀº ¾øÀ» °ÍÀÌ´Ù. ƯÈ÷ C#À̶ó´Â ¸¸¸¸ÂúÀº °æÀï »ó´ë¸¦ µÎ°Ô µÈ Çö½Ç¿¡¼´Â ´õ¿í ´õ ±×·¯ÇÏ´Ù. C#¿¡¼µµ ÃÖ±Ù Á¦³×¸¯½º°¡ äÅõǾúÀ¸¸ç ±× ±¸Çö ¹æ½ÄÀº ÀÚ¹Ù¿Í ¹Ý´ëÀ̸ç C++¿Í À¯»çÇÏ´Ù´Â Á¡¿¡¼ ÀÚ¹Ù¿Í C#ÀÇ Á¦³×¸¯½º ¼º°ø ¿©ºÎ°¡ ÁÖ¸ñÀ» ¹ÞÀ» °Í °°´Ù.
Á¦³×¸¯½º »ç¿ëÇϱâ¿Í ¸¸µé±â
Á¦³×¸¯½º »ç¿ëÇϱâ
ÀÚ¹Ù Á¦³×¸¯½º Ŭ·¡½ºµéÀº java.util ÆÐÅ°ÁöÀÇ Ä÷º¼Ç ¶óÀ̺귯¸® Ŭ·¡½ºµé°ú ¹ÐÁ¢ÇÑ °ü·ÃÀ» °¡Áö°í ÀÖ´Ù.
¾î¶»°Ô º¸¸é Ä÷º¼Ç ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ ¶§ Á»´õ ÀÚ·áÇü ¾ÈÁ¤¼ºÀ» º¸ÀåÇÒ ¹æ¹ýÀÌ ¾øÀ»±î ÇÏ´Â ¿ëµµ·Î ¸¸µç °ÍÀÌ ÀÚ¹Ù Á¦³×¸¯½º°¡ ¾Æ´Ò±î »ý°¢µÉ Á¤µµÀÌ´Ù.
ÀÚ¹Ù 5.0ÀÇ Ä÷º¼Ç ¶óÀ̺귯¸® Ŭ·¡½ºµéÀº ¸ðµÎ Á¦³×¸¯½º¸¦ »ç¿ëÇϵµ·Ï ´Ù½Ã Á¤ÀǵǾú´Ù. µû¶ó¼, Ä÷º¼Ç ¶óÀ̺귯¸®¸¦ »ç¿ëÇÒ ¶§ Á¦³×¸¯½º´Â ºÐ¸íÇÑ È¿¿ë¼ºÀ» º¸ÀδÙ.
<¸®½ºÆ® 1> UseCollection.java ¼Ò½º ÄÚµå
import java.util.*;
public class UseCollection {
public static void main(String[] args) {
List<String> slist = new ArrayList<String>(); // StringÀÇ ¸®½ºÆ®
slist.add("hello");
slist.add("generics");
for (Object o : slist) {
System.out.println("string value = " + o);
}
List<Integer> ilist = new ArrayList<Integer>(); // IntegerÀÇ ¸®½ºÆ®
ilist.add(1);
ilist.add(2);
for (Object o : ilist) {
System.out.println("integer value = " + o);
}
}
}
°£´ÜÇÑ ¼Ò½º ÄÚµåÀÌÁö¸¸ ÀÚ¹Ù 5.0À» óÀ½ Á¢ÇÏ´Â ÀÚ¹Ù ÇÁ·Î±×·¡¸Ó¶ó¸é ¸î °¡Áö ¾î»öÇÑ Á¡À» ¹ß°ßÇßÀ» °ÍÀÌ´Ù. Á¦³×¸¯½º ¿Ü¿¡ »ç¿ëµÈ µÎ °¡Áö »õ·Î¿î ÀÚ¹Ù ¾ð¾îÀÇ ±â´ÉÀº ¿ÀÅä¹Ú½Ì/¾ð¹Ú½Ì°ú foreach ½ºÅ¸ÀÏÀÇ for ¹Ýº¹¹®ÀÌ´Ù.
ilist.add(new Integer(1))°ú °°ÀÌ »ç¿ëÇÏÁö ¾Ê°í ilist.add(1)°ú °°ÀÌ »ç¿ëÇÑ °ÍÀº ÀÚ¹Ù 5.0¿¡ Ãß°¡µÈ ±âº» ÀÚ·áÇü°ú ÇØ´ç °´Ã¼ ÀÚ·áÇü°úÀÇ ¿ÀÅä¹Ú½Ì/¾ð¹Ú½Ì(autobox/unbox) ±â´ÉÀ» »ç¿ëÇÑ °ÍÀ¸·Î, ¿ÀÅä¹Ú½ÌÀ̶õ ÀÚ¹Ù ÄÄÆÄÀÏ·¯°¡ °´Ã¼¸¦ ¿ä±¸ÇÏ´Â °÷¿¡ ±âº» ÀÚ·áÇüÀÌ ´ëÀ﵃ °æ¿ì ÀÚµ¿À¸·Î ÇØ´çÇÏ´Â ±âº» ÀÚ·áÇüÀÇ ·¡ÆÛ °´Ã¼(wrapper object)·Î º¯È¯ÇØÁÖ´Â °ÍÀ» ¸»Çϸç, ¿ÀÅä¾ð¹Ú½ÌÀº ±× ¹Ý´ëÀÇ ÀÏÀ» ¶æÇÑ´Ù.
foreach ½ºÅ¸ÀÏÀÇ for ¹Ýº¹¹®Àº Ä÷º¼Ç Ŭ·¡½º¿¡¼ Iterator¸¦ »ç¿ëÇÏ´Â ¹øÀâÇÔÀ» ÀÚ¹Ù ÄÄÆÄÀÏ·¯°¡ ´ë½Å ¼öÇàÇØÁÖ´Â °³³äÀ¸·Î for ¹Ýº¹¹® Á¶°Ç½Ä °ýÈ£°¡ º¯¼ö¿Í ¡®:¡¯ ºÎÈ£ ±×¸®°í Ä÷º¼Ç °´Ã¼·Î ¼±¾ðµÉ °æ¿ì ÁöÁ¤µÈ Ä÷º¼Ç °´Ã¼ÀÇ Iterator¸¦ ¼øÂ÷ÇÏ¸é¼ ±× ³»¿ëÀÌ µÇ´Â °´Ã¼¸¦ º¯¼ö¿¡ ¸Å¹ø ´ëÀÔÇØÁÖ´Â °³³äÀÌ´Ù. ¿µ¾î·Î´Â ¡°foreach ~ in¡± À̶ó°í Àд´Ù.
ÀÚ, ÀÌÁ¦ ²©¼è °ýÈ£¸¦ Æ÷ÇÔÇÏ´Â ¸®½ºÆ® ¼±¾ðµéÀ» º¸ÀÚ. ÀÌ ºÎºÐ¿¡¼ ¹Ù·Î Á¦³×¸¯½º°¡ »ç¿ëµÇ¾ú´Ù.
UseCollection ¼Ò½º Äڵ忡¼ ArrayList Ŭ·¡½º¿Í List ÀÎÅÍÆäÀ̽º´Â ´õ ÀÌ»ó ¸ðµç °´Ã¼¸¦ ¼ö¿ëÇÏ´Â ¸®½ºÆ®°¡ ¾Æ´Ï´Ù. slist º¯¼ö´Â String °´Ã¼¸¸ ¹Þ¾ÆµéÀ̸ç, ilist °´Ã¼´Â Integer °´Ã¼¸¸ ¹Þ¾ÆµéÀδÙ.
Áï, ´ÙÀ½°ú °°ÀÌ »ç¿ëÇÑ´Ù¸é ÀÚ¹Ù ÄÄÆÄÀÏ·¯°¡ ÄÄÆÄÀÏ ¿¡·¯¸¦ ¹ß»ý½ÃŲ´Ù.
slist.add(3);
ilist.add("world!");
Á¦³×¸¯½º¸¦ »ç¿ëÇÏ´Â °¡Àå ÀûÇÕÇÏ°í Áß¿äÇÑ ¸ñÀûÀº ¹Ù·Î Ä÷º¼Ç Ŭ·¡½ºµé¿¡ »ç¿ëµÉ °´Ã¼µéÀÇ ÀÚ·áÇüÀ» ¾ö¹ÐÇÏ°Ô Á¦ÇÑÇÏ´Â °ÍÀÌ´Ù.
Á¦³×¸¯½º ¸¸µé±â
Áö±Ý±îÁö´Â ¾ÆÁÖ ¼øÁ¶·Ó°Ô ÀÚ¹ÙÀÇ »õ·Î¿î ±â´É Á¦³×¸¯½º¸¦ ´À²¸º¼ ¼ö ÀÖ¾ú´Ù. ÀÚ, ÀÌÁ¦ Á¦³×¸¯½º Ŭ·¡½º¸¦ ÇÑ ¹ø ¸¸µé¾îº¸ÀÚ.
Á¦³×¸¯½º Ŭ·¡½º¸¦ ¸¸µé±â Àü¿¡ °æ°í¸¦ Çϳª Çؾ߰ڴÙ.
Ȥ½Ã C++ ÅÛÇø´À» Á¤ÀÇÇغ» ÀûÀÌ ÀÖ´Ù¸é, ±× °æÇèÀ¸·Î Á¦³×¸¯½º Ŭ·¡½ºµµ ½±°Ô Á¤ÀÇÇÒ ¼ö ÀÖ´Ù°í »ý°¢Çϸé Å« ¿À»êÀÌ´Ù. ¡°Çï·Î, Á¦³×¸¯½º¡± Ŭ·¡½º´Â Á¶±Ý ºÒÆíÇÑ °æÇèÀÌ µÉ °ÍÀÌ´Ù.
ÀÚ, MyVector Ŭ·¡½º ¼±¾ðÀ» »ìÆ캸ÀÚ.
<¸®½ºÆ® 2> MyVector.java ¼Ò½º ÄÚµå
public class MyVector<E> {
public static final int ARRAY_SIZE = 10;
private E[] elements;
private int elementCount = 0;
public MyVector() {
elements = (E[]) new Object[ARRAY_SIZE]; // unchecked typecast warning
}
public void add(E value) {
if (elementCount >= ARRAY_SIZE) {
throw new IndexOutOfBoundsException("element count reached max size");
}
elements[elementCount++] = value;
}
public E get(int index) {
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index);
}
return elements[index];
}
public static void main(String[] args) {
MyVector<Integer> vector = new MyVector<Integer>();
for (int i = 0; i < 10; i++) {
vector.add(i);
}
for (int i = 0; i < 10; i++) {
System.out.println("[" + i + "]th value : " + vector.get(i));
}
}
}
ÃÖ´ëÇÑ °£´ÜÇÏ°Ô ±¸ÇöÇϱâ À§ÇØ Å©±â°¡ Ç×»ó 10À¸·Î °íÁ¤µÈ º¤ÅÍ Å¬·¡½º¸¦ »óÁ¤ÇÏ¿´´Ù. ÀÏ´Ü Å¬·¡½º ¼±¾ð¿¡¼ Á¦³×¸¯ ÀÚ·áÇüÀÎ E¸¦ ¼±¾ðÇÏ°í ÀÖ´Ù.
±×¸®°í ¸â¹ö Çʵå·Î ¼±¾ðµÈ elementsÀÇ ÀÚ·áÇüÀÌ ¿ª½Ã Á¦³×¸¯ ÀÚ·áÇüÀÎ E, add ¸Þ¼ÒµåÀÇ ÀÎÀÚµµ, get ¸Þ¼ÒµåÀÇ ¹Ýȯ À¯Çüµµ ¸ðµÎ E·Î ¼±¾ðµÇ¾î ±ò²ûÇÑ µíÀÌ º¸ÀδÙ.
C++ °³¹ßÀÚ¿´´Ù¸é ¿©±â±îÁö ´ç¿¬ÇÏ°Ô ¹Þ¾ÆµéÀÌ¸é¼ ÀÚ¹Ù ¾ð¾î´Â ¿ª½Ã Á¶±ÝÀÌ¶óµµ ´õ °£´ÜÇÑ ±¸¹®À¸·Î Á¦³×¸¯½º¸¦ Áö¿øÇÏ·Á´Ï ÇÏ°í ¼ú¼ú ³Ñ¾î°¬À» ¼öµµ ÀÖ´Ù.
±×·±µ¥, °¡¸¸È÷ º¸¸é »ý¼ºÀÚ ³»¿ëÀÌ Á¶±Ý ÀÌ»óÇÏ´Ù.
elements = (E[]) new Object[ARRAY_SIZE];
Object ¹è¿ ÀÚ·áÇü¿¡¼ Á¦³×¸¯ ÀÚ·áÇüÀÎ EÀÇ ¹è¿ ÀÚ·áÇüÀ¸·Î ¸í½ÃÀûÀÎ Çüº¯È¯ÀÌ ÀϾ´Ù. ÀÚ¹Ù Á¦³×¸¯½ºÀÇ ºñ¹ÐÀ» ¸ð¸¥´Ù¸é ´ç¿¬È÷ ´ÙÀ½°ú °°ÀÌ ½ÃµµÇßÀ» °ÍÀÌ´Ù.
elements = new E[ARRAY_SIZE];
ÀÚ¹Ù ÄÄÆÄÀÏ·¯´Â ¹«½ÉÇÏ°Ôµµ ÀÌ Äڵ带 ¡°generic array creation"À̶ó´Â ¿¡·¯·Î ó¸®ÇÑ´Ù.
¡°ÀÚ¹ÙÀÇ Á¦³×¸¯ ÀÚ·áÇüÀº °´Ã¼¸¦ »ý¼ºÇÒ ¼ö ¾ø´Ù!!!¡±
Áï, Á¦³×¸¯ ÀÚ·áÇü À̸§ÀÌ T¶ó¸é new T()¸¦ ÇÒ ¼ö ¾ø´Ù. Áï, ¼±¾ðÀº ÇÒ ¼ö ÀÖÁö¸¸ °´Ã¼ ÀνºÅϽº¸¦ ¸¸µé ¼ö ¾ø´Â À¯·É ÀÚ·áÇüÀ̶ó´Â °ÍÀÌ´Ù.
ÀÚ¹Ù ¼Ò½º ÄÚµåÀÇ Á¦³×¸¯ ÀÚ·áÇüÀÌ ÄÄÆÄÀÏ ½Ã±îÁö¸¸ Á¸ÀçÇÏ°í ½ÇÁ¦ ÄÄÆÄÀÏµÈ ¹ÙÀÌÆ®Äڵ忡´Â Á¸ÀçÇÏÁö ¾Ê±â ¶§¹®¿¡ ½ÇÇà ½Ã°£¿¡ ÇØ´çÇÏ´Â Á¦³×¸¯ ÀÚ·áÇüÀÇ ÀνºÅϽº¸¦ ¸¸µå´Â °ÍÀº ¿øõÀûÀ¸·Î ºÒ°¡´ÉÇÏ´Ù. ¸¶Âù°¡Áö ÀÌÀ¯·Î Á¦³×¸¯ ÀÚ·áÇüÀÇ ¹è¿µµ »ý¼ºÇÒ ¼ö°¡ ¾ø´Ù. »ý¼ºÀÚ¿¡¼ ÄÄÆÄÀÏ·¯ ¿¡·¯°¡ ³ ÀÌÀ¯´Â Á¦³×¸¯ ÀÚ·áÇüÀÇ ¹è¿À» »ý¼ºÇÏ·Á°í ½ÃµµÇ߱⠶§¹®ÀÌ´Ù.
ºÒÄèÇÔÀº ¾à°£ ´õ Áö¼ÓµÇ´Âµ¥, MyVector.java ¼Ò½º Äڵ带 ÄÄÆÄÀÏÇغ¸¸é »ý¼ºÀÚ ºÎ±Ù¿¡¼ ÄÄÆÄÀÏ·¯ °æ°í°¡ ³ªÅ¸³´Ù. ÄÄÆÄÀÏ·¯ °æ°í ³»¿ëÀ» º¸·Á¸é -Xlint:unchecked ¿É¼ÇÀ» »ç¿ëÇØ¾ß ÇÑ´Ù.
javac -Xlint:unchecked MyVector.java
MyVector.java:29: warning: [unchecked] unchecked cast
found : java.lang.Object[]
required: E[]
elements = (E[]) new Object[ARRAY_SIZE];
^
1 warning
ÀÌ °æ°í ¸Þ½ÃÁö´Â ¹°·Ð ½ÇÁ¦·Î´Â Object ¹è¿ÀÎ elements ¸â¹ö Çʵ带 Á¦³×¸¯ ÀÚ·áÇüÀÎ E ÀÚ·áÇüÀÇ ¹è¿·Î °Á¦ Çü º¯È¯À» ÇßÀ» ¶§, ÇüÀÌ ¸ÂÁö ¾Ê¾Æ¼ ¹ß»ýÇÏ´Â ÀÏÀ» ÄÄÆÄÀÏ·¯´Â Ã¥ÀÓÁú ¼ö ¾ø´Ù´Â ¶æÀÌ´Ù.
ÇÏÁö¸¸, ÀÚ¹Ù°¡ ½ÇÇà ½Ã°£¿¡´Â Á¦³×¸¯ ÀÚ·áÇü Á¤º¸¸¦ °¡Áö°í ÀÖÁö ¾Ê°í, ¶Ç MyVector Ŭ·¡½º´Â Á¦³×¸¯ ÀÚ·áÇüÀÌ StringÀ̵ç IntegerÀÌµç ½ÇÇà ½Ã°£¿¡´Â ¸ðµÎ µ¿ÀÏÇÑ Å¬·¡½º·Î °£ÁֵǹǷÎ, ½ÇÁ¦·Î ¸â¹ö ÇʵåÀÎ elementsÀÇ ÀÚ·áÇüÀº ¸ðµç °´Ã¼ÀÇ ºÎ¸ð Ŭ·¡½ºÀÎ Object ¹è¿·Î 󸮵ȴÙ. ¿©±â¿¡ ´ëÇؼ´Â ´Ù½Ã ¼³¸íÇÒ °ÍÀÌ´Ù.
µû¶ó¼, ù ¹ø° Á¦³×¸¯ Ŭ·¡½ºÀÎ MyVector Ŭ·¡½º´Â Á¦³×¸¯½º¿¡ °üÇÑ ÇÑ ÃÖ¼±À» ´ÙÇØ Á¤È®ÇÏ°Ô ¼±¾ðµÈ ¼ÀÀÌ´Ù.
Á¦³×¸¯½º µé¿©´Ù º¸±â
ÀÚ·áÇü Áö¿ì±â
ÀÚ¹Ù Á¦³×¸¯½º´Â ¾Õ¿¡¼ »ìÆ캻 ´ë·Î ¸¸µé¾îÁø Ŭ·¡½º¸¦ »ç¿ëÇϱ⿡´Â Äڵ忡¼ °Á¦ Çüº¯È¯À» ¸¹ÀÌ »ç¶óÁö°Ô ÇÏ°í, ¹ö±×ÀÇ °¡´É¼ºÀ» ÁÙ¿©ÁÖ´Â ¸ÚÁø Ä£±¸ÀÌÁö¸¸, Á÷Á¢ ¸¸µé¾î »ç¿ëÇϱ⿡´Â »ó´çÈ÷ ºÒÆíÇÑ ³à¼®ÀÌ´Ù.
ÀÌ°ÍÀº Á¦³×¸¯½ºÀÇ ±¸Çö ¹æ¹ý°ú ¹«°üÇÏÁö ¾ÊÀºµ¥, ÀÚ¹Ù Á¦³×¸¯½º´Â ÀÚ·áÇü Áö¿ì±â(type erasure)¶ó´Â Á¢±Ù ¹æ¹ýÀ¸·Î ±¸ÇöµÇ¾ú´Ù. ÀÚ·áÇü Áö¿ì±â´Â °£´ÜÇÏ°Ô Ç¥ÇöÇÏÀÚ¸é ÄÄÆÄÀÏ·¯°¡ ÄÄÆÄÀÏ ½Ã¿¡ Á¦³×¸¯ ÀÚ·áÇü¿¡ ´ëÇÑ Á¤º¸¸¦ ¸ðµÎ °Ë»çÇÏ°í À̸¦ Åë°úÇÒ °æ¿ì Á¦³×¸¯ ÀÚ·áÇü Á¤º¸°¡ ÀüÇô ¾ø´Â ¹ÙÀÌÆ®Äڵ带 »ý¼ºÇÏ´Â ¹æ½ÄÀÌ´Ù.
µû¶ó¼ ´ÙÀ½Àº ¡°true¡±¸¦ Ãâ·ÂÇÑ´Ù.
List<String> list1 = new ArrayList<String>();
List<Integer> list2 = new ArrayList<Integer>();
List list3 = new ArrayList();
System.out.println(list1.getClass() == list2.getClass() && list2.getClass() == list3.getClass());
Ŭ·¡½º´Â ¸ðµÎ °øÀ¯ÇÏÁö¸¸ ½ÇÁ¦ Ŭ·¡½ºÀÇ Á¦³×¸¯ ÀÚ·áÇü º¯¼ö °ªÀº °¢ °´Ã¼ ÀνºÅϽºº°·Î ´Þ¶óÁú ¼ö ÀÖÀ¸¹Ç·Î, °°Àº Ŭ·¡½º ³»¿¡¼ °øÀ¯µÇ´Â static ¹®¸Æ¿¡¼´Â Ŭ·¡½º¿¡ ¼±¾ðµÈ Á¦³×¸¯ ÀÚ·áÇüÀ» ÂüÁ¶ÇÒ ¼ö°¡ ¾ø´Ù. Áï, static º¯¼ö, static ÃʱâÈ ºí·Ï, static ¸Þ¼Òµå µî¿¡¼ Ŭ·¡½º¿¡ ¼±¾ðµÈ Á¦³×¸¯ ÀÚ·áÇüÀ» »ç¿ëÇÒ ¼ö°¡ ¾ø´Ù.
¸¶Âù°¡Áö ÀÌÀ¯·Î ´ÙÀ½ Ç¥Çö½ÄÀº ÄÄÆÄÀÏ ¿¡·¯¸¦ ¹ß»ý½ÃŲ´Ù.
List<String> list = new ArrayList<String>();
System.out.println(list instanceof ArrayList<String>); // ÄÄÆÄÀÏ ¿¡·¯
Áï, ½ÇÇà ½Ã¿¡´Â Á¦³×¸¯ ÀÚ·áÇü¿¡ ´ëÇÑ Á¤º¸°¡ ¾øÀ¸¹Ç·Î, instanceof ¿¬»êÀÚ¸¦ Á¦³×¸¯ ÀÚ·áÇü¿¡ ´ëÇØ ½ÇÇàÇÒ ¼ö°¡ ¾ø´Â °ÍÀÌ´Ù.
ÀÚ·áÇü Áö¿ì±â¿Í ¹Ý´ëÀÇ ±¸Çö ¹æ¹ýÀ¸·Î´Â ÈçÈ÷ ±¸»óÈ(reification)¶ó°í ºÎ¸£´Â ¹æ¹ýÀ¸·Î ¹ÙÀÌÆ®Äڵ忡 Á¦³×¸¯ ÀÚ·áÇü¿¡ °ü·ÃµÈ Á¤º¸¸¦ ½ÇÁ¦·Î »ý¼ºÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù. C#ÀÌ ÀÌ·¯ÇÑ ¹æ½ÄÀ¸·Î 1.1 ¹öÀü¿¡¼ Á¦³×¸¯½º¸¦ ±¸ÇöÇß´Ù°í Çϸç, ÀÚ¹Ù¿¡¼´Â ±âÁ¸ ¾ÖÇø®ÄÉÀ̼ÇÀ̳ª ¶óÀ̺귯¸®¿ÍÀÇ È£È¯¼ºÀ» ÃÖ¿ì¼±À¸·Î °í·ÁÇÏ¿© ÀÚ·áÇü Áö¿ì±â ¹æ½ÄÀ» äÅÃÇß´Ù°í ÇÑ´Ù.
Á¦³×¸¯½º ¿ÍÀϵå Ä«µå
ÀÚ¹Ù Á¦³×¸¯½º´Â C++ÀÇ ÅÛÇø´°ú À¯»çÇÏ´Ù°í »ý°¢Çß´ø »ç¶÷µé¿¡°Ô ¶ÇÇϳªÀÇ ÀÏÅ»À» ´À³¢°Ô ÇØÁÖ´Â °ÍÀÌ ¹Ù·Î ÀÌ ¿ÍÀϵå Ä«µå Á¦³×¸¯ ÀÚ·áÇüÀÏ °ÍÀÌ´Ù. ¿ÍÀϵå Ä«µå ÀÚ·áÇüÀº Á¦³×¸¯ ÀÚ·áÇüÀ» ¼±¾ðÇÒ ¶§ Á¦³×¸¯ ÀÚ·áÇüÀ» ÀÓÀÇÀÇ ÀÚ·áÇü ȤÀº Ŭ·¡½º »ó¼Ó °èÃþ ±¸Á¶ »óÀÇ Æ¯Á¤ ¹üÀ§¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ°Ô ÇØÁØ´Ù.
ÀÚ¹Ù Á¦³×¸¯½º¿¡¼ ¿ÍÀϵå Ä«µå´Â ¡®?¡¯ ¹®ÀڷΠǥ½ÃµÈ´Ù. ´ÙÀ½¿¡¼¿Í °°ÀÌ ¿ÍÀϵå Ä«µåÀÎ ¡®?¡¯ ¹®ÀڷΠǥ½ÃµÈ Á¦³×¸¯ ÀÚ·áÇüÀº ÀÓÀÇÀÇ ¸ðµç ÀÚ·áÇüÀ» °¡¸£Å²´Ù.
List<?> wclist = new ArrayList<String>();
List<?> wclist2 = new ArrayList<Integer>();
´ÙÀ½Àº ¿ÍÀϵå Ä«µå¸¦ »ç¿ëÇÑ ListÀÇ ¿¹ÀÌ´Ù. ¿ÍÀϵå Ä«µå·Î Ç¥ÇöµÈ Á¦³×¸¯ ÀÚ·áÇüÀ» °¡Áø wclist º¯¼ö´Â String ¸®½ºÆ®¿Í Integer ¸®½ºÆ®¸¦ ¸ðµÎ ¹ÞÀ» ¼ö ÀÖ´Ù.
<¸®½ºÆ® 3> WildcardList.java ¼Ò½º ÄÚµå
import java.util.*;
public class WildcardList {
public static void main(String[] args) {
List<String> slist = new ArrayList<String>();
slist.add("hello");
slist.add("world");
List<Integer> ilist = new ArrayList<Integer>();
ilist.add(1);
ilist.add(2);
List<?> wclist = slist;
for (Object o : wclist) {
System.out.println("value = " + o);
}
wclist = ilist;
for (Object o : wclist) {
System.out.println("value = " + o);
}
}
}
ÀÚ¹Ù Á¦³×¸¯½ºÀÇ ¿ÍÀϵå Ä«µå´Â ÀÓÀÇÀÇ °´Ã¼¸¦ Ç¥ÇöÇÒ »Ó¸¸ ¾Æ´Ï¶ó Ŭ·¡½º »ó¼Ó °èÃþ ±¸Á¶ »óÀÇ °æ°è¸¦ ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù. À̸¦ À§ÇØ super¿Í extends¶ó´Â µÎ ¿¹¾à¾î¸¦ »ç¿ëÇÑ´Ù.
List<? extends Number>
List<? super Integer>
extends¸¦ »ç¿ëÇÏ´Â ¿ÍÀϵå Ä«µå´Â ÈçÈ÷ ¿ÍÀϵå Ä«µåÀÇ »óÇÑÀ» ÁöÁ¤ÇÑ´Ù°í Çϴµ¥, ±× Àǹ̴ extends ´ÙÀ½¿¡ ³ª¿À´Â Ŭ·¡½º¸¦ Æ÷ÇÔÇÏ¿© ±× ÀÚ½Ä Å¬·¡½ºµéÀÌ Á¦³×¸¯ ÀÚ·áÇüÀ¸·Î ¿Ã ¼ö ÀÖÀ½À» ³ªÅ¸³½´Ù.
super¸¦ »ç¿ëÇÏ´Â ¿ÍÀϵå Ä«µå´Â ±× ¹Ý´ë·Î ¿ÍÀϵå Ä«µåÀÇ ÇÏÇÑÀ» ÁöÁ¤Çϴµ¥, ±× Àǹ̴ super ´ÙÀ½¿¡ ³ª¿À´Â Ŭ·¡½º¸¦ Æ÷ÇÔÇÏ¿© ±× ºÎ¸ð Ŭ·¡½ºµéÀÌ Á¦³×¸¯ ÀÚ·áÇüÀ¸·Î ¿Ã ¼ö ÀÖÀ½À» ³ªÅ¸³½´Ù.
¾ÕÀÇ ¼Ò½º Äڵ忡¼ ´«¿©°Ü º¼ Á¡Àº wclist º¯¼ö¿¡¼ Á÷Á¢ add() ¸Þ¼Òµå¸¦ È£ÃâÇÏÁö ¾Ê´Â´Ù´Â Á¡ÀÌ´Ù. ½ÇÁ¦ wclist º¯¼ö ¾È¿¡ String ¸®½ºÆ®°¡ ´ëÀԵǾî ÀÖ´Ù°í ÇÏ´õ¶óµµ, ÄÄÆÄÀÏ·¯´Â add() ¸Þ¼ÒµåÀÇ ½Ã±×³Êó°¡ ¿ø·¡ add(E)¿´À¸¹Ç·Î, E°¡ ?·Î Àû¿ëµÇ¾î ÀÖÀ¸¹Ç·Î add(?)·Î °£ÁÖÇÏ°í ÀÔ·ÂµÈ ÀÎÀÚÀÇ ÀÚ·áÇüÀÌ ¡®?¡¯À̱⸦ ±â´ëÇÑ´Ù. ¡®?¡¯Àº ÀÓÀÇÀÇ °´Ã¼À̹ǷΠÀÚ¹Ù ÄÄÆÄÀÏ·¯´Â StringÀ» ¹Þ¾ÆµéÀÏ ¼ö ÀÖ´Ù´Â È®½ÅÀ» ÇÏÁö ¸øÇÑ´Ù.
¸¸¾à ÀÔ·ÂµÉ ¼ö ÀÖ´Â °´Ã¼ ÀÚ·áÇüÀÇ ¹üÀ§°¡ StringÀ̰ųª StringÀÇ ºÎ¸ð Ŭ·¡½º·Î Á¦Çѵȴٸé, ÀÚ¹Ù ÄÄÆÄÀÏ·¯´Â ÀÌ °æ¿ì StringÀ» ¹Þ¾ÆµéÀÏ ¼ö ÀÖ´Ù°í ÆÇ´ÜÇÑ´Ù.
// add ¸Þ¼Òµå°¡ ÀÔ·Â º¯¼ö·Î Á¦³×¸¯ º¯¼ö¸¦ ¹ÞÀ¸¹Ç·Î ÇÏÇÑ °æ°èÀÇ ¿ÍÀϵå Ä«µå¸¦ »ç¿ëÇÔ
List<String> slist = new ArrayList<String>();
List<? super String> wclist = slist;
wclist.add("wild");
wclist.add("card");
for (Object o : wclist) { // iterator()ÀÇ °á°ú°ªÀº Object·Î¸¸ ó¸®
System.out.println("value = " + o);
}
ÀϹÝÀûÀ¸·Î ÀÚ¹Ù ÄÄÆÄÀÏ·¯´Â ÀÔ·Â º¯¼ö·Î ÁÖ¾îÁø Á¦³×¸¯ ÀÚ·áÇü¿¡ ´ëÇؼ´Â ¿ÍÀϵå Ä«µåÀÇ ÇÏÇÑ °æ°è¸¦ ÁöÁ¤ÇÔÀ¸·Î½á ÀÚ·áÇüÀÇ Á¦¾àÀ» Ç® ¼ö ÀÖ°í, ¹Ýȯ À¯ÇüÀ¸·Î ÁÖ¾îÁø Á¦³×¸¯ ÀÚ·áÇü¿¡ ´ëÇؼ´Â ¿ÍÀϵå Ä«µåÀÇ »óÇÑ °æ°è¸¦ ÁöÁ¤ÇÔÀ¸·Î½á ÀÚ·áÇüÀÇ Á¦¾àÀ» Ç® ¼ö ÀÖ´Ù.
// iterator ¸Þ¼Òµå°¡ ¹Ýȯ º¯¼ö·Î Á¦³×¸¯ º¯¼ö¸¦ ÁֹǷΠ»óÇÑ °æ°èÀÇ ¿ÍÀϵå Ä«µå¸¦ »ç¿ëÇÔ
List<? extends String> wclist2 = slist;
for (String s : wclist2) { // »óÇÑ °æ°è ´öºÐ¿¡ String »ç¿ë °¡´É
System.out.println("string = " + s);
}
extends¿Í super¸¦ »ç¿ëÇÏ¿© ¿ÍÀϵå Ä«µåÀÇ °æ°è¸¦ Á¤ÇÏ´Â °Í¿¡¼ ÇÑ °¡Áö À¯ÃßÇغ¼ ¸¸ÇÑ »ç½ÇÀº ´ÙÀ½ÀÌ´Ù.
¾Õ¿¡¼ List<String> º¯¼ö¿¡ ArrayList<String> º¯¼ö¸¦ ´ëÀÔÇÏ´Â °ÍÀº ÀÚ¿¬½º·¯¿ü´Ù. Áï, ArrayList<String>Àº List<String>ÀÇ ÀÚ½Ä ÀÚ·áÇüÀ̸ç List<String>À¸·Î Ãë±ÞÇÒ ¼ö ÀÖ´Ù. ArrayList Ŭ·¡½º°¡ List ÀÎÅÍÆäÀ̽º¸¦ ±¸ÇöÇÏ°í ÀÖÀ¸¹Ç·Î Áï, ÀÚ½Ä ÀÚ·áÇüÀ̹ǷΠÀÌ°ÍÀº ÇÕ¸®ÀûÀÌ´Ù.
ÇÏÁö¸¸, ArrayList<String> º¯¼ö¿¡ ArrayList<Object> º¯¼ö¸¦ ´ëÀÔÇÏ´Â °ÍÀº ¿¡·¯°¡ ¹ß»ýÇÑ´Ù. Áï, ArrayList<String>Àº ArrayList<Object>ÀÇ ÀÚ½Ä ÀÚ·áÇüÀÌ ¾Æ´Ï¸ç ArrayList<Object>·Î Ãë±ÞÇÒ ¼ö ¾ø´Ù´Â °ÍÀÌ´Ù. ±×·¸±â ¶§¹®¿¡ ArrayList<String>°ú ArrayList<Object>¸¦ ¸ðµÎ Ãë±Þ °¡´ÉÇÑ Á¦³×¸¯½º ÇüÅ´ ArrayList<Object>°¡ ¾Æ´Ï¶ó ArrayList<? super String>ÀÌ µÇ´Â °ÍÀÌ´Ù.
Á¦³×¸¯ ¸Þ¼Òµå
ÀÚ¹Ù Á¦³×¸¯½º´Â Ŭ·¡½º³ª ÀÎÅÍÆäÀ̽º¿Í °°Àº ÀÚ·áÇüÀ» ¼±¾ðÇÒ ¶§ Ŭ·¡½º³ª ÀÎÅÍÆäÀ̽ºÀÇ º¯°æ °¡´ÉÇÑ ÀÚ·áÇü º¯¼ö·Î ÁöÁ¤ÇÏ´Â °æ¿ì ¿Ü¿¡µµ, ¸Þ¼Òµå¿¡¼µµ »ç¿ëÇÒ ¼ö ÀÖ´Ù.
Ŭ·¡½º¿Í ÀÎÅÍÆäÀ̽º¿¡¼ Á¦³×¸¯ ÀÚ·áÇü º¯¼ö¸¦ »ç¿ëÇÒ ¶§¿Í ¸Þ¼Òµå¿¡¼ »ç¿ëÇÒ ¶§¿¡´Â Á¶±Ý Àǹ̰¡ ´Ù¸£´Ù.
¾Õ¿¡¼ MyVector Ŭ·¡½º¸¦ ¼±¾ðÇÒ ¶§ MyVector Ŭ·¡½º¿¡¼ »ç¿ëÇÏ´Â Á¦³×¸¯ ÀÚ·áÇü º¯¼öÀÎ E°¡ ¸â¹ö Çʵ峪 ¸â¹ö ¸Þ¼Òµå¿¡ »ç¿ëµÉ ¶§, ÀÌ E ÀÚ·áÇüÀº ¸ðµÎ µ¿ÀÏÇÑ ÀÚ·áÇüÀ» ¶æÇÏ¿´´Ù. Áï, Á¦³×¸¯ ÀÚ·áÇü¿¡ ´ëÀÔµÈ ½ÇÁ¦ Ŭ·¡½º°¡ StringÀÌ¸é ¸â¹ö ÇʵåÀÇ E ÀÚ·áÇüµµ StringÀ¸·Î °£Áֵǰí, ¸â¹ö ¸Þ¼ÒµåÀÇ ÀÎÀÚ³ª ¹Ýȯ À¯ÇüÀ¸·Î »ç¿ëµÈ E ¿ª½Ã StringÀ¸·Î °£ÁֵǾú´Ù. ÀÌ Á¡À» À¯³äÇÏ¸é¼ Á¦³×¸¯ ¸Þ¼Òµå¸¦ ¾Ë¾Æº¸ÀÚ.
Á¦³×¸¯ ¸Þ¼Òµå´Â ¸Þ¼Òµå¸¦ ¼±¾ðÇÒ ¶§, ¸Þ¼Òµå ½Ã±×³Êó ¾Õ ºÎºÐ¿¡ ²ª¼è °ýÈ£ ¾È¿¡ Á¦³×¸¯ ÀÚ·áÇü º¯¼ö¸¦ ¼±¾ðÇÑ´Ù.
¸¸¾à Á¦³×¸¯ ¸Þ¼Òµå¿¡ »ç¿ëµÈ Á¦³×¸¯ ÀÚ·áÇü º¯¼ö°¡ ¿ÍÀϵå Ä«µå¶ó¸é º°µµ·Î ¼±¾ðÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
´ÙÀ½ ¿¹¿¡¼´Â T°¡ Á¦³×¸¯ ÀÚ·áÇü º¯¼ö·Î ¼±¾ðµÇ¾ú´Ù.
public static <T> T genericMethod(T a, Collection<T> b) {
// ...
}
´ÙÀ½ ÄÚµå´Â µÎ °³ÀÇ Á¦³×¸¯ ¸Þ¼Òµå getOne()°ú getOneElement()¸¦ ¿¹½ÃÇÏ°í ÀÖ´Ù.
<¸®½ºÆ® 4> PolymorphicMethod.java ¼Ò½º ÄÚµå
import java.util.*;
public class PolymorphicMethod {
private static boolean toggle = false;
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("hello");
list.add("world");
Set<Integer> set = new HashSet<Integer>();
set.add(1);
set.add(2);
Collection<?> col = getOne(list, set);
System.out.println(col);
Object el = getOneElement(list, set);
System.out.println(el);
}
static <T> T getOne(T a, T b) {
toggle = !toggle;
return toggle ? a : b;
}
static <T, U> Object getOneElement(List<T> a, Set<U> b) {
toggle = !toggle;
return toggle ? a.get(0) : b.iterator().next();
}
}
getOne() ¸Þ¼ÒµåÀÇ °æ¿ì, Á¦³×¸¯ ÀÚ·áÇü ŸÀÔÀÎ T°¡ µÎ °³ÀÇ ÀÎÀÚ¿Í ¹Ýȯ À¯Çü ¼¼ ±ºµ¥¼ »ç¿ëµÇ°í ÀÖ´Ù. ÀÌ °æ¿ì °¢ ÀÎÀÚ T¿¡ Àû¿ëµÇ´Â ÀÚ·áÇüÀÌ ¹Ýµå½Ã °°Àº ÇÊ¿ä´Â ¾ø´Âµ¥, ÀÚ¹Ù ÄÄÆÄÀÏ·¯´Â ½ÇÁ¦ ÀÌ ¸Þ¼Òµå¸¦ È£ÃâÇÏ´Â °÷¿¡¼ ÀÎÀÚµéÀÇ ÀÚ·áÇüÀ» È®ÀÎÇؼ Á¦³×¸¯ ÀÚ·áÇü ŸÀÔ º¯¼ö¿¡ µé¾î°¥ ½ÇÁ¦ ÀÚ·áÇüÀ» À¯ÃßÇÏ´Â ±â´ÉÀ» Á¦°øÇÑ´Ù.
¿¹Á¦ÀÇ °æ¿ì, getOne() ¸Þ¼Òµå¿¡ »ç¿ëµÈ µÎ °³ÀÇ ÀÎÀÚ°¡ Çϳª´Â List<String> ÀÚ·áÇüÀÌ°í, ´Ù¸¥ Çϳª´Â Set<Integer> ÀÚ·áÇüÀÌ´Ù. ÀÚ¹Ù ÄÄÆÄÀÏ·¯´Â ÀÌ µÎ ÀÚ·áÇüÀÇ °øÅë ºÎ¸ð Ŭ·¡½ºÀÎ CollectionÀ» À¯ÃßÇس»°í, ¶Ç String°ú Integer¸¦ ¸ðµÎ ó¸®ÇÒ ¼ö ÀÖ´Â ¿ÍÀϵå Ä«µåÀÎ ¡®?¡¯¸¦ ÇØ´ç CollectionÀÇ Á¦³×¸¯ ÀÚ·áÇüÀ¸·Î À¯ÃßÇس½´Ù.
Áï, ÀÌ °æ¿ì¿¡´Â T°¡ Collection<?>À¸·Î °áÁ¤µÈ´Ù. °á°ú °ª ¿ª½Ã T ÀÚ·áÇüÀ̹ǷΠgetOne() ¸Þ¼Òµå¸¦ È£ÃâÇÑ °á°ú°ªÀ» Collection<?> ÀÚ·áÇüÀÇ °´Ã¼¿¡ ÀúÀåÇÏ¸é ¾Æ¹«·± °æ°í ¾øÀÌ ÄÄÆÄÀϵȴÙ.
µÎ ¹ø° Á¦³×¸¯ ¸Þ¼ÒµåÀÎ getOneElement() ¸Þ¼Òµå´Â ¿©·¯ °³ÀÇ Á¦³×¸¯ ÀÚ·áÇü ŸÀÔÀ» ¼±¾ðÇÏ´Â ¿¹¸¦ º¸¿©ÁÖ°í ÀÖ´Ù.
Á¦³×¸¯½º¿Í ¹è¿
¹è¿Àº ÀÚ·áÇü Áß¿¡¼ Á¶±Ý ƯÀÌÇϸ鼵µ ±î´Ù·Î¿î Á¸ÀçÀÌ´Ù.
Äڵ忡¼ º¸´Â ´ë·Î ÇöÀç ÀÚ·áÇüÀÌ ºñ·Ï Object ¹è¿·Î ¼±¾ðµÇ¾î ÀÖ´Ù ÇÏ´õ¶óµµ ¹è¿À» »ý¼ºÇÒ ¶§ StringÀÇ ¹è¿·Î »ý¼ºÇÏ¿´´Ù¸é, ¹è¿ÀÇ ¿ø¼Ò·Î StringÀÌ ¾Æ´Ñ Object °´Ã¼¸¦ ³ÖÀ» ¼ö°¡ ¾ø´Ù.
Object[] objArray = new String[1];
objArray[0] = new Object(); // ½ÇÇà ½Ã°£ ¿¡·¯!
ÀÌ·¯ÇÑ ¹è¿ÀÇ Æ¯¼º ¶§¹®¿¡ ÀÚ¹Ù Á¦³×¸¯½º¿¡¼ ¹è¿ÀÇ ÄÄÆ÷³ÍÆ® ÀÚ·áÇü¸¸À» Á¦³×¸¯ ÀÚ·áÇü º¯¼ö·Î »ç¿ëÇÒ ¼ö°¡ ¾ø´Ù. Áï, ´ÙÀ½Àº Çã¿ëµÇÁö ¾Ê´Â´Ù. ´Ù¸¸ ÄÄÆ÷³ÍÆ® ÀÚ·áÇü¿¡ »óÇÏÇÑ Á¦¾à ¾ø´Â ¡®?¡¯ ¿ÍÀϵå Ä«µå¸¦ ¾²´Â °ÍÀº Çã¿ëµÈ´Ù.
List<String>[] list = new List<String>[10]; // Á¦³Ê¸¯ ÀÚ·áÇü °´Ã¼ÀÇ ¹è¿. Çã¿ë ¾ÈµÊ.
List<?>[] list = new List<?>[10]; // Á¦¾à ¾ø´Â ¿ÍÀϵå Ä«µå Á¦³Ê¸¯ ÀÚ·áÇü °´Ã¼ÀÇ ¹è¿. Çã¿ëµÊ.
public <T> T[] toArray(T[] a) { } // Á¦³Ê¸¯ ÀÚ·áÇü ¹è¿. Çã¿ëµÊ
¾ð¶æ »ý°¢Çϱ⿡ ÀÚ·áÇü ¾ÈÁ¤¼º °Ë»ç¸¦ ÄÄÆÄÀÏ ½Ã¿¡ °ÈÇÏ´Â ÀÚ¹Ù Á¦³×¸¯½ºÀÇ ÃëÁö¿¡ ºñÃß¾î ÀÌ·¯ÇÑ ¹è¿ÀÇ ÀÚ·áÇü °Ë»ç ¹®Á¦¿¡ ´ëÇؼµµ °³¼±ÀÌ ÀÖÀ» µíµµ ÇÏÁö¸¸, Àû¾îµµ ÀÚ¹Ù 5.0ÀÇ Á¦³×¸¯½º´Â º°´Ù¸¥ ÇعýÀ» Á¦½ÃÇÏÁö ¾Ê´Â´Ù.
ºê¸®Áö ¸Þ¼Òµå
ºê¸®Áö ¸Þ¼Òµå´Â Á¦³×¸¯½º¸¦ ±¸ÇöÇÏ´Â ¹æ¹ý¿¡ ÀÇÇØ »ç¿ëµÇ´Â µ¶Æ¯ÇÑ ÇüÅÂÀÇ ÀÚ¹Ù ¸Þ¼ÒµåÀÌ´Ù. ºê¸®Áö ¸Þ¼Òµå´Â ¿À¹ö¶óÀ̵åÇÑ ¸Þ¼Òµå°¡ ºÎ¸ð Ŭ·¡½º¿Í µ¿ÀÏÇÑ ¸Þ¼Òµå ½Ã±×³Êó¸¦ °¡Áö°í ÀÖÁö¸¸ ¹Ýȯ ÀÚ·áÇüÀÌ ´Ù¸¦ °æ¿ì¿¡ ¹ß»ýÇÑ´Ù.
´ÙÀ½ Äڵ忡¼ CoB Ŭ·¡½º´Â CoA Ŭ·¡½º¸¦ »ó¼ÓÇÏ¸é¼ create() ¸Þ¼Òµå¸¦ ¿À¹ö¶óÀ̵åÇÑ´Ù. À̶§, ¹Ýȯ À¯ÇüÀÌ ºÎ¸ð Ŭ·¡½º¿Í ´Þ¸® CoA°¡ ¾Æ´Ñ CoB¸¦ ¹ÝȯÇϵµ·Ï ¼±¾ðÇÏ¿´´Ù.
<¸®½ºÆ® 5> ¹Ýȯ À¯ÇüÀÌ ´Ù¸¥ ¸Þ¼Òµå ¿À¹ö¶óÀ̵ù
class CoA {
public CoA create() {
return new CoA();
}
}
class CoB extends CoA {
public CoB create() {
return new CoB();
}
}
ÀÌ Äڵ带 ÄÄÆÄÀÏÇÑ ÈÄ ¿ªÄÄÆÄÀÏÇØ º¸¸é CoB Ŭ·¡½º¿¡´Â ºÎ¸ð·ÎºÎÅÍ ¹°·Á¹ÞÀº CoA¸¦ ¸®ÅÏÇÏ´Â create() ¸Þ¼Òµå°¡ ¿©ÀüÈ÷ Á¸ÀçÇÔÀ» º¼ ¼ö ÀÖ´Ù. ÀÌ »ó¼Ó¹ÞÀº create() ¸Þ¼Òµå´Â ÀÚ½Ä Å¬·¡½º¿¡¼ ÀçÁ¤ÀÇÇÑ CoB¸¦ ¸®ÅÏÇÏ´Â create() ¸Þ¼Òµå¸¦ È£ÃâÇØÁÖ´Â ´Ù¸® ¿ªÇÒ¸¸À» ¼öÇàÇÑ´Ù.
CoB Ŭ·¡½º ÆÄÀÏ Æ÷¸ËÀ» ºÐ¼®ÇØ º¸¸é ¼Ò½º Äڵ忡´Â ¾ø¾ú´ø ÀÌ ºê¸®Áö ¸Þ¼Òµå¿¡ ´ëÇÑ Ç÷¡±×°ªÀÌ 0x40, 0x1000 °ªÀÌ ¼³Á¤µÇ¾î ÀÖÀ½À» º¼ ¼ö ÀÖ´Ù. 0x40Àº ºê¸®Áö ¸Þ¼Òµå¸¦ Ç¥ÇöÇÏ´Â Ç÷¡±×À̸ç 0x1000Àº ¼Ò½º Äڵ忡´Â ¾øÀÌ ÀÎÀ§ÀûÀ¸·Î »ý¼ºÇÑ ¸Þ¼Òµå(synthetic method)ÀÓÀ» Ç¥ÇöÇÏ´Â Ç÷¡±×ÀÌ´Ù.
<¸®½ºÆ® 5> javap À¯Æ¿¸®Æ¼¸¦ »ç¿ëÇÑ CoB Ŭ·¡½º ¿ªÄÄÆÄÀÏ
javap -c CoB <¿£ÅÍ>
Compiled from "CovariantReturn.java"
class CoB extends CoA{
CoB();
Code:
0: aload_0
1: invokespecial #1; //Method CoA."<init>":()V
4: return
public CoB create();
Code:
0: new #2; //class CoB
3: dup
4: invokespecial #3; //Method "<init>":()V
7: areturn
public CoA create();
Code:
0: aload_0
1: invokevirtual #4; //Method create:()LCoB;
4: areturn
}
ºê¸®Áö ¸Þ¼Òµå ¿ª½Ã ÀÚ¹Ù 5.0¿¡¼¸¸ Áö¿øµÇ´Â °³³äÀ̸ç, ÀÚ¹Ù ÄÄÆÄÀÏ·¯¿¡ ÀÇÇØ ÀÚµ¿À¸·Î »ý¼ºµÈ´Ù. ¶Ç, ¿À¹ö¶óÀ̵åÇÑ ¸Þ¼Òµå¿¡¼ ¹Ýȯ ÀÚ·áÇüÀ» ºÎ¸ð Ŭ·¡½ºÀÇ ¹Ýȯ ÀÚ·áÇüº¸´Ù Á»´õ ¾ö¹ÐÇÑ ÀÚ·áÇü Áï, ÀÚ½Ä ÀÚ·áÇüÀ¸·Î Á¤ÀÇÇÏ´Â °Íµµ ÀÚ¹Ù 5.0 ÀÌÈÄ ¹öÀü¿¡¼¸¸ Áö¿øµÇ´Â ±â´ÉÀÌ´Ù.
ÀÌ ±â´ÉÀº Iterator ÀÎÅÍÆäÀ̽ºÀÇ next() ¸Þ¼Òµåó·³ Á¦³×¸¯ ÀÚ·áÇüÀ¸·Î ¹Ýȯ ÀÚ·áÇüÀÌ ¼±¾ðµÇ¾î ÀÖ´Â °æ¿ì, ±¸Çö Iterator Ŭ·¡½ºµéÀÇ »ó¼Ó °ü°è¿Í ¹«°üÇÏ°Ô Á¤È®ÇÑ Á¦³×¸¯ ÀÚ·áÇüÀ» ¹ÝȯÇϵµ·Ï ¼±¾ðÇØ¾ß ÇÏ´Â Çʿ伺¿¡ ÀÇÇØ Ã¤ÅõǾú´Ù.
·±Å¸ÀÓ Á¦³×¸¯½º
½ÇÇà ½Ã°£¿¡ ¾Æ¹«·± Á¦³×¸¯ ÀÚ·áÇü Á¤º¸¸¦ ³²±âÁö ¾Ê´Â ÀÚ·áÇü Áö¿ì±â ¹æ½ÄÀÇ Æ¯¼º ¶§¹®¿¡ ÀÚ¹Ù Á¦³×¸¯½ºÀÇ Á¢±Ù ¹æ½Ä¿¡ ´ëÇØ ºñ³°ú Á¶·ÕÀÌ ÀûÁö ¾Ê¾Ò´Ù.
¿¹¸¦ µé¾î, Á¦³×¸¯ ÀÚ·áÇüÀ» »ç¿ëÇÏ¿© °´Ã¼¸¦ »ý¼ºÇϰųª Á¦³×¸¯ ÀÚ·áÇüÀ» ÄÄÆ÷³ÍÆ® ÀÚ·áÇüÀ¸·Î °¡Áö´Â ¹è¿À» »ý¼ºÇϰųª ÇÏ´Â ÀÏÀº C++ ÅÛÇø´¿¡ Àͼ÷ÇØÁø ÇÁ·Î±×·¡¸Ó¿¡°Ô´Â ³Ê¹«³ª ´ç¿¬ÇÑ ÀÏÀÌÁö¸¸, ÀÚ¹Ù Á¦³×¸¯½º·Î´Â ¾î·Á¿î ÀÏÀÌ µÈ´Ù. ÀÌ¿¡ ´ëÇÑ ÀÚ¹Ù 5.0ÀÌ ³»³õÀº ÇعýÀº java.lang.Class Ŭ·¡½º¸¦ È°¿ëÇÏ´Â °ÍÀÌ´Ù.
Á¦³×¸¯½º°¡ Àû¿ëµÈ ÀÚ¹Ù 5.0ÀÇ Å¬·¡½ºµéÀº ´ëºÎºÐ Ä÷º¼Ç ¶óÀ̺귯¸® Ŭ·¡½ºµéÀÌÁö¸¸, Class Ŭ·¡½º¸¦ Æ÷ÇÔÇÏ¿© ThreadLocal, WeakReference µîÀÌ Ãß°¡·Î ÀÖ´Ù.
Class Ŭ·¡½º´Â ÀÚ¹Ù 5.0ÀÇ Á¦³×¸¯½º¿¡¼ Á» µ¶Æ¯ÇÑ ¿ªÇÒÀ» ¼öÇàÇϴµ¥, ÀÌ Á¤º¸´Â ½ÇÇà ½Ã°£±îÁö »ì¾Æ ÀÖ°Ô µÈ´Ù´Â Á¡ÀÌ ´Ù¸¥ Á¦³×¸¯½º¿Í Å©°Ô ´Ù¸¥ Á¡ÀÌ´Ù.
Class<T>¿Í °°ÀÌ Á¦³×¸¯½º ¹æ½ÄÀ¸·Î Ç¥ÇöµÈ ÀÎÀÚ°¡ String.class¸¦ ³Ñ°Ü ¹ÞÀ¸¸é T´Â StringÀÌ µÈ´Ù. Áï, ´ÙÀ½°ú °°ÀÌ °´Ã¼¸¦ »ý¼ºÇÒ ¼ö ÀÖ´Ù.
public static <T> T createObject(Class<T> clazz) throws Exception {
return clazz.newInstance();
}
À¯»çÇÑ ¹æ¹ýÀ¸·Î ¹è¿µµ »ý¼ºÇÒ ¼ö ÀÖ´Ù. ÀÌ °æ¿ì¿¡´Â Array Ŭ·¡½ºÀÇ newInstance() ¸Þ¼Òµå°¡ Object¸¦ ¸®ÅÏÇϱ⠶§¹®¿¡ °æ°í¸¦ ÇÇÇÒ ¼ö ¾ø´Ù´Â °ÍÀÌ ´ÜÁ¡ÀÌ´Ù.
public static <T> T[] createObjectArray(Class<T> clazz, int length) throws Exception {
return (T[]) java.lang.reflect.Array.newInstance(clazz, length);
}
À¯Äè, ºÒÄè µÚ¼¯ÀÎ Á¦³×¸¯½º
ÀÚ¹Ù 5.0À» »ç¿ëÇÏ¸é¼ Á¦³×¸¯½º´Â Àü¸é¿¡ ¿Í´ê´Â ¹®Á¦ÀÌ´Ù.
ÄÚµåÀÇ »ó´ç ºÎºÐ¿¡ ²ª¼è °ýÈ£°¡ ä¿öÁö°Ô µÉ °ÍÀÌ°í, ¶Ç ÄÄÆÄÀÏÇÒ ¶§¸¶´Ù °ÈµÈ ÀÚ·áÇü °Ë»ç¿¡ ´çȲÇÏ°Ô µÉ °ÍÀÌ´Ù. ±×¸®°í ÀÚ¹Ù 5.0À¸·Î °³¹ßÀ» ÇÏ´Â µ¿¾È °áÄÚ À¯ÄèÇÏÁö ¾ÊÀº °æ°í ¸Þ½ÃÁö¿Í Á¾Á¾ ¸¸³ª°Ô µÉ °ÍÀÌ´Ù. ÀÌ °æ°í ¸Þ½ÃÁö´Â ½ÇÁ¦ À߸øµÈ Çü º¯È¯À» ÁöÀûÇÒ ¼öµµ ÀÖÀ¸¹Ç·Î, ½±°Ô ¹«½ÃÇؼ´Â ¾È µÈ´Ù. °¡´ÉÇϸé -Xlint:unchecked ±â´ÉÀ» Ç×»ó ÄÑ°í ÄÄÆÄÀÏÀ» ÇÏ´Â °ÍÀÌ Çö¸íÇÒ °ÍÀÌ´Ù.
Note: Recompile with -Xlint:unchecked for details.
Á¦³×¸¯½º´Â Á÷Á¢ Á¦³×¸¯½º¸¦ Áö¿øÇÏ´Â ÀÚ·á ±¸Á¶¸¦ ¸¸µé·Á°í ÇÏÁö ¾Ê´Â´Ù¸é ±â»Ú°Ô »ç¿ëÇÏ¸é µÇ´Â ¼±¹°ÀÏÁöµµ ¸ð¸¥´Ù. ÇÏÁö¸¸, ÇÁ·Î±×·¡¹ÖÀ̶ó´Â °ÍÀÌ ¾î´À ÇÑÂÊ ÄÒ¿¡¸¸ ¼û¾î Áö³»°Ô ÇÏÁö ¾Ê´Â´Ù. °á±¹ Á¦³×¸¯½ºÀÇ ±íÀº ºÎºÐ, ¾î¼¸é ÀÚ¹Ù Á¦³×¸¯½ºÀÇ ¾îµÎ¿î ºÎºÐ°ú ¸Â´Ú¶ß¸± ÀÏÀÌ ÀÖÀ» °ÍÀÌ´Ù.
ÀÚ¹Ù 5.0ÀÌ ³î¶ó¿î ¼öÇà ¼º´É °³¼±À» º¸ÀÌ¸é¼ ¸ÚÁø ¸ð½ÀÀ¸·Î ´Ù°¡¿Ô´Ù. Á¦³×¸¯½º°¡ ¿ÂÅë À¯ÄèÇÑ ¾ð¾î ±â´ÉÀÌ ¾Æ´ÒÁö´Â ¸ð¸£Áö¸¸, ÀÚ¹Ù 5.0ÀÇ ¸ÚÁø ¸é¸ð¸¦ º¸¿©ÁÖ´Â Áß¿äÇÑ ¿ä¼ÒÀÓ¿¡ ºÐ¸íÇÏ´Ù.
±â´ë¿¡ Á¶±Ý ¸ø ¹ÌÄ¡´Â ¸éµµ ÀÖ°í, »ç½Ç ºÒÇÊ¿äÇÏ°Ô ¾î·Á¿öÁø ºÎºÐµµ ÀÖÁö¸¸, µµ±¸´Â °á±¹ È°¿ëÇÏ´Â »ç¶÷¿¡ ÀÇÇØ ±× °¡Ä¡°¡ µå·¯³ª´Â ¹ýÀ̹ǷΠÀÚ¹Ù 5.0À̶ó´Â µµ±¸¸¦ ÃÖ´ëÇÑ È°¿ëÇÏ¿© ÁÁÀº ¼ÒÇÁÆ®¿þ¾î¸¦ ¸¸µé°í, ¶Ç ´ÙÀ½ ¹öÀü¿¡´Â ´õ ³ªÀº ±â´ÉµéÀÌ Ã¤ÅÃµÉ ¼ö ÀÖµµ·Ï ³ë·ÂÇÏ¸é µÉ °ÍÀÌ´Ù.
Á¤½Å¾øÀÌ ¹Ù»Ú°Ô »ì´Ùº¸´Ï ¹ú½á ÇÑ ÇØ°¡ Àú¹®´Ù. ÄÚ´õ·Î¼, ¼ÒÇÁÆ®¿þ¾î ¿£Áö´Ï¾î·Î¼ »ì¾Æ°¡´Â °Ô Á¤¸» ³ì³ìÇÑ ÀÏÀÌ ¾Æ´Ï´Ù. °³ÀÎÀûÀ¸·Î´Â XML°ú À¥ ¼ºñ½º, ºñÁî´Ï½º ÇÁ·Î¼¼½ºÀÇ ¼ö¸¹Àº ½ºÆåµé°ú ¶Ç ¼ö¸¹Àº ±¸Çöµé°ú ¾¾¸§À» ÇÑ ÇØ¿´´Ù. ¿©·¯ °ø°³ ¼Ò½º ÇÁ·ÎÁ§Æ®µé¿¡¼ º¼ ¼ö ÀÖµíÀÌ, ´É·Â ¶Ù¾î³ ÇѵΠ¸íÀÇ Çå½Å¿¡ µû¶ó ¼ö¸¹Àº ¼ÒÇÁÆ®¿þ¾î°¡ ¸í¸êÇÏ¿´´Ù.
µ¶ÀÚ Á¦À§µéµµ ÇÑ ÇØ Àß ¸¶¹«¸®ÇÏ°í ³»³â ÇÑÇصµ ÁÁÀº ¼ÒÇÁÆ®¿þ¾î ¸¸µå½Ã±æ ºó´Ù.
Âü°íÀÚ·á
1 Generics in the Java Programming Language, Gilad Bracha, July 2004
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
2 Java Specification Requests 14 : Add Generic Types To The JavaTM Programming Language
http://jcp.org/en/jsr/detail?id=14
3 Puzzling Through Erasure, Bruce Eckel, Sep., 2004
http://mindview.net/WebLog/log-0057
4 Puzzling Through Erasure : answer section, Neal Gafter, Sep., 2004
http://gafter.blogspot.com/2004/09/puzzling-through-erasure-answer.html
5 Proposed Changes to the Java Virtual Machine Specification, chapter 4 The class file format
http://java.sun.com/docs/books/vmspec/2nd-edition/ClassFileFormat-final-draft.pdf