item 32 junghyunlyoo - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
๊ฐ๋ณ์ธ์๋ ๋ฉ์๋์ ๋๊ธฐ๋ ์ธ์์ ๊ฐ์๋ฅผ ํด๋ผ์ด์ธํธ๊ฐ ์กฐ์ ํ ์ ์๊ฒ ํด์ฃผ๋ ๊ธฐ๋ฒ์ด๋ค.
static void test(List<String>... param) { }
๊ฐ๋ณ์ธ์ ๋ฉ์๋๋ ์ ๋ค๋ฆญ๊ณผ ํจ๊ป ์๋ฐ5์ ์ถ๊ฐ๋์๋ค.
์์ฝ๊ฒ๋ ์ด ๋์ ์๋ก ์ ์ด์ฐ๋ฌ์ง์ง ์๋๋ค.
๊ฐ๋ณ์ธ์๋ ๊ตฌํ ๋ฐฉ์์ ํ์ ์ด ์๋ค.
๊ฐ๋ณ์ธ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๊ฐ๋ณ์ธ์๋ฅผ ๋ด๊ธฐ ์ํ ๋ฐฐ์ด์ด ์๋์ผ๋ก ํ๋ ๋ง๋ค์ด์ง๋ค.
๊ทธ๋ฐ๋ฐ ๋ด๋ถ๋ก ๊ฐ์ถฐ์ผ ํ์ ์ด ๋ฐฐ์ด์ด ํด๋ผ์ด์ธํธ์ ๋ ธ์ถ๋๋ค๋ ๋จ์ ์ด ์๋ค.
๊ทธ ๊ฒฐ๊ณผ varargs ๋งค๊ฐ๋ณ์์ ์ ๋ค๋ฆญ์ด๋ ๋งค๊ฐ๋ณ์ํ ํ์ ์ด ํฌํจ๋๋ฉด ์๊ธฐ ์ด๋ ค์ด ์ปดํ์ผ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ๋ค.
๊ฑฐ์ ๋ชจ๋ ์ ๋ค๋ฆญ๊ณผ ๋งค๊ฐ๋ณ์ํ ํ์ ์ ์ค์ฒดํ๋์ง ์๋๋ค.
(item 28์์ ์ค์ฒดํ ๋ถ๊ฐ ํ์ ์ ๋ฐํ์์๋ ์ปดํ์ผํ์๋ณด๋ค ํ์ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ ๊ฒ ๋ด๊ณ ์์์ ๋ฐฐ์ ๋ค.)
๋ฉ์๋๋ฅผ ์ ์ธํ ๋ ์ค์ฒดํ ๋ถ๊ฐ ํ์ ์ผ๋ก varargs ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ๊ฒฝ๊ณ ๋ฅผ ๋ณด๋ธ๋ค.
๊ฐ๋ณ์ธ์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ varargs ๋งค๊ฐ๋ณ์๊ฐ ์ค์ฒดํ ๋ถ๊ฐ ํ์ ์ผ๋ก ์ถ๋ก ๋๋ฉด ๊ทธ ํธ์ถ์ ๋ํด์๋ ์๋์ ๊ฐ์ ๊ฒฝ๊ณ ๋ฅผ ๋ธ๋ค.
๋งค๊ฐ๋ณ์ํ ํ์ ์ ๋ณ์๊ฐ ํ์ ์ด ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ฉด ํ ์ค์ผ์ด ๋ฐ์ํ๋ค.
๋ค๋ฅธ ํ์ ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ์ํฉ์์๋ ์ปดํ์ผ๋ฌ๊ฐ ์๋ ์์ฑํ ํ๋ณํ์ด
์คํจํ ์ ์์ผ๋ ์ ๋ค๋ฆญ ํ์ ์์คํ ์ด ์ฝ์ํ ํ์ ์์ ์ฑ์ ๊ทผ๊ฐ์ด ํ๋ค๋ ค๋ฒ๋ฆฐ๋ค.
๋ค์ ์์ ๋ฅผ ์ดํด๋ณด์
static void dangerous(List<String>... stringLists) {
Object[] objects = stringLists;
objects[0] = List.of(42);
String s = stringLists[0].get(0);
}
์ด ๋ฉ์๋์์๋ ํ๋ณํํ๋ ๊ณณ์ด ๋ณด์ด์ง ์๋๋ค.
๊ทธ๋ฌ๋ ์ค์ ๋ก ์คํํด๋ณด๋ฉด ClassCastException์ ๋์ง๋ค.
์๋ํ๋ฉด ๋ง์ง๋ง ์ค์ ์ปดํ์ผ๋ฌ๊ฐ ์์ฑํ ํ๋ณํ์ด ์จ์ด์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ฒ๋ผ ํ์ ์์ ์ ์ด ์ฝ๊ฒ ๊นจ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์ ๋ค๋ฆญ varargs ๋ฐฐ์ด ๋งค๊ฐ๋ณ์์ ๊ฐ์ ์ ์ฅํ๋ ๊ฒ์ ์์ ํ์ง ์๋ค.
์ ๋ค๋ฆญ ๋ฐฐ์ด์ ํ๋ก๊ทธ๋๋จธ๊ฐ ์ง์ ์์ฑํ๋๊ฑด ํ์ฉํ์ง ์์ผ๋ฉด์
์ ๋ค๋ฆญ varargs ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์๊ฒ ํ ์ด์ ๋ ๋ฌด์์ผ๊น?
List<String>[] stringLists = new List<String>[10]; //์ ์ธ ๋ถ๊ฐ
์๋ํ๋ฉด ์ ๋ค๋ฆญ์ด๋ ๋งค๊ฐ๋ณ์ํ ํ์ ์ varargs ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋ ๋งค์๋๊ฐ
์ค๋ฌด์์ ๋งค์ฐ ์ ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค! ๊ทธ๋์ ์ธ์ด ์ค๊ณ์๋ ์ด ๋ชจ์์ ์์ฉํ๊ธฐ๋ก ํ๋ค.
์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด๋ฐ ๋ฉ์๋๋ฅผ ์ฌ๋ฟ ์ ๊ณตํ๋ค.
-
Arrays.asList(T... a)
-
Collections.addAll(Collection<? super T> c, T... elements)
-
EnumSet.of(E first, E... rest)
์ด ๋ฉ์๋๋ค์ ํ์ ์์ ํ๊ฒ ์ค๊ณ๋์ด ์๋ค.
์๋ฐ 7 ์ ์๋ ์ ๋ค๋ฆญ ๊ฐ๋ณ์ธ์ ๋ฉ์๋์ ์์ฑ์๊ฐ ํธ์ถ์ ์ชฝ์์ ๋ฐ์ํ๋ ๊ฒฝ๊ณ ์ ๋ํด์ ํด์ค ์ ์๋ ์ผ์ด ์์๋ค.
๋ฐ๋ผ์ ์ด๋ฐ ๋ฉ์๋๋ ์ฌ์ฉํ๊ธฐ์ ์ข ๊บผ๋ฆผ์นํ๋ค.
์ฌ์ฉ์๋ ์ด ๊ฒฝ๊ณ ๋ค์ ๊ทธ๋ฅ ๋๊ฑฐ๋ ํธ์ถํ๋ ๊ณณ๋ง๋ค @SuppressWarnings("unchecked") ์ ๋ํ ์ด์ ์ ๋ฌ์ ๊ฒฝ๊ณ ๋ฅผ ์จ๊ฒจ์ผ ํ๋ค. (item 27)
์ด๋ ์ง๋ฃจํ ์์ ์ด๊ณ , ๊ฐ๋ ์ฑ์ ๋จ์ด๋จ๋ฆฌ๋ฉฐ, ๋๋ก๋ ์ง์ง ๋ฌธ์ ๋ฅผ ์๋ ค์ฃผ๋ ๊ฒฝ๊ณ ๋ง์ ์จ๊ธฐ๋ ์ ์ข์ ๊ฒฐ๊ณผ๋ก ์ด์ด์ก๋ค.
์๋ฐ 7์์๋ @SafeVarargs ์ ๋ํ ์ด์ ์ด ์ถ๊ฐ๋์๋ค.
@SafeVarargs ์ ๋ํ ์ด์ ์ ๋ฉ์๋ ์์ฑ์๊ฐ ๊ทธ ๋ฉ์๋๊ฐ ํ์ ์์ ํจ์ ๋ณด์ฅํ๋ ์ฅ์น๋ค.
๋๋ถ์ ์ ๋ค๋ฆญ ๊ฐ๋ณ์ธ์ ๋ฉ์๋ ์์ฑ์๊ฐ ํด๋ผ์ด์ธํธ ์ธก์์ ๋ฐ์ํ๋ ๊ฒฝ๊ณ ๋ฅผ ์จ๊ธธ ์ ์๊ฒ ๋์๋ค.
์ปดํ์ผ๋ฌ๋ @SafeVarargs์ ์์ ํจ์ ๋ฏฟ๊ณ ๊ทธ ๋ฉ์๋์ ๋ํด ๋์ด์ ๊ฒฝ๊ณ ํ์ง ์๋๋ค.
๋งค์๋๊ฐ ์์ ํ ๊ฒ ํ์คํ์ง ์๋ค๋ฉด ์ ๋ @SafeVarargs ์ ๋ํ ์ด์ ์ ๋ฌ๋ฉด ์๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฉ์๋๊ฐ ์์ ํ์ง๋ ์ด๋ป๊ฒ ํ์ ํ ์ ์์๊น?
๊ฐ๋ณ์ธ์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ varargs ๋งค๊ฐ๋ณ์๋ฅผ ๋ด๋ ์ ๋ค๋ฆญ ๋ฐฐ์ด์ด ๋ง๋ค์ด์ง๋ค๋ ์ฌ์ค์ ๊ธฐ์ตํ์.
๋ฉ์๋๊ฐ ์ด ๋ฐฐ์ด์ ์๋ฌด๊ฒ๋ ์ ์ฅํ์ง ์๊ณ (๊ทธ ๋งค๊ฐ๋ณ์๋ค์ ๋ฎ์ด์ฐ์ง ์๊ณ )
๊ทธ ๋ฐฐ์ด์ ์ฐธ์กฐ๊ฐ ๋ฐ์ผ๋ก ๋ ธ์ถ๋์ง ์์ผ๋ฉด(์ ๋ขฐํ ์ ์๋ ์ฝ๋๊ฐ ๋ฐฐ์ด์ ์ ๊ทผํ ์ ์๋ค๋ฉด)
ํ์ ์์ ํ๋ค๊ณ ํ ์ ์๋ค.
๋ฌ๋ฆฌ ๋งํ๋ฉด, ์ด varargs ๋งค๊ฐ๋ณ์ ๋ฐฐ์ด์ด ํธ์ถ์๋ก๋ถํฐ ๊ทธ ๋ฉ์๋๋ก ์์ํ๊ฒ ์ธ์๋ค์
์ ๋ฌํ๋ ์ผ๋ง ํ๋ค๋ฉด(varargs์ ๋ชฉ์ ๋๋ก๋ง ์ฐ์ธ๋ค๋ฉด) ๊ทธ ๋ฉ์๋๋ ์์ ํ๋ค.
๊ทธ๋ฐ๋ฐ varargs ๋งค๊ฐ๋ณ์ ๋ฐฐ์ด์ ์๋ฌด๊ฒ๋ ์ ์ฅํ์ง ์๊ณ ๋ ํ์ ์์ ์ฑ์ ๊นฐ ์๋ ์๋ค.
์๋ ์ฝ๋๋ ๊ฐ๋ณ์ธ์๋ก ๋์ด์จ ๋งค๊ฐ๋ณ์๋ค์ ๋ฐฐ์ด์ ๋ด์ ๋ฐํํ๋ ์ ๋ค๋ฆญ ๋ฉ์๋๋ค.
์ผํ ๋ณด๋ฉด ํธ๋ฆฌํ ์ ํธ๋ฆฌํฐ๋ก ๋ณด์ด์ง๋ง, ๋ณด๊ธฐ์ ๋ฌ๋ฆฌ ์ํํ๋ค!
static <T> T[] toArray(T... args) {
return args;
}
์ด ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๋ฐฐ์ด์ ํ์ ์ ์ด ๋ฉ์๋์ ์ธ์๋ฅผ ๋๊ธฐ๋ ์ปดํ์ผํ์์ ๊ฒฐ์ ๋๋ค.
๊ทธ ์์ ์๋ ์ปดํ์ผ๋ฌ์๊ฒ ์ถฉ๋ถํ ์ ๋ณด๊ฐ ์ฃผ์ด์ง์ง ์์ ํ์ ์ ์๋ชป ํ๋จํ ์ ์๋ค.
๋ฐ๋ผ์ ์์ ์ varargs ๋งค๊ฐ๋ณ์ ๋ฐฐ์ด์ ๊ทธ๋๋ก ๋ฐํํ๋ฉด
ํ ์ค์ผ์ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ ์ชฝ์ ์ฝ์คํ์ผ๋ก๊น์ง ์ ์ดํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์ ์ ์๋ค.
๊ตฌ์ฒด์ ์ธ ์๋ฅผ ํตํด ์ ์ํ์ ์ดํด๋ณด์.
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();// ๋๋ฌํ ์ ์๋ค.
}
์ด ๋ฉ์๋๋ ์ ๋ค๋ฆญ ๊ฐ๋ณ์ธ์๋ฅผ ๋ฐ๋ toArray ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค๋ ์ ๋ง ๋นผ๋ฉด ์ํํ์ง ์๊ณ ๊ฒฝ๊ณ ๋ ๋ด์ง ์๋๋ค.
์ด ๋ฉ์๋๋ฅผ ๋ณธ ์ปดํ์ผ๋ฌ๋ toArray์ ๋๊ธธ T ์ธ์คํด์ค 2๊ฐ๋ฅผ ๋ด์ varargs ๋งค๊ฐ๋ณ์ ๋ฐฐ์ด์ ๋ง๋๋ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
์ด ์ฝ๋๊ฐ ๋ง๋๋ ๋ฐฐ์ด์ ํ์ ์ Object[]์ด๋ค.
pickTwo์ ์ด๋ค ํ์ ์ ๊ฐ์ฒด๋ฅผ ๋๊ธฐ๋๋ผ๋ ๋ด์ ์ ์๋ ๊ฐ์ฅ ๊ตฌ์ฒด์ ์ธ ํ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ toArray ๋ฉ์๋๊ฐ ๋๋ ค์ค ์ด Object[] ๋ฐฐ์ด์ด ๊ทธ๋๋ก pickTwo๋ฅผ ํธ์ถํ ํด๋ผ์ด์ธํธ๊น์ง ์ ๋ฌ๋๋ค.
์ฆ, pickTwo๋ ํญ์ Object[] ํ์ ๋ฐฐ์ด์ ๋ฐํํ๋ค.
๋ค์์ pickTwo๋ฅผ ํธ์ถํ๋ ์ฝ๋์ด๋ค.
public static void main(String[] args) {
String[] attributes = pickTwo("์ข์", "๋น ๋ฅธ", "์ ๋ ดํ");
}
์๋ฌด๋ฐ ๋ฌธ์ ๊ฐ ์๋ ๋ฉ์๋์ด๋ ๋ณ๋ค๋ฅธ ๊ฒฝ๊ณ ์์ด ์ปดํ์ผ๋๋ค.
ํ์ง๋ง ์คํํ๋ ค ๋ค๋ฉด ํ๋ณํํ๋ ๊ณณ์ด ๋ณด์ด์ง ์์๋ ClassCastException์ ๋์ง๋ค.
์๋ํ๋ฉด pickTwo์ ๋ฐํ๊ฐ์ attributes์ ์ ์ฅํ๊ธฐ ์ํด
String[]๋ก ๋ณํํ๋ ์ฝ๋๊ฐ ์ปดํ์ผ๋ฌ์ ์ํด ์๋ ์์ฑ๋๊ธฐ ๋๋ฌธ์ด๋ค.
Object[]๋ String[]์ ํ์ ํ์ ์ด ์๋๋ฏ๋ก ์ด ํ๋ณํ์ ์คํจํ๋ค.
์ด ์คํจ๊ฐ ๋ค์ ํฉ๋นํ๊ฒ ๋๊ปด์ง ์ ์๋ค.
์๋ํ๋ฉด ํ ์ค์ผ์ ๋ฐ์์ํจ ์ง์ง ์์ธ์ธ toArray๋ก๋ถํฐ ๋ ๋จ๊ณ๋ ๋จ์ด์ ธ ์๊ณ
varargs ๋งค๊ฐ๋ณ์ ๋ฐฐ์ด์ ์ค์ ๋งค๊ฐ๋ณ์๊ฐ ์ ์ฅ๋ ํ ๋ณ๊ฒฝ๋ ์ ๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ์๋ ์ ๋ค๋ฆญ varargs ๋งค๊ฐ๋ณ์ ๋ฐฐ์ด์ ๋ค๋ฅธ ๋ฉ์๋๊ฐ ์ ๊ทผํ๋๋ก ํ์ฉํ๋ฉด ์์ ํ์ง ์๋ค๋ ์ ์ ๋ค์ ํ๋ฒ ์๊ธฐ์ํจ๋ค.
๋จ, ์์ธ๊ฐ ๋ ๊ฐ์ง ์๋ค.
์ฒซ ๋ฒ์งธ, @SafeVarargs๊ฐ ์ ์ธ๋ ๋ ๋ค๋ฅธ varargs ๋ฉ์๋์ ๋๊ธด๋ ๊ฒ์ ์์ ํ๋ค.
๋ ๋ฒ์งธ, ํด๋น ๋ฐฐ์ด ๋ด์ฉ์ ์ผ๋ถ ํจ์๋ฅผ ํธ์ถ๋ง ํ๋(varargs๋ฅผ ๋ฐ์ง ์๋) ์ผ๋ฐ ๋ฉ์๋์ ๋๊ธฐ๋ ๊ฒ๋ ์์ ํ๋ค.
์๋ ์ฝ๋๋ ์ ๋ค๋ฆญ varargs ๋งค๊ฐ๋ณ์๋ฅผ ์์ ํ๊ฒ ์ฌ์ฉํ๋ ์ ํ์ ์ธ ์๋ค.
@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;
}
flatten ๋ฉ์๋๋ ์์ ๊ฐ์์ ๋ฆฌ์คํธ๋ฅผ ์ธ์๋ก ๋ฐ๊ณ ๋ฐ์ ์์๋๋ก ๊ทธ ์์ ๋ชจ๋ ์์๋ฅผ ํ๋์ ๋ฆฌ์คํธ๋ก ์ฎ๊ฒจ ๋ฐํํ๋ค.
์ด ๋ฉ์๋์๋ @SafeVarargs ์ ๋ํ ์ด์ ์ด ๋ฌ๋ ค ์์ผ๋ ์ ์ธํ๋ ์ชฝ๊ณผ ์ฌ์ฉํ๋ ์ชฝ ๋ชจ๋์์ ๊ฒฝ๊ณ ๋ฅผ ๋ด์ง ์๋๋ค.
@SafeVarargs ์ ๋ํ ์ด์ ์ ์ฌ์ฉํด์ผ ํ ๋๋ฅผ ์ ํ๋ ๊ท์น์ ๊ฐ๋จํ๋ค.
์ ๋ค๋ฆญ์ด๋ ๋งค๊ฐ๋ณ์ํ ํ์ ์ varargs ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋ ๋ชจ๋ ๋ฉ์๋์ @SafeVarargs๋ฅผ ๋ฌ์.
๊ทธ๋์ผ ์ฌ์ฉ์๋ฅผ ํท๊ฐ๋ฆฌ๊ฒ ํ๋ ์ปดํ์ผ๋ฌ ๊ฒฝ๊ณ ๋ฅผ ์์จ ์ ์๋ค.
์ด ๋ง์ ์์ ํ์ง ์์ varargs ๋ฉ์๋๋ ์ ๋ ์์ฑํ์ง ๋ง์ผ์ผ ํ๋ค๋ ๋ป์ด๊ธฐ๋ ํ๋ค.
์์ ์ด ์ปจํธ๋กคํ ์ ์๋ ๋ฉ์๋ ์ค ์ ๋ค๋ฆญ varargs ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉฐ
ํ ์ค์ผ ๊ฒฝ๊ณ ๊ฐ ๋จ๋ ๋ฉ์๋๊ฐ ์๋ค๋ฉด, ๊ทธ ๋ฉ์๋๊ฐ ์ง์ง ์์ ํ์ง ์ ๊ฒํ์.
์ ๋ฆฌํ์๋ฉด, ๋ค์ ๋ ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํ๋ ์ ๋ค๋ฆญ varargs ๋ฉ์๋๋ ์์ ํ๋ค.
-
varargs ๋งค๊ฐ๋ณ์ ๋ฐฐ์ด์ ์๋ฌด๊ฒ๋ ์ ์ฅํ์ง ์๋๋ค.
-
๊ทธ ๋ฐฐ์ด(ํน์ ๋ณต์ ๋ณธ)์ ์ ๋ขฐํ ์ ์๋ ์ฝ๋์ ๋ ธ์ถํ์ง ์๋๋ค.
@SafeVarargs ์ ๋ํ
์ด์
์ ์ฌ์ ์ํ ์ ์๋ ๋ฉ์๋์๋ง ๋ฌ์์ผ ํ๋ค.
์ฌ์ ์ํ ๋ฉ์๋๋ ์์ ํ ์ง๋ ๋ณด์ฅํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฐ 8์์ ์ด ์ ๋ํ
์ด์
์ ์ค์ง ์ ์ ๋ฉ์๋์ final ์ธ์คํด์ค ๋ฉ์๋์๋ง
๋ถ์ผ ์ ์๊ณ , ์๋ฐ 9๋ถํฐ๋ private ์ธ์คํด์ค ๋ฉ์๋์๋ ํ์ฉ๋๋ค.
@SafeVarargs ์ ๋ํ ์ด์ ์ด ์ ์ผํ ์ ๋ต์ ์๋๋ค.
item 28์ ์กฐ์ธ์ ๋ฐ๋ผ (์ค์ฒด๋ ๋ฐฐ์ด์ธ) varargs ๋งค๊ฐ๋ณ์๋ฅผ List ๋งค๊ฐ๋ณ์๋ก ๋ฐ๊ฟ ์๋ ์๋ค.
์ด ๋ฐฉ์์ ์์์ flatten ๋ฉ์๋์ ์ ์ฉํ๋ฉด ๋ค์์ฒ๋ผ ๋๋ค.
๋งค๊ฐ๋ณ์ ์ ์ธ๋ง ์์ ํ์์ ์ฃผ๋ชฉํ์.
static <T> List<T> flatten(List<List<? extends T>> lists) {
List<T> result = new ArrayList<>();
for (List<? extends T> list : lists)
result.addAll(list);
return result;
}
์ ์ ํฉํฐ๋ฆฌ ๋ฉ์๋์ธ List.of๋ฅผ ํ์ฉํ๋ฉด ๋ค์ ์ฝ๋์ ๊ฐ์ด ์ด ๋ฉ์๋์ ์์ ๊ฐ์์ ์ธ์๋ฅผ ๋๊ธธ ์ ์๋ค.
์ด๋ ๊ฒ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ๋ฅํ ์ด์ ๋ List.of์ @SafeVarargs ์ ๋ํ ์ด์ ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
List<Integer> flatList = flatten(List.of(List.of(1, 2), List.of(3, 4, 5), List.of(6,7)));
์ด ๋ฐฉ์์ ์ฅ์ ์ ์ปดํ์ผ๋ฌ๊ฐ ์ด ๋ฉ์๋์ ํ์ ์์ ์ฑ์ ๊ฒ์ฆํ ์ ์๋ค๋ ๋ฐ ์๋ค.
@SafeVarargs ์ ๋ํ ์ด์ ์ ์ฐ๋ฆฌ๊ฐ ์ง์ ๋ฌ์ง ์์๋ ๋๋ฉฐ ์ค์๋ก ์์ ํ๋ค๊ณ ํ๋จํ ๊ฑฑ์ ๋ ์๋ค.
๋จ์ ์ด๋ผ๋ฉด ํด๋ผ์ด์ธํธ ์ฝ๋๊ฐ ์ด์ง ์ง์ ๋ถํด์ง๊ณ ์๋๊ฐ ์กฐ๊ธ ๋๋ ค์ง ์ ์๋ค๋ ์ ๋๋ค.
๋ํ ์ด ๋ฐฉ์์ varargs ๋ฉ์๋๋ฅผ ์์ ํ๊ฒ ์์ฑํ๋ ๊ฒ ๋ถ๊ฐ๋ฅํ ์ํฉ์์๋ ์ธ ์ ์๋ค.
static <T> List<T> pickTwo(T a, T b, T c) {
switch(ThreadLocalRandom.current().nextInt(3)) {
case 0: return List.of(a, b);
case 1: return List.of(a, c);
case 2: return List.of(b, c);
}
throw new AssertionError();
}
๊ธฐ์กด toArray์ List ๋ฒ์ ์ด ๋ฐ๋ก List.of๋ก, ์๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐจ์์์ ์ ๊ณตํ๋ ์ฐ๋ฆฌ๊ฐ ์ง์ ์์ฑํ ํ์๋ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฉ์ธ ๋ฉ์๋๋ ๋ค์์ฒ๋ผ ์ธ ์ ์๋ค.
public static void main(String[] args) {
List<String> attributes = pickTwo("์ข์", "๋น ๋ฅธ", "์ ๋ ดํ");
System.out.println(attributes);
}
๊ฒฐ๊ณผ ์ฝ๋๋ ๋ฐฐ์ด ์์ด ์ ๋ค๋ฆญ๋ง ์ฌ์ฉํ๋ฏ๋ก ํ์ ์์ ํ๋ค.