Å×Å©´ÏÄà Ä÷³-ÀÚ¹Ù

ÀÚ¹Ù Á¦³×¸¯½º

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