Item 26. Raw Type

Raw Type์€ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ

์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์ •์˜ํ•˜๊ฒŒ ๋˜๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜ ํƒ€์ž…์ด ์ •์˜๋˜์ง€ ์•Š์€ Raw Type์ด๋ผ๋Š” ๊ฒƒ์ด ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค.(List<E> -> List) ์ด๋Ÿฌํ•œ Raw Type์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ทธ๋ƒฅ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋„์šฐ๊ฒŒ ๋œ๋‹ค.(๊ทธ๋งŒํผ ์œ„ํ—˜ํ•œ ์•ˆํ‹ฐ ํŒจํ„ด)

class Main {
    public static void main(String[] args) {
        List list = new ArrayList(); // Raw use of parameterized class 'List'
        list.add("Hello"); // Unchecked call to 'add(E)' as a member of raw type 'java.util.List'
        Object o = list.get(0);// ์ปดํŒŒ์ผ๋Ÿฌ ๊ฒฝ๊ณ 
        System.out.println(o);
        Integer i = (Integer) o; // ์ปดํŒŒ์ผ ์„ฑ๊ณต, ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ
        System.out.println(i);
    }
}

ํ•˜์ง€๋งŒ ์—ญ์‹œ ํƒ€์ž… ๋ณ€ํ™˜์„ ์‹œ๋„ํ•˜์—ฌ ํ• ๋‹นํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒฝ์šฐ์—” ์ปดํŒŒ์ผ์€ ์„ฑ๊ณตํ•˜๊ณ , ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๊ฒŒ๋„ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํƒ€์ž…์„ ๊ฐ•์ œํ•˜๋„๋ก ํ•˜๋ฉด ๋œ๋‹ค.

class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("Hello");
        String s = list.get(0);
        System.out.println(s);
        Integer i = (Integer) s; // ์ปดํŒŒ์ผ ์—๋Ÿฌ
    }
}

์ด์ฒ˜๋Ÿผ Raw Type์€ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ ˆ๋Œ€ ์จ์„œ๋Š” ์•ˆ ๋˜๋Š” ํƒ€์ž…์ด๋‹ค. ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผ๋Ÿฌ ์ƒ์—์„œ Raw Type์„ ํ—ˆ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž…์ด ๋„์ž…๋˜๊ธฐ ์ „์— ์‚ฌ์šฉํ•˜๋˜ ์ฝ”๋“œ์™€์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๋„์ž…๋œ ๊ฒƒ์ด๋‹ˆ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

List vs List<Object>

Object๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์˜ ์ตœ์ƒ์œ„ ํด๋ž˜์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— List๊ฐ™์€ Raw Type๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

  • List: ํƒ€์ž…์„ ์™„์ „ํžˆ ์ฒดํฌํ•˜์ง€ ์•Š์Œ

  • List<Object>: ๋ชจ๋“  ํƒ€์ž…์„ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ์˜์‚ฌ๋ฅผ ๋ช…ํ™•ํžˆ ์ •์˜, ํƒ€์ž…์„ ์ฒดํฌ

์•„๋ž˜ ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด List๋Š” List<String>์„ ๋„˜๊ฒจ ๋ฐ›์„ ์ˆ˜ ์žˆ์ง€๋งŒ, List<Object>๋Š” List<String>์„ ๋„˜๊ฒจ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค. ์ด๋Š” ์ œ๋„ค๋ฆญ ํ•˜์œ„ ํƒ€์ž… ๊ทœ์น™์— ์˜ํ•ด List<String>์€ List<Object>์˜ ํ•˜์œ„ ํƒ€์ž…์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

// List
class Main1 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        unsafeAdd(list, Integer.valueOf(42));
        String s = list.get(0); // ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ, Exception in thread "main" java.lang.ClassCastException
    }

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

// List<Object>
class Main2 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        unsafeAdd(list, Integer.valueOf(42)); // ์ปดํŒŒ์ผ ์—๋Ÿฌ, Required type: List<Object> Provided: List<String>
    }

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

Wildcard Type(์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…)

Raw Type์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ํƒ€์ž…์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” ์œ„ํ—˜ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. List<Object> ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ œ๋„ค๋ฆญ ํ•˜์œ„ ํƒ€์ž… ๊ทœ์น™์— ์˜ํ•ด List<String>์„ ๋„˜๊ฒจ ๋ฐ›์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ํƒ€์ž…์„ ํ—ˆ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ?๋ฅผ ์‚ฌ์šฉํ•œ ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

class Main2 {
    public static void main(String[] args) {
        List<Integer> list1 = new ArrayList<>();
        List<Integer> list2 = new ArrayList<>();
        unsafeAddWildcard(list1, list2);
        unsafeAddRaw(list1, list2);
    }

    private static void unsafeAddWildcard(List<?> list1, List<?> list2) {
        list1.add(list2.get(0)); // incompatible types: java.lang.Object cannot be converted to capture#1 of ?
    }

    private static void unsafeAddRaw(List list1, List list2) {
        list1.add(list2.get(0));
    }
}

Raw Type์€ ํƒ€์ž… ์ฒดํฌ๋ฅผ ์ „ํ˜€ ํ•˜๊ณ  ์žˆ์ง€ ์•Š์•„, ์ ์ ˆํ•˜์ง€ ์•Š์€ ํƒ€์ž…์„ ๋„˜๊ฒจ ๋ฐ›์•„๋„ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š”๋‹ค. ํ•˜์ง€๋งŒ ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์€ ํƒ€์ž… ์ฒดํฌ๋ฅผ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

Raw Type์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

Raw Type์„ ์ง์ ‘์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์žˆ์–ด์„œ๋Š” ์•ˆ๋˜์ง€๋งŒ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” Raw Type์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

  • class ๋ฆฌํ„ฐ๋Ÿด: List.class, String[].class, int.class๋Š” ํ—ˆ์šฉ๋˜์ง€๋งŒ List<String>.class๋Š” ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ

  • instanceof ์—ฐ์‚ฐ์ž: instanceof List<String>์€ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Œ

    • ๋Ÿฐํƒ€์ž„์—๋Š” ์ œ๋„ค๋ฆญ ํƒ€์ž… ์ •๋ณด๊ฐ€ ์ง€์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ

Last updated