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

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

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

์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ํ•˜๋‚˜ ์ •์˜ํ•˜๋ฉด ๊ทธ์— ๋”ธ๋ฆฐ ๋กœ ํƒ€์ž…(raw type)๋„ ํ•จ๊ป˜ ์ •์˜๋œ๋‹ค. ๋กœ ํƒ€์ž…์ด๋ž€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์—์„œ ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ๋ฅผ ๋งํ•œ๋‹ค.

public class StampCollection {
    private final Collection stamps = ...;

    public static void main(String[] args) {
    StampCollection stamps = new StampCollection();
    // ์‹ค์ˆ˜๋กœ ๋™์ „์„ ๋„ฃ๋Š”๋‹ค.
    stamps.add(new Coin(...)); // "unchecked call" ๊ฒฝ๊ณ ๋ฅผ ๋‚ด๋ฑ‰๋Š”๋‹ค.

    for (Iterator i = stamps.iterator(); i.hasNext();) {
        Stamp stamp = (Stamp) i.next(); // ClassCastException์„ ๋˜์ง„๋‹ค.
        stamp.cancel();
    }
}

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

์ด๋ ‡๋“ฏ ๋กœ ํƒ€์ž…(ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…)์„ ์“ฐ๋Š” ๊ฑธ ์–ธ์–ด ์ฐจ์›์—์„œ ๋ง‰์•„ ๋†“์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์ ˆ๋Œ€๋กœ ์จ์„œ๋Š” ์•ˆ ๋œ๋‹ค. ๋กœ ํƒ€์ž…์„ ์“ฐ๋ฉด ์ œ๋„ค๋ฆญ์ด ์•ˆ๊ฒจ์ฃผ๋Š” ์•ˆ์ „์„ฑ๊ณผ ํ‘œํ˜„๋ ฅ์„ ๋ชจ๋‘ ์ฝ๊ฒŒ ๋œ๋‹ค.

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

List์™€ List<Object>์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?

List๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์—์„œ ์™„์ „ํžˆ ๋ฐœ์„ ๋บ€ ๊ฒƒ์ด๊ณ , List<Object>๋Š” ๋ชจ๋“  ํƒ€์ž…์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์˜์‚ฌ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ์— ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•œ ๊ฒƒ์ด๋‹ค. ์ฆ‰, List<String>์€ ๋กœ ํƒ€์ž…์ธ List์˜ ํ•˜์œ„ ํƒ€์ž…์ด์ง€๋งŒ, List<Object>์˜ ํ•˜์œ„ ํƒ€์ž…์€ ์•„๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, List<Object> ๊ฐ™์€ ๋งค๊ฐœ ๋ณ€์ˆ˜ ํ™” ํƒ€์ž…์„ ์‚ฌ์šฉํ•  ๋•Œ์™€ ๋‹ฌ๋ฆฌ List ๊ฐ™์€ ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์žƒ๊ฒŒ ๋œ๋‹ค.

static int numElementsInCommon(Set s1, Set s2) {
    int result = 0;
    for (Object o1 : s1)
    if (s2.contains(o1))
        result++;
    return result;
}

์ด ๋ฉ”์„œ๋“œ๋Š” ๋™์ž‘์€ ํ•˜์ง€๋งŒ ๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•ด ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค. ๋”ฐ๋ผ์„œ ๋น„ ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์„ ๋Œ€์‹  ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค.

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

Set๊ณผ Set<?>์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?

์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์€ ์•ˆ์ „ํ•˜๊ณ , ๋กœ ํƒ€์ž…์€ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค. ๋กœ ํƒ€์ž… ์ปฌ๋ ‰์…˜์—๋Š” ์•„๋ฌด ์›์†Œ๋‚˜ ๋„ฃ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ํƒ€์ž… ๋ถˆ๋ณ€์‹์„ ํ›ผ์†ํ•˜๊ธฐ ์‰ฝ๋‹ค. ๋ฐ˜๋ฉด, Collection<?>์—๋Š” (null ์™ธ์—๋Š”) ์–ด๋–ค ์›์†Œ๋„ ๋„ฃ์„ ์ˆ˜ ์—†๋‹ค. ๋‹ค๋ฅธ ์›์†Œ๋ฅผ ๋„ฃ์œผ๋ ค ํ•˜๋ฉด ์ปดํŒŒ์ผํ•  ๋•Œ ๋‹ค์Œ์˜ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

WildCard.java:13: error: incompatible types: String cannot be
converted to CAP#1
    c.add("verboten");
        ^

์ฆ‰, ์ปฌ๋ ‰์…˜์˜ ํƒ€์ž… ๋ถˆ๋ณ€์‹์„ ํ›ผ์†ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋ง‰์•˜๋‹ค.

๋กœ ํƒ€์ž…์„ ์“ฐ์ง€ ๋ง๋ผ๋Š” ๊ทœ์น™์—๋„ ์˜ˆ์™ธ๋Š” ์žˆ๋‹ค.

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

  • ํ—ˆ์šฉ : List.class, String[].class, int.class
  • ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ : List.class, List<?>.class

๋˜ ๋‹ค๋ฅธ ์ด์œ ๋Š” ๋Ÿฐํƒ€์ž„์—๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์ •๋ณด๊ฐ€ ์ง€์›Œ์ง€๋ฏ€๋กœ instanceof ์—ฐ์‚ฌ์ž๋Š” ๋น„ ํ•œ์ •์  ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž… ์ด์™ธ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์—๋Š” ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค. ๋น„ ํ•œ์ •์  ์™€์ผ๋“œ ์นด๋“œ ํƒ€์ž…์˜ ๊บฝ์‡  ๊ด„ํ˜ธ์™€ ๋ฌผ์Œํ‘œ๋Š” ์•„๋ฌด๋Ÿฐ ์—ญํ•  ์—†์ด ์ฝ”๋“œ๋งŒ ์ง€์ €๋ถ„ํ•˜๊ฒŒ ๋งŒ๋“œ๋ฏ€๋กœ, ์ฐจ๋ผ๋ฆฌ ๋กœ ํƒ€์ž…์„ ์“ฐ๋Š” ํŽธ์ด ๊น”๋”ํ•˜๋‹ค.

if (o instanceof Set) {
    Set<?> s = (Set<?>) o;
    ...
}

์ •๋ฆฌ

๋กœ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋Ÿฐํƒ€์ž„์— ์˜ˆ์™ธ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ ๋œ๋‹ค. ๋กœ ํƒ€์ž…์€ ์ œ๋„ค๋ฆญ์ด ๋„์ž…๋˜๊ธฐ ์ด์ „ ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์ œ๊ณต๋  ๋ฟ์ด๋‹ค. Set<Object>๋Š” ์–ด๋–ค ํƒ€์ž…์˜ ๊ฐ์ฒด๋„ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์ด๊ณ , Set<?>๋Š” ๋ชจ์ข…์˜ ํƒ€์ž… ๊ฐ์ฒด๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์ด๋‹ค.

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