item 26 junghyunlyoo - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

์ œ๋„ค๋ฆญ ๊ด€๋ จ ์šฉ์–ด ์ •๋ฆฌ

๋งํฌ

ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ์— ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์“ฐ์ด๋ฉด ์ด๋ฅผ ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค ํ˜น์€ ์ œ๋„ค๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค๋ผ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, List ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์›์†Œ์˜ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ E๋ฅผ ๋ฐ›๋Š”๋‹ค.

์ด List ์ธํ„ฐํŽ˜์ด์Šค์˜ ์™„์ „ํ•œ ์ด๋ฆ„์€ List์ด๋‹ค. ํ•˜์ง€๋งŒ ์งง๊ฒŒ List ๋ผ๊ณ ๋„ ์ž์ฃผ ์“ด๋‹ค.

์ œ๋„ค๋ฆญ ํด๋ž˜์Šค์™€ ์ œ๋„ค๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ‹€์–ด ์ œ๋„ค๋ฆญ ํƒ€์ž…(generic type)์ด๋ผ ํ•œ๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…

๊ฐ๊ฐ์˜ ์ œ๋„ค๋ฆญ ํƒ€์ž…์€ ์ผ๋ จ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์„ ์ •์˜ํ•œ๋‹ค.

๋จผ์ € ํด๋ž˜์Šค๋‚˜ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์ด ๋‚˜์˜ค๊ณ  ์ด์–ด์„œ ๊บพ์‡ ๊ด„ํ˜ธ ์•ˆ์— ์‹ค์ œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์„ ๋‚˜์—ดํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด List์€ ์›์†Œ์˜ ํƒ€์ž…์ด String์ธ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋œปํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์ด๋‹ค.

์—ฌ๊ธฐ์„œ String์ด ์ •๊ทœ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ E์— ํ•ด๋‹นํ•˜๋Š” ์‹ค์ œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋‹ค.

๋กœ ํƒ€์ž…

์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ํ•˜๋‚˜ ์ •์˜ํ•˜๋ฉด ๊ทธ์— ๋”ธ๋ฆฐ ๋กœ ํƒ€์ž…๋„ ํ•จ๊ป˜ ์ •์˜๋œ๋‹ค.

๋กœ ํƒ€์ž…์ด๋ž€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์—์„œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ๋ฅผ ๋งํ•œ๋‹ค.

์˜ˆ์ปจ๋Œ€ List์˜ ๋กœ ํƒ€์ž…์€ List๋‹ค.

๋กœ ํƒ€์ž…์€ ํƒ€์ž… ์„ ์–ธ์—์„œ ์ œ๋„ค๋ฆญ ํƒ€์ž… ์ •๋ณด๊ฐ€ ์ „๋ถ€ ์ง€์›Œ์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค.

์ด๋Š” ์ œ๋„ค๋ฆญ์ด ๋„๋ž˜ํ•˜๊ธฐ ์ „์˜ ์ฝ”๋“œ์™€ ํ˜ธํ™˜๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ถ์—ฌ์ง€์ฑ…์ด๋‹ค.

๋กœ ํƒ€์ž…์˜ ๋‹จ์  :: ClassCastException

์ œ๋„ค๋ฆญ์„ ์ง€์›ํ•˜๊ธฐ ์ „์—๋Š” ์ปฌ๋ ‰์…˜์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ ์–ธํ–ˆ๋‹ค.

์ž๋ฐ” 9์—์„œ๋„ ์—ฌ์ „ํžˆ ๋™์ž‘ํ•˜์ง€๋งŒ ์ข‹์€ ์˜ˆ๋ผ๊ณ  ๋ณผ ์ˆœ ์—†๋‹ค.

private final Collection stamps = ...;

์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ˆ˜๋กœ ๋„์žฅ(stamp) ๋Œ€์‹  ๋™์ „(Coin)์„ ๋„ฃ์–ด๋„ ์•„๋ฌด ์˜ค๋ฅ˜์—†์ด ์ปดํŒŒ์ผ๋˜๊ณ  ์‹คํ–‰๋œ๋‹ค.

