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

Raw ํƒ€์ž…(ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…)์€ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ

์ œ๋„ค๋ฆญ ํด๋ž˜์Šค ํ˜น์€ ์ œ๋„ค๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค๋ž€?

ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค ์„ ์–ธ์— ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜(type parameter)๊ฐ€ ์“ฐ์ผ ๊ฒฝ์šฐ

List ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์›์†Œ์˜ ํƒ€์ž…์„ ๋‚˜ํƒ€๋‚ด๋Š” ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜ E๋ฅผ ๋ฐ›๋Š”๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์˜ ์™„์ „ํ•œ ์ด๋ฆ„์€ List์ง€๋งŒ ์งง๊ฒŒ ๊ทธ๋ƒฅ List ๋ผ๊ณ ๋„ ์ž์ฃผ์“ด๋‹ค.

  • ์ œ๋„ค๋ฆญ ํƒ€์ž…์€ ์ผ๋ จ์˜ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์„ ์ •์˜ํ•œ๋‹ค. (ํด๋ž˜์Šค/์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„ + <ํƒ€์ž…>)
  • Raw type์ด๋ž€ List์˜ Raw ํƒ€์ž…์€ List๋‹ค.
  • Raw type์€ ํƒ€์ž… ์„ ์–ธ์—์„œ ์ œ๋„ค๋ฆญ ํƒ€์ž… ์ •๋ณด๊ฐ€ ์ „๋ถ€ ์ง€์›Œ์ง„ ๊ฒƒ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋Š”๋ฐ ์ œ๋„ค๋ฆญ์ด ๋„๋ž˜ํ•˜๊ธฐ ์ „ ์ฝ”๋“œ์™€ ํ˜ธํ™˜๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ถ์—ฌ์ง€์ฑ…์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Raw type๋„ ํ•จ๊ป˜ ์ •์˜๋œ๋‹ค.
[before] ์ปฌ๋ ‰์…˜์˜ Raw ํƒ€์ž… - ๋”ฐ๋ผํ•˜์ง€ ๋ง ๊ฒƒ!
private final Collection stamps = ...;

// ์ด ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ˆ˜๋กœ ๋„์žฅ(Stamp) ๋Œ€์‹  ๋™์ „(Coin)์„ ๋„ฃ์–ด๋„ ์•„๋ฌด ์˜ค๋ฅ˜ ์—†์ด ์ปดํŒŒ์ผ๋˜๊ณ  ์‹คํ–‰๋œ๋‹ค.(์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋ชจํ˜ธํ•œ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๊ธด ํ•  ๊ฒƒ์ด๋‹ค.)
stamps.add(new Coin(...));  // "unchecked call" ๊ฒฝ๊ณ ๋ฅผ ๋‚ด๋ฑ‰๋Š”๋‹ค. 

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

[before] ๋ฐ˜๋ณต์ž์˜ ๋กœ ํƒ€์ž… - ๋”ฐ๋ผํ•˜์ง€ ๋ง ๊ฒƒ!
for (Iterator i = stamps.iterator(); i.hasNext();) {
    Stamp stamp = (Stamp) i.next();   // ClassCastException ์„ ๋˜์ง„๋‹ค. 
    stamp.cancel();
}

[after] ๋งค๊ฐœ๋ณ€์ˆ˜ํ™”๋œ ์ปฌ๋ ‰์…˜ ํƒ€์ž… - ํƒ€์ž… ์•ˆ์ „์„ฑ ํ™•๋ณด
private final Collection<Stamp> stamps = ...;

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

Test.java:9: error: incompatible types: Coin cannot be converted to Stamp
stamp.add(new Coin());

// Stamp์šฉ ์ปฌ๋ ‰์…˜์— Coin์„ ๋„ฃ๋Š”๋‹ค๋Š” ์˜ˆ์‹œ
// ์˜ˆ๋ฅผ ๋“ค์–ด BigDecimal์šฉ ์ปฌ๋ ‰์…˜์— BigInteger๋ฅผ ๋„ฃ๋Š” ์‹ค์ˆ˜๋Š” ๊ทธ๋ฆฌ ์–ต์ง€ ๊ฐ™์ง€ ์•Š์„ ๊ฒƒ
// ๋กœํƒ€์ž…(ํƒ€์ž… ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…)์„ ์“ฐ๋Š” ๊ฑธ ์–ธ์–ด ์ฐจ์›์—์„œ ๋ง‰์•„ ๋†“์ง€๋Š” ์•Š์•˜์ง€๋งŒ ์ ˆ๋Œ€๋กœ ์จ์„œ๋Š” ์•ˆ๋œ๋‹ค. 
// ๋กœ ํƒ€์ž…์„ ์“ฐ๋ฉด ์ œ๋„ค๋ฆญ์ด ์•ˆ๊ฒจ์ฃผ๋Š” ์•ˆ์ „์„ฑ๊ณผ ํ‘œํ˜„๋ ฅ์„ ๋ชจ๋‘ ์žƒ๊ฒŒ ๋œ๋‹ค. 

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

๊ดœ์ฐฎ๋‹ค.

  • Raw ํƒ€์ž…์ธ List์™€ ๋งค๊ฐœ๋ณ€์ˆ˜ํ™” ํƒ€์ž…์€ List์˜ ์ฐจ์ด

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

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

์ œ๋„ค๋ฆญ์˜ ํ•˜์œ„ ํƒ€์ž… ๊ทœ์น™

List์€ Raw ํƒ€์ž…์ธ List์˜ ํ•˜์œ„ ํƒ€์ž…์ด์ง€๋งŒ List์˜ ํ•˜์œ„ ํƒ€์ž…์€ ์•„๋‹ˆ๋‹ค.

// ์ฝ”๋“œ 26-4 ๋Ÿฐํƒ€์ž„์— ์‹คํŒจํ•œ๋‹ค. - unsafeAdd ๋ฉ”์„œ๋“œ๊ฐ€ Raw ํƒ€์ž…(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);     // [unchecked] call to add(E) as member of the raw type List
    } 
}

ํ•ต์‹ฌ ์ •๋ฆฌ

Raw ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋Ÿฐํƒ€์ž„์— ์˜ˆ์™ธ๊ฐ€ ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์‚ฌ์šฉํ•˜๋ฉด ์•ˆ๋œ๋‹ค. 
Set<Object>์™€ Set<?>์€ ์•ˆ์ „ํ•˜์ง€๋งŒ ๋กœ ํƒ€์ž…์ธ Set์€ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค. 
โš ๏ธ **GitHub.com Fallback** โš ๏ธ