๐ฏ ์์ดํ 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=