(์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจํ˜ธํ•œ ๊ฒฝ๊ณ  ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ธด ํ•  ๊ฒƒ์ด๋‹ค)

stamps.add(new Coin());

์ด ๋™์ „์„ ์ปฌ๋ ‰์…˜์—์„œ ๋‹ค์‹œ ๊บผ๋‚ด๊ธฐ ์ „์—๋Š” ์˜ค๋ฅ˜๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค.

for (Iterator i = stamps.iterator(); i.hasNext(); ) {
    Stamp stamp = (Stamp) i.next(); //ClassCastException
}

์˜ค๋ฅ˜๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๋ฐœ์ƒ ์ฆ‰์‹œ, ์ด์ƒ์ ์œผ๋กœ๋Š” ์ปดํŒŒ์ผํ•  ๋•Œ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

์ด ์˜ˆ์—์„œ๋Š” ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ  ํ•œ์ฐธ ๋’ค์ธ ๋Ÿฐํƒ€์ž„์—์•ผ ์•Œ์•„์ฑŒ ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ๋Ÿฐํƒ€์ž„์— ๋ฌธ์ œ๋ฅผ ๊ฒช๋Š” ์ฝ”๋“œ์™€ ์›์ธ์„ ์ œ๊ณตํ•œ ์ฝ”๋“œ๊ฐ€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ์ƒ๋‹นํžˆ ๋–จ์–ด์ ธ ์žˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์ปค์ง„๋‹ค.

ClassCastException์ด ๋ฐœ์ƒํ•˜๋ฉด stamps์— ๋™์ „์„ ๋„ฃ์€ ์ง€์ ์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ฝ”๋“œ ์ „์ฒด๋ฅผ ํ›‘์–ด๋ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.


์ œ๋„ค๋ฆญ์„ ํ™œ์šฉํ•˜๋ฉด ์ด ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

private final Collection<Stamp> stamps = ...;

์ด๋ ‡๊ฒŒ ์„ ์–ธํ•˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” stamps์—๋Š” Stamp์˜ ์ธ์Šคํ„ด์Šค๋งŒ ๋„ฃ์–ด์•ผ ํ•จ์„ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ธ์ง€ํ•˜๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์•„๋ฌด๋Ÿฐ ๊ฒฝ๊ณ  ์—†์ด ์ปดํŒŒ์ผ๋œ๋‹ค๋ฉด ์˜๋„๋Œ€๋กœ ๋™์ž‘ํ•  ๊ฒƒ์ž„์„ ๋ณด์žฅํ•œ๋‹ค.

(๋ฌผ๋ก  ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๋ฅผ ์ˆจ๊ธฐ์ง€ ์•Š์•˜์–ด์•ผ ํ•œ๋‹ค. item 27)

stamps์— Stamp ์ด์™ธ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋„ฃ์œผ๋ ค ํ•˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉฐ ๋ฌด์—‡์ด ์ž˜๋ชป๋๋Š”์ง€๋ฅผ ์ •ํ™•ํžˆ ์•Œ๋ ค์ค€๋‹ค.


์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ปฌ๋ ‰์…˜์—์„œ ์›์†Œ๋ฅผ ๊บผ๋‚ด๋Š” ๋ชจ๋“  ๊ณณ์— ๋ณด์ด์ง€ ์•Š๋Š” ํ˜•๋ณ€ํ™˜์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ ˆ๋Œ€ ์‹คํŒจํ•˜์ง€ ์•Š์Œ์„ ๋ณด์žฅํ•œ๋‹ค.

Stamp์šฉ ์ปฌ๋ ‰์…˜์— Coin์„ ๋„ฃ๋Š”๋‹ค๋Š” ์˜ˆ๊ฐ€ ์–ต์ง€์Šค๋Ÿฌ์›Œ ๋ณด์ด๊ฒ ์ง€๋งŒ ํ˜„์—…์—์„œ๋„ ์ข…์ข… ์ผ์–ด๋‚˜๋Š” ์ผ์ด๋‹ค.

