Java

[Effective Java] ์•„์ดํ…œ 26. ๋กœ ํƒ€์ž…์€ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ

quedevel 2023. 3. 20. 10:50
728x90
๋ฐ˜์‘ํ˜•

๐ŸŽฏ ์•„์ดํ…œ 26. ๋กœ ํƒ€์ž…์€ ์‚ฌ์šฉํ•˜์ง€ ๋ง๋ผ

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

  • ์ œ๋„ค๋ฆญ ํด๋ž˜์Šค

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable { 
    ...
}

  • ์ œ๋„ค๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค

public interface List<E> extends Collection<E> { ... }

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

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

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

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


  • ๋กœ ํƒ€์ž…

public class Item26 {
  public static void main(String[] args) {
    // ์ œ๋„ค๋ฆญ ํƒ€์ž… ๋ฆฌ์ŠคํŠธ
    List<String> genericTypeList = new ArrayList<>();
    // ๋กœ ํƒ€์ž… ๋ฆฌ์ŠคํŠธ
    List rawTypeList = new ArrayList();
  }
}

  • ๋กœ ํƒ€์ž…์˜ ๋ฌธ์ œ์ 

public class Item26 {
  public static void main(String[] args) {
    // ๋กœ ํƒ€์ž… ๋ฆฌ์ŠคํŠธ
    List rawTypeList = new ArrayList();

    rawTypeList.add("raw type list");
    rawTypeList.add("quedevel");
    // ์‹ค์ˆ˜๋กœ string ๋ฆฌ์ŠคํŠธ์— int๋ฅผ ๋„ฃ๋Š”๋‹ค.
    // ์—ฌ๊ธฐ์„œ int๋ฅผ ๊บผ๋‚ด๊ธฐ์ „์— ์˜ค๋ฅ˜๋ฅผ ์•Œ ์ˆ˜ ์—†๋‹ค.
    rawTypeList.add(1);
    rawTypeList.add("innotree");

    // ํ•˜์ง€๋งŒ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด
    rawTypeList.forEach(e -> {
      String temp = (String) e; // java.lang.ClassCastException !! ๋ฐœ์ƒ
      System.out.println(temp);
    });

  }
}

๋‹ค๋ฅธ ํƒ€์ž…์˜ ๊ฐ’์„ ๋„ฃ์–ด์ค˜๋„ ์ปดํŒŒ์ผ์‹œ์—๋Š” ๋ฐœ๊ฒฌ๋˜์ง€ ์•Š๋‹ค๊ฐ€ ๋Ÿฐํƒ€์ž„์—์•ผ ์•Œ์•„์ฑŒ ์ˆ˜ ์žˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ์ปดํŒŒ์ผํ•  ๋•Œ ๋ฐœ๊ฒฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ, ๋กœ ํƒ€์ž…์„ ์“ฐ๋ฉด ์ œ๋„ค๋ฆญ์ด ์•ˆ๊ฒจ์ฃผ๋Š” ์•ˆ์ •์„ฑ๊ณผ ํ‘œํ˜„๋ ฅ์„ ๋ชจ๋‘ ์žƒ๊ฒŒ ๋œ๋‹ค.


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

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

    ex) List.class, String[].class, int.class๋Š” ํ—ˆ์šฉํ•˜๊ณ  List.class์™€ List<?>.class๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

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


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

o์˜ ํƒ€์ž…์ด Set์ž„์„ ํ™•์ธํ•œ ๋‹ค์Œ ์™€์ผ๋“œ์นด๋“œ ํƒ€์ž…์ธ Set<?>๋กœ ํ˜•๋ณ€ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

์ด๋Š” ๊ฒ€์‚ฌ ํ˜•๋ณ€ํ™˜(checked cast)์ด๋ฏ€๋กœ ์ปดํŒŒ์ผ ๊ฒฝ๊ณ ๊ฐ€ ๋œจ์ง€ ์•Š๋Š”๋‹ค.


์ฐธ๊ณ  ์ž๋ฃŒ

Joshua Bloch, ใ€ŽEffective Java 3/Eใ€, ๊ฐœ์•ž๋งต์‹œ ์˜ฎ๊น€, ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ธ์‚ฌ์ดํŠธ(2018)
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966262281&orderClick=LEa&Kc=

728x90
๋ฐ˜์‘ํ˜•