item 28 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

Effective Java 3e ์•„์ดํ…œ 28๋ฅผ ์š”์•ฝํ•œ ๋‚ด์šฉ ์ž…๋‹ˆ๋‹ค.

๋ฐฐ์—ด๊ณผ ์ œ๋„ค๋ฆญ ํƒ€์ž…์—๋Š” ์ค‘์š”ํ•œ ์ฐจ์ด๊ฐ€ ๋‘ ๊ฐ€์ง€ ์žˆ๋‹ค.

๋ฐฐ์—ด์€ ๊ณต๋ณ€์ด๋‹ค.

Sub๊ฐ€ Super์˜ ํ•˜์œ„ ํƒ€์ž…์ด๋ผ๋ฉด ๋ฐฐ์—ด Sub[]๋Š” ๋ฐฐ์—ด Super[]์˜ ํ•˜์œ„ ํƒ€์ž…์ด ๋œ๋‹ค. ๋ฐ˜๋ฉด ์ œ๋„ค๋ฆญ์€ ๋ถˆ๊ณต๋ณ€์ด๋‹ค. ์ด๊ฒƒ๋งŒ ๋ณด๋ฉด ์ œ๋„ค๋ฆญ์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์‚ฌ์‹ค ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฑด ๋ฐฐ์—ด ์ชฝ์ด๋‹ค.

Object[] objectArray = new Long[1];
objectArray[0] = "ํƒ€์ž…์ด ๋‹ฌ๋ผ ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค."; // ArrayStoreException์„ ๋˜์ง„๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋„ ์‚ดํŽด ๋ณด์ž

List<Object> ol = new ArrayList<Long>(); // ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ํƒ€์ž…์ด๋‹ค.
ol.add("ํƒ€์ž…์ด ๋‹ฌ๋ผ ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค.");

์–ด๋Š ์ชฝ์ด๋“  Long์šฉ ์ €์žฅ์†Œ์— String์„ ๋„ฃ์„ ์ˆ˜๋Š” ์—†๋‹ค. ๋‹ค๋งŒ ๋ฐฐ์—ด ์—์„œ๋Š” ๊ทธ ์‹ค์ˆ˜๋ฅผ ๋Ÿฐํƒ€์ž„์—์•ผ ์•Œ๊ฒŒ ๋˜์ง€๋งŒ, ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผํ•  ๋•Œ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

๋ฐฐ์—ด์€ ์‹ค์ฒดํ™”๊ฐ€ ๋œ๋‹ค.

๋ฐฐ์—ด์€ ๋Ÿฐํƒ€์ž„์—๋„ ์ž์‹ ์ด ๋‹ด๊ธฐ๋กœ ํ•œ ์›์†Œ์˜ ํƒ€์ž…์„ ์ธ์ง€ํ•˜๊ณ  ํ™•์ธํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ด์ „ ์˜ˆ์ œ์—์„œ ๋ณด๋“ฏ์ด Long ๋ฐฐ์—ด์— String์„ ๋„ฃ์œผ๋ ค ํ•˜๋ฉด ArrayStoreException์ด ๋ฐœ์ƒํ•œ๋‹ค. ๋ฐ˜๋ฉด, ์•ž์„œ ์ด์•ผ๊ธฐํ–ˆ๋“ฏ ์ œ๋„ค๋ฆญ์€ ํƒ€์ž… ์ •๋ณด๊ฐ€ ๋Ÿฐํƒ€์ž„์—๋Š” ์†Œ๊ฑฐ๋œ๋‹ค.

์ด์ƒ์˜ ์ฃผ์š” ์ฐจ์ด๋กœ ์ธํ•ด ๋ฐฐ์—ด๊ณผ ์ œ๋„ค๋ฆญ์€ ์ž˜ ์–ด์šฐ๋Ÿฌ์ง€์ง€ ๋ชปํ•œ๋‹ค. ๋ฐฐ์—ด์€ ์ œ๋„ค๋ฆญ ํƒ€์ž…, ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…, ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ์ฝ”๋“œ๋ฅผ new List<E>[], new List<String>[], new E[] ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๋ฉด ์ปดํŒŒ์ผํ•  ๋•Œ ์ œ๋„ค๋ฆญ ๋ฐฐ์—ด ์ƒ์„ฑ ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚จ๋‹ค.

์ œ๋„ค๋ฆญ ๋ฐฐ์—ด์„ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰์€ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

ํƒ€์ž… ์•ˆ์ „ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™ ์ƒ์„ฑํ•œ ํ˜•๋ณ€ํ™˜ ์ฝ”๋“œ์—์„œ ๋Ÿฐํƒ€์ž„์— ClassCastException์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

E, List<E>, List<String> ๊ฐ™์€ ํƒ€์ž…์„ ์‹ค์ฒดํ™” ๋ถˆ๊ฐ€ ํƒ€์ž…์ด๋ผ ํ•œ๋‹ค. ์‹ค์ฒดํ™” ๋˜์ง€ ์•Š์•„์„œ ๋Ÿฐํƒ€์ž„์—๋Š” ์ปดํŒŒ์ผ ํƒ€์ž„๋ณด๋‹ค ํƒ€์ž… ์ •๋ณด๋ฅผ ์ ๊ฒŒ ๊ฐ€์ง€๋Š” ํƒ€์ž…์ด๋‹ค. ์†Œ๊ฑฐ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋•Œ๋ฌธ์— ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™” ํƒ€์ž… ๊ฐ€์šด๋ฐ ์‹ค์ฒดํ™” ๋  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์€ List<?>์™€ Map<?,?>๊ฐ™์€ ๋น„ ํ•œ์ •์  ์™€์ผ๋“œ ์นด๋“œ ํƒ€์ž…๋ฟ์ด๋‹ค.