(BigDecimal์šฉ ์ปฌ๋ ‰์…˜์— BigInteger๋ฅผ ๋„ฃ๋Š” ๊ฒฝ์šฐ ๋“ฑ)

๋กœ ํƒ€์ž…์˜ ์กด์žฌ ์ด์œ  :: ํ˜ธํ™˜์„ฑ

๋กœํƒ€์ž…์„ ์“ฐ๋Š” ๊ฑธ ์–ธ์–ด ์ฐจ์›์—์„œ ๋ง‰์•„ ๋†“์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์ ˆ๋Œ€๋กœ ์จ์„œ๋Š” ์•ˆ ๋œ๋‹ค.

๋กœ ํƒ€์ž…์„ ์“ฐ๋ฉด ์ œ๋„ค๋ฆญ์ด ์•ˆ๊ฒจ์ฃผ๋Š” ์•ˆ์ •์„ฑ๊ณผ ํ‘œํ˜„๋ ฅ์„ ๋ชจ๋‘ ์žƒ๊ฒŒ ๋œ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋กœ ํƒ€์ž…์€ ์™œ ์กด์žฌํ•˜๋Š” ๊ฑธ๊นŒ? ๋ฐ”๋กœ ํ˜ธํ™˜์„ฑ ๋•Œ๋ฌธ์ด๋‹ค.

์ž๋ฐ”๊ฐ€ ์ œ๋„ค๋ฆญ์„ ๋ฐ›์•„๋“ค์ด๊ธฐ๊นŒ์ง€ ๊ฑฐ์˜ 10๋…„์ด ๊ฑธ๋ ธ๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋„ค๋ฆญ ์—†์ด ์ง  ์ฝ”๋“œ๊ฐ€ ์ด๋ฏธ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ˆ˜์šฉํ•˜๋ฉด์„œ ์ œ๋„ค๋ฆญ์„ ์‚ฌ์šฉํ•˜๋Š” ์ƒˆ๋กœ์šด ์ฝ”๋“œ์™€๋„ ๋งž๋ฌผ๋ ค ๋Œ์•„๊ฐ€๊ฒŒ ํ•ด์•ผ๋งŒ ํ–ˆ๋‹ค.

๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ์— ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋„˜๊ฒจ๋„ (ํ˜น์€ ๊ทธ ๋ฐ˜๋Œ€๋„) ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•ด์•ผ๋งŒ ํ–ˆ๋˜ ๊ฒƒ์ด๋‹ค.

์ด ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๋กœ ํƒ€์ž…์„ ์ง€์›ํ•˜๊ณ  ์ œ๋„ค๋ฆญ ๊ตฌํ˜„์—๋Š” ์†Œ๊ฑฐ(erasure; item 28) ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.

List vs List

List๊ฐ™์€ ๋กœ ํƒ€์ž…์€ ์‚ฌ์šฉํ•ด์„œ๋Š” ์•ˆ ๋˜๋‚˜, List์ฒ˜๋Ÿผ ์ž„์˜ ๊ฐ์ฒด๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์€ ๊ดœ์ฐฎ๋‹ค.

๋กœ ํƒ€์ž…์ธ List์™€ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์ธ List์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?

List๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์—์„œ ์™„์ „ํžˆ ๋ฐœ์„ ๋บ€ ๊ฒƒ์ด๊ณ 

List๋Š” ๋ชจ๋“  ํƒ€์ž…์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์˜์‚ฌ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•œ ๊ฒƒ์ด๋‹ค.

๋งค๊ฐœ๋ณ€์ˆ˜๋กœ List๋ฅผ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ์— List์„ ๋„˜๊ธธ ์ˆ˜ ์žˆ์ง€๋งŒ

List๋ฅผ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ์—๋Š” ๋„˜๊ธธ ์ˆ˜ ์—†๋‹ค.

์ด๋Š” ์ œ๋„ค๋ฆญ์˜ ํ•˜์œ„ ํƒ€์ž… ๊ทœ์น™ ๋•Œ๋ฌธ์ด๋‹ค.

