Java

[Effective Java] ์•„์ดํ…œ 32. ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” ์‹ ์ค‘ํ•˜๋ผ.

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

๐ŸŽฏ ์•„์ดํ…œ 32. ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ํ•จ๊ป˜ ์“ธ ๋•Œ๋Š” ์‹ ์ค‘ํ•˜๋ผ.

๊ฐ€๋ณ€์ธ์ˆ˜ ๋ฉ”์„œ๋“œ์™€ ์ œ๋„ค๋ฆญ์€ ์ž๋ฐ” 5 ๋•Œ ํ•จ๊ป˜ ์ถ”๊ฐ€๋˜์—ˆ์œผ๋‹ˆ ์„œ๋กœ ์ž˜ ์–ด์šฐ๋Ÿฌ์ง€๋ฆฌ๋ผ ๊ธฐ๋Œ€ํ•˜๊ฒ ์ง€๋งŒ, ์Šฌํ”„๊ฒŒ๋„ ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.

๊ฐ€๋ณ€์ธ์ˆ˜๋Š” ๋ฉ”์„œ๋“œ์— ๋„˜๊ธฐ๋Š” ์ธ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š”๋ฐ, ๊ตฌํ˜„ ๋ฐฉ์‹์— ํ—ˆ์ ์ด ์žˆ๋‹ค.

  • ์ œ๋„ค๋ฆญ๊ณผ ๊ฐ€๋ณ€์ธ์ˆ˜๋ฅผ ํ˜ผ์šฉํ•˜๋ฉด ํƒ€์ž… ์•ˆ์ •์„ฑ์ด ๊นจ์ง„๋‹ค!
    static void dangerous(List<String>... stringLists) {
      List<Integer> intList = List.of(42);
      Object[] objects = stringLists;
      objects[0] = intList; // ํž™ ์˜ค์—ผ ๋ฐœ์ƒ
      String s = stringLists[0].get(0); // ClassCastException
    }

์œ„ ์ฒ˜๋Ÿผ ํƒ€์ž… ์•ˆ์ „์„ฑ์ด ๊นจ์ง€๋‹ˆ ์ œ๋„ค๋ฆญ ๊ฐ€๋ณ€์ธ์ˆ˜ ๋ฐฐ์—ด ๋งค๊ฐœ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์€ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค.

โญ ๊ทธ๋ ‡๋‹ค๋ฉด ์ œ๋„ค๋ฆญ ๋ฐฐ์—ด์„ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฑด ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด์„œ ์ œ๋„ค๋ฆญ ๊ฐ€๋ณ€์ธ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ?

โญ ์œ„ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ ์—๋Ÿฌ๊ฐ€ ์•„๋‹Œ ๋น„๊ฒ€์‚ฌ ๊ฒฝ๊ณ ๋กœ ๋๋‚ด๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ผ๊นŒ?

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

์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์ด๋Ÿฐ ๋ฉ”์„œ๋“œ๋ฅผ ์—ฌ๋Ÿฟ ์ œ๊ณตํ•˜๋Š”๋ฐ, Arrays.asList(T... a), Collections.addAll(Collection<? superT> c, T... elements)๊ฐ€ ๋Œ€ํ‘œ์ ์ด๋‹ค.

@SafeVarargs
public static <T> boolean addAll(Collection<? super T> c, T... elements)
@SafeVarargs
public static <T> List<T> asList(T... a)

โญ @SafeVarargs ์• ๋„ˆํ…Œ์ด์…˜์€ ๋ฉ”์„œ๋“œ ์ž‘์„ฑ์ž๊ฐ€ ๊ทธ ๋ฉ”์„œ๋“œ๊ฐ€ ํƒ€์ž… ์•ˆ์ „ํ•จ์„ ๋ณด์žฅํ•˜๋Š” ์žฅ์น˜๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด ์•ฝ์†์„ ๋ฏฟ๊ณ  ๊ทธ ๋ฉ”์„œ๋“œ๊ฐ€ ์•ˆ์ „ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒฝ๊ณ ๋ฅผ ๋” ์ด์ƒ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋”ฐ๋ผ์„œ, ๊ฐ€๋ณ€์ธ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐฐ์—ด์ด ํ˜ธ์ถœ์ž๋กœ๋ถ€ํ„ฐ ๊ทธ ๋ฉ”์„œ๋“œ๋กœ ์ˆœ์ˆ˜ํ•˜๊ฒŒ ์ด์ˆ˜๋“ค์„ ์ „๋‹ฌํ•˜๋Š” ์ผ๋งŒ ํ•œ๋‹ค๋ฉด ๊ทธ ๋ฉ”์„œ๋“œ๋Š” ์•ˆ์ „ํ•˜๋‹ค.


โš ๏ธ but, ๊ฐ€๋ณ€์ธ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐฐ์—ด์— ์•„๋ฌด๊ฒƒ๋„ ์ €์žฅํ•˜์ง€ ์•Š๊ณ ๋„ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ๊นฐ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค.

  • ์ž์‹ ์˜ ์ œ๋„ค๋ฆญ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐฐ์—ด์˜ ์ฐธ์กฐ๋ฅผ ๋…ธ์ถœํ•œ๋‹ค. - ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค!

static <T> T[] toArray(T... args) {
    return args;
}
static <T> T[] pickTwo(T a, T b, T c) {
    switch(ThreadLocalRandom.current().nextInt(3)) {
        case 0: return toArray(a, b);
        case 1: return toArray(a, c);
        case 2: return toArray(b, c);
    }
    throw new AssertionError(); // ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค.
}
public static void main(String[] args) { // (194์ชฝ)
    String[] attributes = pickTwo("์ข‹์€", "๋น ๋ฅธ", "์ €๋ ดํ•œ");
    System.out.println(Arrays.toString(attributes));
}

์œ„ ์ฝ”๋“œ๋Š” ์•„๋ฌด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†๋Š” ๋ฉ”์„œ๋“œ์ด๋ฏ€๋กœ ๋ณ„๋‹ค๋ฅธ ๊ฒฝ๊ณ  ์—†์ด ์ปดํŒŒ์ผ์ด ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์‹คํ–‰ํ•˜๋ ค ๋“ค๋ฉด ClassCastException์„ ๋˜์ง„๋‹ค. ๋ฐ”๋กœ pickTwo์˜ ๋ฐ˜ํ™˜๊ฐ’์„ attributes์— ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด String[]๋กœ ํ˜„๋ณ€ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ž๋™ ์ƒ์„ฑํ•œ๋‹ค๋Š” ์ ์„ ๋†“์ณค๋‹ค. Object[]๋Š” String[]์˜ ํ•˜์œ„ ํƒ€์ž…์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ด ํ˜•๋ณ€ํ™˜์€ ์‹คํŒจํ•œ๋‹ค.

โญ ์œ„์˜ ์˜ˆ๋Š” ์ œ๋„ค๋ฆญ์ด ๊ฐ€๋ณ€์ธ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ฐฐ์—ด์— ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๊ฐ€ ์ ‘๊ทผํ•˜๋„๋ก ํ—ˆ์šฉํ•˜๋ฉด ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค๋Š” ์ ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ์ƒ๊ธฐ์‹œํ‚จ๋‹ค.


์ฐธ๊ณ  ์ž๋ฃŒ

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
๋ฐ˜์‘ํ˜•