item 32 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
Effective Java 3e ์์ดํ 32๋ฅผ ์์ฝํ ๋ด์ฉ ์ ๋๋ค.
๊ฐ๋ณ์ธ์ ๋ฉ์๋
๋ฅผ ํธ์ถํ๋ฉด ๊ฐ๋ณ์ธ์๋ฅผ ๋ด๊ธฐ ์ํ ๋ฐฐ์ด์ด ์๋์ผ๋ก ํ๋ ๋ง๋ค์ด์ง๋ค. ๊ทธ๋ฐ๋ฐ ๋ด๋ถ๋ก ๊ฐ์ถฐ์ผ ํ์ ์ด ๋ฐฐ์ด์ ๊ทธ๋ง ํด๋ผ์ด์ธํธ์ ๋
ธ์ถํ๋ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค. ๊ทธ ๊ฒฐ๊ณผ varargs
๋งค๊ฐ๋ณ์์ ์ ๋ค๋ฆญ์ด๋ ๋งค๊ฐ๋ณ์ํ ํ์
์ด ํฌํจ๋๋ฉด ์๊ธฐ ์ด๋ ค์ด ์ปดํ์ผ ๊ฒฝ๊ณ
๊ฐ ๋ฐ์ํ๋ค.
warning: [unchecked] Possible heap pollution from
parameterized vararg type List<String>
๋งค๊ฐ๋ณ์ํ ํ์
์ ๋ณ์๊ฐ ํ์
์ด ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ฉด ํ ์ค์ผ
์ด ๋ฐ์ํ๋ค. ๋ค์ ๋ฉ์๋๋ฅผ ํตํด ํ์ธํด๋ณด์.
static void danferous(List<String>... stringLists) {
List<Integer> intList = List.of(42);
Object[] objects = stringLists;
objects[0] = intList; // ํ ์ค์ผ ๋ฐ์
String s = stringLists[0].get(0); // ClassCastException
}
์ด ๋ฉ์๋ ์์๋ ํ๋ณํํ๋ ๊ณณ์ด ๋ณด์ด์ง ์๋๋ฐ๋ ์ธ์๋ฅผ ๊ฑด๋ค ํธ์ถํ๋ฉด ClassCastException
์ ๋์ง๋ค. ๋ง์ง๋ง ์ค์ ์ปดํ์ผ๋ฌ๊ฐ ์์ฑํ (๋ณด์ด์ง ์๋)ํ๋ณํ
์ด ์จ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ค๋ฆญ ๋ฐฐ์ด์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ์์ฑํ๋ ๊ฑด ํ์ฉํ์ง ์์ผ๋ฉด์ ์ ๋ค๋ฆญ varargs ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์๊ฒ ํ ์ด์ ๋ ๋ฌด์์ผ๊น? ๊ทธ ๋ต์ ์ ๋ค๋ฆญ
์ด๋ ๋งค๊ฐ๋ณ์ํ
ํ์
์ varargs ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋ ๋ฉ์๋๊ฐ ์ค๋ฌด์์ ๋งค์ฐ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฌ์ค ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฐ ๋ฉ์๋๋ฅผ ์ฌ๋ฟ ์ ๊ณตํ๋๋ฐ, **Arrays.asList(T... a), Collections.addAll(Collection<? super T> c, T... elements), EnumSet.of(E first, E...rest)**๊ฐ ๋ํ์ ์ด๋ค.
๊ทธ๋์ ์ฌ์ฉ์๋ ์ด ๊ฒฝ๊ณ ๋ค์ ๊ทธ๋ฅ ๋๊ฑฐ๋ (๋ ํํ๊ฒ๋) ํธ์ถํ๋ ๊ณณ๋ง๋ค @SuppressWarnings("unchkecked")
์๋ํ
์ด์
์ ๋ฌ์ ๊ฒฝ๊ณ ๋ฅผ ์จ๊ฒจ์ผ ํ๋ค. ๊ทธ๋์ ์๋ฐ 7์์๋ @SafeVarargs
์ ๋ํ
์ด์
์ด ์ถ๊ฐ๋์ด ์ ๋ค๋ฆญ ๊ฐ๋ณ์ธ์ ๋ฉ์๋ ์์ฑ์๊ฐ ํด๋ผ์ด์ธํธ ์ธก์์ ๋ฐ์ํ๋ ๊ฒฝ๊ณ ๋ฅผ ์จ๊ธธ ์ ์๊ฒ ๋์๋ค. @SafeVarargs
์ ๋ํ
์ด์
์ ๋ฉ์๋ ์์ฑ์๊ฐ ๊ทธ ๋ฉ์๋๊ฐ ํ์
์์ ํจ์ ๋ณด์ฅํ๋ ์ฅ์น๋ค. ์ปดํ์ผ๋ฌ๋ ์ด ์ฝ์์ ๋ฏฟ๊ณ ๊ทธ ๋ฉ์๋๊ฐ ์์ ํ์ง ์์ ์ ์๋ค๋ ๊ฒฝ๊ณ ๋ฅผ ๋ ์ด์ ํ์ง ์๋๋ค.
๋ฉ์๋๊ฐ ์ด ๋ฐฐ์ด์ ์๋ฌด๊ฒ๋ ์ ์ฅํ์ง ์๊ณ (๊ทธ ๋งค๊ฐ๋ณ์
๋ค์ ๋ฎ์ด์ฐ์ง ์๊ณ ) ๊ทธ ๋ฐฐ์ด์ ์ฐธ์กฐ๊ฐ ๋ฐ์ผ๋ก ๋
ธ์ถ๋์ง ์๋๋ค๋ฉด(์ ๋ขฐํ ์ ์๋ ์ฝ๋๊ฐ ๋ฐฐ์ด์ ์ ๊ทผํ ์ ์๋ค๋ฉด)ํ์
์์ ํ๋ค.
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, b);
case 2: return toArray(a, b);
}
throw new AssertionError(); // ๋๋ฌํ ์ ์๋ค.
}
๋ค์ ๋ฉ์๋๋ T ํ์ ์ธ์ 3๊ฐ๋ฅผ ๋ฐ์ ๊ทธ์ค 2๊ฐ๋ฅผ ๋ฌด์์๋ก ๊ณจ๋ผ ๋ด์ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
public static void main(String[] args) {
String[] attributes = pickTwo("์ข์", "๋น ๋ฅธ", "์ ๋ ดํ");
}
์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๋ ๋ฉ์๋์ด๋ ๋ณ๋ค๋ฅธ ๊ฒฝ๊ณ ์์ด ์ปดํ์ผ๋๋ค. ํ์ง๋ง ์คํํ๋ ค ๋ค๋ฉด ClassCastException
์ ๋์ง๋ค. Object[]๋ String[]์ ํ์ ํ์
์ด ์๋๋ฏ๋ก ์ด ํ๋ณํ์ ์คํจํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ฆ, ๋ค์ ๋ ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํ๋ ์ ๋ค๋ฆญ varargs
๋ฉ์๋๋ ์์ ํ๋ค. ๋ ์ค ํ๋๋ผ๋ ์ด๊ฒผ๋ค๋ฉด ์์ ํ๋ผ
- varargs ๋งค๊ฐ๋ณ์ ๋ฐฐ์ด์ ์๋ฌด๊ฒ๋ ์ ์ฅํ์ง ์๋๋ค.
- ๊ทธ ๋ฐฐ์ด(ํน์ ๋ณต์ ๋ณธ)์ ์ ๋ขฐํ ์ ์๋ ์ฝ๋์ ๋ ธ์ถํ์ง ์๋๋ค.
๋ค์์ ์ ๋ค๋ฆญ varargs
๋งค๊ฐ๋ณ์๋ฅผ ์์ ํ๊ฒ ์ฌ์ฉํ๋ ์ ํ์ ์ธ ์๋ค. ๋ค์์ flattern
๋ฉ์๋๋ ์์ ๊ฐ์์ ๋ฆฌ์คํธ๋ฅผ ์ธ์๋ก ๋ฐ์, ๋ฐ์ ์์๋๋ก ๊ทธ ์์ ๋ชจ๋ ์์๋ฅผ ํ๋์ ๋ฆฌ์คํธ๋ก ์ฎ๊ฒจ ๋ด์ ๋ฐํํ๋ค.
@SafeVarargs
static <T> List<T> flatten(List<? extends T>... lists) {
List<T> result = new ArrayList<>();
for (List<? extends T> list : lists)
result.addAll(list);
return result;
}
๊ฐ๋ณ์ธ์
์ ์ ๋ค๋ฆญ
์ ๊ถํฉ์ด ์ข์ง ์๋ค. ๊ฐ๋ณ์ธ์ ๊ธฐ๋ฅ์ ๋ฐฐ์ด์ ๋
ธ์ถํ์ฌ ์ถ์ํ
๊ฐ ์๋ฒฝํ์ง ๋ชปํ๊ณ , ๋ฐฐ์ด
๊ณผ ์ ๋ค๋ฆญ
์ ํ์
๊ท์น์ด ์๋ก ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฉ์๋์ ์ ๋ค๋ฆญ (ํน์ ๋งค๊ฐ๋ณ์ํ๋) varags ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ค๋ฉด, ๋จผ์ ๊ทธ ๋ฉ์๋๊ฐ ํ์
์์ ํ์ง
ํ์ธํ ๋ค์ @SafeVarargs
์ ๋ํ
์ด์
์ ๋ฌ์ ์ฌ์ฉํ๋ ๋ฐ ๋ถํธํจ์ด ์๊ฒ๋ ํ์