์ฆ‰, List์€ ๋กœ ํƒ€์ž…์ธ List์˜ ํ•˜์œ„ ํƒ€์ž…์ด์ง€๋งŒ List์˜ ํ•˜์œ„ ํƒ€์ž…์€ ์•„๋‹ˆ๋‹ค. (item 28)

๊ทธ ๊ฒฐ๊ณผ, List ๊ฐ™์€ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๋‹ฌ๋ฆฌ List ๊ฐ™์€ ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์žƒ๊ฒŒ ๋œ๋‹ค.

๋‹ค์Œ์€ ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•œ, ๋Ÿฐํƒ€์ž„์— ์‹คํŒจํ•˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

public class Raw {
    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        unsafeAdd(strings, Integer.valueOf(42));
        String s = strings.get(0); // ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ํ˜•๋ณ€ํ™˜ ์ฝ”๋“œ๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
    }

    private static void unsafeAdd(List list, Object o) {
        list.add(o);

    }
}

์ด ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ์€ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋กœ ํƒ€์ž…์ธ List๋ฅผ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ๊ณ  ๋ฌธ๊ตฌ๊ฐ€ ์ƒ๊ธด๋‹ค.

์ด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๋ฉด strings.get(0)์˜ ๊ฒฐ๊ณผ๋ฅผ ํ˜•๋ณ€ํ™˜ํ•˜๋ ค ํ•  ๋•Œ ClassCastException์„ ๋˜์ง„๋‹ค.

Integer๋ฅผ String์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋ ค ์‹œ๋„ํ•œ ๊ฒƒ์ด๋‹ค.

์ด ํ˜• ๋ณ€ํ™˜์€ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€ ๊ฒƒ์ด๋ผ ๋ณดํ†ต์€ ์‹คํŒจํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—” ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์‹œํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„์— ์‹คํŒจํ•œ๋‹ค.

๋กœ ํƒ€์ž…์ธ List๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์ธ List๋กœ ๋ฐ”๊พผ ๋‹ค์Œ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ด๋ณด์ž.

์˜ค๋ฅ˜ ๋ฉ”์„ธ์ง€ํ™” ํ•จ๊ป˜ ์ปดํŒŒ์ผ ์กฐ์ฐจ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

๋กœ ํƒ€์ž… vs ๋น„ํ•œ์ •์  ์™€์ผ๋“œ ์นด๋“œ ํƒ€์ž…

์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์“ฐ๊ณ  ์‹ถ์ง€๋งŒ ์‹ค์ œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์‹ ๊ฒฝ ์“ฐ๊ณ  ์‹ถ์ง€ ์•Š๋‹ค๋ฉด ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  '?'๋ฅผ ์‚ฌ์šฉํ•˜์ž.

๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž… ๊ด€๋ จ ์˜ค๋ฅ˜๋ฅผ '๋Ÿฐํƒ€์ž„์—' ๋งˆ์ฃผ์น  ์ˆ˜ ์žˆ์Œ์„ ๋ช…์‹ฌํ•˜์ž!

์˜ˆ์ปจ๋Œ€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์ธ Set์˜ ๋น„ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์€ Set<?>๋‹ค.

์ด๊ฒƒ์ด ์–ด๋–ค ํƒ€์ž…์ด๋ผ๋„ ๋‹ด์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋ฒ”์šฉ์ ์ธ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” Set ํƒ€์ž…์ด๋‹ค.

๋‹ค์Œ์€ ๋น„ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ์„ ์–ธํ•œ ๋ฉ”์†Œ๋“œ์ด๋‹ค.

static int numElementsInCommon(Set<?> s1, Set<?> s2){
    
}

๋น„ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์ธ Set<?>์™€ ๋กœ ํƒ€์ž…์ธ Set์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?

๋ฌผ์Œํ‘œ๊ฐ€ ๋ฌด์–ธ๊ฐ€ ๋ฉ‹์ง„ ์ผ์„ ํ•ด์ฃผ๋Š” ๊ฑธ๊นŒ?