๋ฐฐ์—ด์„ ์ œ๋„ค๋ฆญ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†์–ด ๊ท€์ฐฎ์„ ๋•Œ๋„ ์žˆ๋‹ค.

**์ œ๋„ค๋ฆญ ์ปฌ๋ ‰์…˜์—์„œ๋Š” ์ž์‹ ์˜ ์›์†Œ ํƒ€์ž…์„ ๋‹ด์€ ๋ฐฐ์—ด์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒŒ ๋ณดํ†ต์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.** ๋˜ํ•œ ์ œ๋„ค๋ฆญ ํƒ€์ž…๊ณผ ๊ฐ€๋ณ€ ์ธ์ˆ˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ•จ๊ป˜ ์“ฐ๋ฉด ํ•ด์„ํ•˜๊ธฐ ์–ด๋ ค์šด ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ์ด ๋ฌธ์ œ๋Š” @SafeVarargs ์—๋„ˆํ…Œ์ด์…˜์œผ๋กœ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

@SafeVarargs๋Š” ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ?
์ œ๋„ค๋ฆญ์„ ๊ฐ€๋ณ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ ์ž ์žฌ์  ์—๋Ÿฌ์— ๋Œ€ํ•œ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
@SuppressWarning๋ฅผ ์ด์šฉํ•˜์—ฌ ์ œ๋„ค๋ฆญ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๊ฒฝ๊ณ  ๋ฌด์‹œ๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์˜ด

public class JavaExample{  
    @SafeVarargs
    private void print(List... names) {  
        for (List<String> name : names) {  
            System.out.println(name);  
        }  
    }  
    public static void main(String[] args) {  
        JavaExample obj = new JavaExample();  
        List<String> list = new ArrayList<String>();  
        list.add("Kevin");  
        list.add("Rick"); 
        list.add("Negan");
        obj.print(list);  
    }      
}

๋ฐฐ์—ด๋กœ ํ˜•๋ณ€ํ™˜ ํ•  ๋•Œ ์ œ๋„ค๋ฆญ ๋ฐฐ์—ด ์ƒ์„ฑ ์˜ค๋ฅ˜๋‚˜ ๋น„๊ฒ€์‚ฌ ํ˜•๋ณ€ํ™˜ ๊ฒฝ๊ณ ๊ฐ€ ๋œจ๋Š” ๊ฒฝ์šฐ ๋Œ€๋ถ€๋ถ„์€ ๋ฐฐ์—ด์ธ E[] ๋Œ€์‹  ์ปฌ๋ ‰์…˜์ธ List<E>๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๊ฒฐ๋œ๋‹ค. ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๋ณต์žกํ•ด์ง€๊ณ  ์„ฑ๋Šฅ์ด ์‚ด์ง ๋‚˜๋น ์งˆ ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ทธ ๋Œ€์‹  ํƒ€์ž… ์•ˆ์ „์„ฑ๊ณผ ์ƒํ˜ธ ์šด์šฉ์„ฑ์€ ์ข‹์•„์ง„๋‹ค.

public class Chooser {
    private final Object[] choiceArray;

    public Chooser(Collection<T> choices) {
    choiceArray = choises.toArray();
    }

    public Object choose() {
    Random rnd = ThreadLocalRandom.current();
    return choiceArray[rnd.nectint(choiceArray.length)];
    }
}

์œ„ ํด๋ž˜์Šค๋Š” ๋งค๋ฒˆ ํ˜• ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋‹ˆ ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์š”ํ•˜๋‹ค.

public class Chooser<T> {
    private final List<T> choiceList;

    public Chooser(Collection choices) {
    choiceList = new ArrayList<>(choises);
    }

    public Object choose() {
    Random rnd = ThreadLocalRandom.current();
    return choiceList.get(rnd.nextint(choiceList.size()));
    }
}

์ด์ „ ์˜ˆ์ œ๋ณด๋‹ค ์ฝ”๋“œ์–‘์ด ์กฐ๊ธˆ ๋Š˜์—ˆ๊ณ  ์•„๋งˆ๋„ ์กฐ๊ธˆ ๋” ๋Š๋ฆด ํ…Œ์ง€๋งŒ, ๋Ÿฐํƒ€์ž„์— ClassCastException์„ ๋งŒ๋‚  ์ผ์€ ์—†์œผ๋‹ˆ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค.

์ •๋ฆฌ

์ œ๋„ค๋ฆญ์€ ๋ถˆ๊ณต๋ณ€์ด๊ณ  ํƒ€์ž… ์ •๋ณด๊ฐ€ ์†Œ๊ฑฐ๋œ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ ๋ฐฐ์—ด์€ ๋Ÿฐํƒ€์ž„์—๋Š” ํƒ€์ž… ์•ˆ์ „ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ ํƒ€์ž„์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค. ์ œ๋„ค๋ฆญ์€ ๋ฐ˜๋Œ€๋‹ค. ๊ทธ๋ž˜์„œ ๋‘˜์„ ์„ž์–ด ์“ฐ๊ธฐ๋ž€ ์‰ฝ์ง€ ์•Š๋‹ค. ๋‘˜์„ ์„ž์–ด ์“ฐ๋‹ค๊ฐ€ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋‚˜ ๊ฒฝ๊ณ ๋ฅผ ๋งŒ๋‚˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € ๋ฐฐ์—ด์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•ด๋ณด์ž.

์ถœ์ฒ˜

โš ๏ธ **GitHub.com Fallback** โš ๏ธ