ํŠน์ง•์„ ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์€ ์•ˆ์ „ํ•˜๊ณ , ๋กœ ํƒ€์ž…์€ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค.

๋กœ ํƒ€์ž… ์ปฌ๋ ‰์…˜์—๋Š” ์•„๋ฌด ์›์†Œ๋‚˜ ๋„ฃ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ํƒ€์ž… ๋ถˆ๋ณ€์‹์„ ํ›ผ์†ํ•˜๊ธฐ ์‰ฝ๋‹ค.

๋ฐ˜๋ฉด, Collection<?>์—๋Š” (null ์™ธ์—๋Š”) ์–ด๋–ค ์›์†Œ๋„ ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค.

์‹ฌ์ง€์–ด ๊บผ๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์˜ ํƒ€์ž…๋„ ์ „ํ˜€ ์•Œ ์ˆ˜ ์—†๋‹ค.

์ด๋Ÿฌํ•œ ์ œ์•ฝ์„ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์—†๋‹ค๋ฉด ์ œ๋„ค๋ฆญ ๋ฉ”์„œ๋“œ(item 30)๋‚˜ ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…(item 31)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

์™€์ผ๋“œ์นด๋“œ์— ์™œ ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์—†์„๊นŒ?

[์™€์ผ๋“œ์นด๋“œ์™€ ์ •๊ทœ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์ฐจ์ด](https://github.com/JAVA-JIKIMI/EFFECTIVE-JAVA3/wiki/wildcard_vs_formalTypeParameter-JungHyunLyoo)

๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด๋„ ๋˜๋Š” ๊ฒฝ์šฐ 1 :: class ๋ฆฌํ„ฐ๋Ÿด

class ๋ฆฌํ„ฐ๋Ÿด์—๋Š” ๋กœ ํƒ€์ž…์„ ์จ์•ผ ํ•œ๋‹ค.

์ž๋ฐ” ๋ช…์„ธ๋Š” class ๋ฆฌํ„ฐ๋Ÿด์— ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ–ˆ๋‹ค. (๋ฐฐ์—ด๊ณผ ๊ธฐ๋ณธ ํƒ€์ž…์€ ํ—ˆ์šฉํ•œ๋‹ค)

์˜ˆ๋ฅผ ๋“ค์–ด List.class, String[].class, int.class๋Š” ํ—ˆ์šฉํ•˜๊ณ 

List.class์™€ List<?>.class๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด๋„ ๋˜๋Š” ๊ฒฝ์šฐ 2 :: instanceof

๋Ÿฐํƒ€์ž„์—๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž… ์ •๋ณด๊ฐ€ ์ง€์›Œ์ง€๋ฏ€๋กœ instanceof ์—ฐ์‚ฐ์ž๋Š” ๋น„ํ•œ์ •์  ์™€์ผ๋“œ ์นด๋“œ ํƒ€์ž… ์ด์™ธ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์—๋Š” ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋กœ ํƒ€์ž…์ด๋“  ๋น„ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์ด๋“  instanceof๋Š” ์™„์ „ํžˆ ๋˜‘๊ฐ™์ด ๋™์ž‘ํ•œ๋‹ค

๋น„ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์˜ ๊บพ์‡ ๊ด„ํ˜ธ์™€ ๋ฌผ์Œํ‘œ๋Š” ์•„๋ฌด๋Ÿฐ ์—ญํ•  ์—†์ด ์ฝ”๋“œ๋งŒ ์ง€์ €๋ถ„ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.

์ด๋Ÿฐ ๊ฒฝ์šฐ์—” ์ฐจ๋ผ๋ฆฌ ๋กœ ํƒ€์ž…์„ ์“ฐ๋Š” ํŽธ์ด ๊น”๋”ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์— instanceof๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ์˜ˆ๋‹ค.

if (o instanceof Set) {
    Set<?> s = (Set<?>) o;
}
โš ๏ธ **GitHub.com Fallback** โš ๏ธ