{% hint style="info" %}
๊ฐ๋ณ์ธ์(Variable Arguments)
๋, ๋ฉ์๋๋ ํจ์์์ ์ธ์์ ๊ฐ์๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ง์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ๋งํ๋ค.
{% endhint %}
์ฆ, ํธ์ถ ์ ์ ๋ฌ๋๋ ์ธ์์ ๊ฐ์์ ๋ฐ๋ผ ๋ฉ์๋๊ฐ ๋์ํ๋๋ก ํ ์ ์๋ค. Java์์๋ ๊ฐ๋ณ์ธ์๋ฅผ ...
๋ฌธ๋ฒ์ ํตํด ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์ด์ฉํด ๋ฉ์๋ ํธ์ถ ์ ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ๋ฐฐ์ด ํํ๋ก ์ ๋ฌํ ์ ์๋ค.
๊ฐ๋ณ์ธ์๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ํ์
๋ค์ ...
์ ๋ถ์ฌ ์ ์ธํ๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋ณ์ธ์๋ฅผ ์ ์ธํ ์ ์๋ค:
public void printNumbers(int... numbers) {
for (int number : numbers) {
System.out.println(number);
}
}
์ ๋ฉ์๋ printNumbers
๋ ๊ฐ๋ณ์ธ์ int... numbers
๋ฅผ ๋ฐ์, ์ ๋ฌ๋ ๋ชจ๋ ์ซ์๋ฅผ ์ถ๋ ฅํฉ๋๋ค. ํธ์ถํ ๋๋ ์ธ์๋ฅผ ์ฌ๋ฌ ๊ฐ ์ ๋ฌํ ์ ์๋ค:
printNumbers(1); // ์ธ์๊ฐ 1๊ฐ
printNumbers(1, 2, 3, 4); // ์ธ์๊ฐ ์ฌ๋ฌ ๊ฐ
์ ์์ ์์ numbers
๋ ๋ฐฐ์ด๋ก ์ทจ๊ธ๋๋ฉฐ, ์ ๋ฌ๋ ์ธ์๋ค์ ๋ฐ๋ณต๋ฌธ์ ํตํด ์ฒ๋ฆฌํ ์ ์๋ค.
- ๊ฐ๋ณ์ธ์๋ ๋ฉ์๋์์ ํ ๋ฒ๋ง ์ฌ์ฉ ๊ฐ๋ฅ: ๋ฉ์๋์ ๊ฐ๋ณ์ธ์๋ ํ๋๋ง ์ ์ธํ ์ ์๋ค.
- ๊ฐ๋ณ์ธ์๋ ๋ง์ง๋ง ๋งค๊ฐ๋ณ์์ฌ์ผ ํจ: ๋ค๋ฅธ ๋งค๊ฐ๋ณ์์ ํจ๊ป ์ฌ์ฉํ ๋ ๊ฐ๋ณ์ธ์๋ ํญ์ ๋ง์ง๋ง์ ์์นํด์ผ ํ๋ค.
public void exampleMethod(String message, int... numbers) {
System.out.println(message);
for (int number : numbers) {
System.out.println(number);
}
}
ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ฌ์ฉ์ ํ์ฉ๋์ง ์๋๋ค:
// ์ค๋ฅ: ๊ฐ๋ณ์ธ์๋ ๋ง์ง๋ง์ ์์ผ ํจ
public void invalidMethod(int... numbers, String message) {
// ์ฝ๋ ๋ด์ฉ
}
- ์ ์ฐํ ๋ฉ์๋ ํธ์ถ: ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ ๋ฌํ๋ ์ธ์์ ๊ฐ์๋ฅผ ์ ์ฐํ๊ฒ ์กฐ์ ํ ์ ์์ด ํธ๋ฆฌํ๋ค.
- ์ฝ๋ ๊ฐ๋ ์ฑ ํฅ์: ์ฌ๋ฌ ์ธ์๋ฅผ ๋ฐฐ์ด๋ก ์ง์ ์ ๋ฌํ๋ ๊ฒ๋ณด๋ค ๊ฐ๋ณ์ธ์๋ฅผ ํตํด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๊ฐ๋ ์ฑ์ด ์ข์์ง๋ค.
๊ฐ๋ณ์ธ์๋ ๋ด๋ถ์ ์ผ๋ก ๋ฐฐ์ด๋ก ์ฒ๋ฆฌ๋์ง๋ง, ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋ฐฐ์ด์ ์ง์ ์ ๋ฌํ๋ ๊ฒ๊ณผ๋ ๋ค๋ฅด๋ค. ๊ฐ๋ณ์ธ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ธ์๋ฅผ ์ฝค๋ง๋ก ๊ตฌ๋ถํด ๋์ดํ ์ ์๋ ๋ฐ๋ฉด, ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ฐฐ์ด์ ๋ช ์์ ์ผ๋ก ๋ง๋ค์ด์ ์ ๋ฌํด์ผ ํ๋ค.
public class VarargsExample {
public static void main(String[] args) {
sum(1, 2); // 2๊ฐ์ ์ธ์ ์ ๋ฌ
sum(1, 2, 3, 4, 5); // 5๊ฐ์ ์ธ์ ์ ๋ฌ
}
// ๊ฐ๋ณ์ธ์๋ฅผ ์ด์ฉํ ๋ฉ์๋
public static void sum(int... numbers) {
int total = 0;
for (int number : numbers) {
total += number;
}
System.out.println("Sum: " + total);
}
}
์ ์์ ์์ sum
๋ฉ์๋๋ ์ ๋ฌ๋ฐ์ ๋ชจ๋ ์ซ์๋ฅผ ๋ํด ํฉ๊ณ๋ฅผ ์ถ๋ ฅํ๋ค. ๊ฐ๋ณ์ธ์๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ํธ์ถ ์ ์ธ์์ ๊ฐ์์ ์ ํ์ด ์์ผ๋ฉฐ, ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฐ์์ ์ธ์๋ฅผ ์ ๋ฌํ ์ ์๋ค.
๊ฐ๋ณ์ธ์๋ ๋ฉ์๋๋ฅผ ๋ ์ ์ฐํ๊ณ ํธ๋ฆฌํ๊ฒ ํธ์ถํ ์ ์๊ฒ ํด์ฃผ๋ฉฐ, ๋ค์ํ ์ํฉ์์ ์ฌ์ฉํ ์ ์๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ
{% hint style="danger" %} ๊ฐ๋ณ์ธ์๋ ๋ฉ์๋์ ๋๊ธฐ๋ ์ธ์์ ๊ฐ์๋ฅผ ํด๋ผ์ด์ธํธ๊ฐ ์กฐ์ ํ ์ ์๊ฒ ํด์ฃผ๋๋ฐ, ๊ตฌํ ๋ฐฉ์์ ํ์ ์ด ์๋ค. {% endhint %}
๊ฐ๋ณ์ธ์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ๊ฐ๋ณ์ธ์๋ฅผ ๋ด๊ธฐ ์ํ ๋ฐฐ์ด์ด ์๋์ผ๋ก ํ๋ ๋ง๋ค์ด์ง๋ค. ๊ทธ๋ฐ๋ฐ ๋ด๋ถ๋ก ๊ฐ์ถฐ์ผ ํ์ ์ด ๋ฐฐ์ด์ ๊ทธ๋ง ํด๋ผ์ด ์ธํธ์ ๋ ธ์ถํ๋ ๋ฌธ์ ๊ฐ ์๊ฒผ๋ค. ๊ทธ ๊ฒฐ๊ณผ varargs ๋งค๊ฐ๋ณ์์ ์ ๋ค๋ฆญ์ด๋ ๋งค๊ฐ ๋ณ์ํ ํ์ ์ด ํฌํจ๋๋ฉด ์๊ธฐ ์ด๋ ค์ด ์ปดํ์ผ ๊ฒฝ๊ณ ๊ฐ ๋ฐ์ํ๋ค.
import java.util.ArrayList;
import java.util.List;
public class Example {
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
}
public static void main(String[] args) {
List<String> stringList = new ArrayList<>();
stringList.add("Hi there");
dangerous(stringList);
}
}
- ์ค์ฒดํ ๋ถ๊ฐ ํ์ ์ ๋ฐํ์์๋ ์ปดํ์ผํ์๋ณด๋ค ํ์ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ ๊ฒ ๋ด๊ณ ์์์ ๋ฐฐ์ ๋ค.
- ๊ฑฐ์ ๋ชจ๋ ์ ๋ค๋ฆญ๊ณผ ๋งค๊ฐ๋ณ์ํ ํ์ ์ ์ค์ฒดํ๋์ง ์๋๋ค.
- ๋ฉ์๋๋ฅผ ์ ์ธํ ๋ ์ค์ฒดํ ๋ถ๊ฐ ํ์ ์ผ๋ก varargs ๋งค๊ฐ ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ๊ฒฝ๊ณ ๋ฅผ ๋ณด๋ธ๋ค.
- ๊ฐ๋ณ์ธ์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ varargs ๋งค๊ฐ๋ณ์๊ฐ ์ค์ฒดํ ๋ถ๊ฐ ํ์ ์ผ๋ก ์ถ๋ก ๋๋ฉด, ๊ทธ ํธ์ถ์ ๋ํด์๋ ๊ฒฝ๊ณ ๋ฅผ ๋ธ๋ค.
๋งค๊ฐ๋ณ์ํ ํ์ ์ ๋ณ์๊ฐ ํ์ ์ด ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ฉด ํ ์ค์ผ์ด ๋ฐ์ํ๋ค. ์ด๋ ๊ฒ ๋ค๋ฅธ ํ์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ์ํฉ์์๋ ์ปดํ์ผ๋ฌ๊ฐ ์๋ ์์ฑํ ํ๋ณํ์ด ์คํจํ ์ ์์ผ๋, ์ ๋ค๋ฆญ ํ์ ์์คํ ์ด ์ฝ์ํ ํ์ ์ ์ ์ฑ์ ๊ทผ๊ฐ์ด ํ๋ค๋ ค๋ฒ๋ฆฐ๋ค.
List<String>[] stringLists = new List<String>[l]; // (1)
List<Integer> intList = List.of(42); // (2)
Object[] objects = stringLists; // (3)
objects[0] = intList; // (4)
String s = stringLists[์ด.get(0); // (5)
{% hint style="danger" %} ์ ๋ค๋ฆญ varargs ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์๊ฒ ํ ์ด์ ๋ ๋ฌด์์ผ๊น? ๋ฌ๋ฆฌ ๋งํ๋ฉด, ์ฝ๋ ์์ ์ฝ๋๋ ์ค๋ฅ๋ฅผ ๋ด ๋ฉด์ ๋ฐ์ ์ฝ๋๋ ๊ฒฝ๊ณ ๋ก ๋๋ด๋ ์ด์ ๋ ๋ญ๊น? {% endhint %}
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
}
๊ทธ ๋ต์ ์ ๋ค๋ฆญ์ด๋ ๋งค๊ฐ๋ณ์ํ ํ์
์ varargs ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋ ๋ฉ์๋๊ฐ ์ค๋ฌด์์ ๋งค์ฐ ์ ์ฉํ๊ธฐ ๋๋ฌธ ์ด๋ค. ๊ทธ๋์ ์ธ์ด ์ค๊ณ์๋ ์ด ๋ชจ์์ ์์ฉํด์์ ์์ ์ฒ๋ผ ์ ๋ค๋ฆญ varargs ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๋ ๋ฉ์๋๋ฅผ ์ ์ธํ ์ ์๋๋ก ํ๋ค. ๋ํ์ ์ผ๋ก ์๋์ ๊ฐ์ด Arrays.list(T... a)
, EnumSet.of(E first, E... set)
๊ณผ ๊ฐ์ ๋ฉ์๋๊ฐ ์๋ค.
// Arrays.Java
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
// EnumSet.java
@SafeVarargs
public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest) {
EnumSet<E> result = noneOf(first.getDeclaringClass());
result.add(first);
for (E e : rest)
result.add(e);
return result;
}
Java์์๋ ์ ๋ค๋ฆญ ๋ฐฐ์ด์ ์ง์ ์์ฑํ ์ ์์ง๋ง, ์ ๋ค๋ฆญ ๊ฐ๋ณ์ธ์ ๋ฉ์๋๋ ํ์ฉ๋๋ค.
๊ฐ๋ณ์ธ์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ง๋ค ๋ด๋ถ์ ์ผ๋ก ๋ฐฐ์ด์ด ์์ฑ๋๋ฉฐ, ์ด ๋ฐฐ์ด์ ํ์ ์ ์ปดํ์ผ ์์ ๊ฒฐ์ ๋์ง ์๊ณ ๋ฐํ์์ ๊ฒฐ์ ๋๋ค.
์๋ฅผ ๋ค์ด, Arrays.asList(T... a)
์ ๊ฐ์ ๋ฉ์๋๋ ๊ฐ๋ณ์ธ์๋ฅผ ์ฌ์ฉํด ํธ๋ฆฌํ๊ฒ ํธ์ถํ ์ ์์ง๋ง, ๋ด๋ถ์ ์ผ๋ก๋ ๋ฐฐ์ด์ด ์ฌ์ฉ๋ฉ๋๋ค. ์ด ๊ณผ์ ์์ ํ์
์์ ์ฑ์ด ๊นจ์ง ์ ์๋ค.
์๋ฅผ ๋ค์ด, ์ ๋ค๋ฆญ ๋ฐฐ์ด์ ๋ฐํํ๋ ๋ฉ์๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์
static <T> T[] toArray(T... args) {
return args;
}
์์ ๋ฉ์๋๋ ๊ฐ๋ณ์ธ์๋ก ์ ๋ฌ๋ ๋ฐฐ์ด์ ๊ทธ๋๋ก ๋ฐํํ๋ค. ๋ฌธ์ ๋ ๋ฉ์๋๊ฐ ๋ฐํํ๋ ๋ฐฐ์ด์ ํ์ ์ด ๋ฐํ์์ ๊ฒฐ์ ๋๋ฉฐ, ์ด๋ ํ์ ์ด ์๋ชป ํ๋จ๋ ์ ์๋ค๋ ์ ์ด๋ค.
public static void main(String[] args) {
String[] attributes = toArray("์ข์", "๋น ๋ฅธ", "์ ๋ ดํ");
}
์ ์ฝ๋๋ ์ปดํ์ผ๋ ๋๋ ๋ฌธ์ ๊ฐ ์์ง๋ง, ๋ฐํ์์ ClassCastException
์ด ๋ฐ์ํ ์ ์๋ค. ์ด๋ toArray
๋ฉ์๋๊ฐ ๋ฐํํ๋ ๋ฐฐ์ด์ด ์ค์ ๋ก๋ Object[]
ํ์
์ด์ง๋ง, String[]
ํ์
์ผ๋ก ํ๋ณํ์ด ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ด๋ค.
Java 7์์๋ @SafeVarargs
์ ๋ํ
์ด์
์ ๋์
ํ์ฌ, ๋ฉ์๋ ์์ฑ์๊ฐ ๋ฉ์๋๊ฐ ํ์
์์ ํจ์ ๋ณด์ฅํ ์ ์์ ๋ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ก๋ค. ์ด ์ ๋ํ
์ด์
์ ์ฌ์ฉํ๋ฉด ํด๋ผ์ด์ธํธ ์ธก์์ ๋ฐ์ํ๋ ๊ฒฝ๊ณ ๋ฅผ ์จ๊ธธ ์ ์๋ค.
ํ์ง๋ง,
@SafeVarargs
๋ฅผ ์ฌ์ฉํ ๋๋ ๋ฉ์๋๊ฐ ์ค์ ๋ก ํ์ ์์ ํ์ง ํ์ธํด์ผ ํ๋ค.
๋ฉ์๋๊ฐ ํ์ ์์ ํ๋ค๊ณ ํ๋จํ ์ ์๋ ๊ฒฝ์ฐ๋ ๋ค์๊ณผ ๊ฐ๋ค:
- ๊ฐ๋ณ์ธ์ ๋ฐฐ์ด์ ๊ฐ์ ์ ์ฅํ์ง ์๋ ๊ฒฝ์ฐ: ๊ฐ๋ณ์ธ์ ๋ฐฐ์ด์ ์์๋ฅผ ์์ ํ๊ฑฐ๋ ๋ฎ์ด์ฐ์ง ์๋๋ค๋ฉด ์์ ํ๋ค.
- ๋ฐฐ์ด์ ์ฐธ์กฐ๊ฐ ์ธ๋ถ์ ๋ ธ์ถ๋์ง ์๋ ๊ฒฝ์ฐ: ๋ฉ์๋๊ฐ ๊ฐ๋ณ์ธ์ ๋ฐฐ์ด์ ์ธ๋ถ์ ๋ ธ์ถํ์ง ์๊ณ , ๋ด๋ถ์ ์ผ๋ก๋ง ์ฌ์ฉํ๋ค๋ฉด ์์ ํ๋ค.
@SafeVarargs
@SuppressWarnings("varargs")
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
๋ค์ ๋ ์กฐ๊ฑด์ ๋ชจ๋ ๋ง์กฑํ๋ ์ ๋ค๋ฆญ 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;
}
์ ๋ฉ์๋๋ @SafeVarargs
์ ๋ํ
์ด์
์ ์ฌ์ฉํ์ฌ ํ์
์์ ์ฑ์ ๋ณด์ฅํ๋ฉฐ, ๊ฐ๋ณ์ธ์ ๋ฐฐ์ด์ ๋ด์ฉ์ ์์ ํ์ง ์๊ณ , ๋ฐฐ์ด์ ์ธ๋ถ์ ๋
ธ์ถํ์ง ์๊ธฐ ๋๋ฌธ์ ์์ ํ๋ค.
์๋ ์ฝ๋๋ ๊ฐ๋ณ์ธ์๋ฅผ ์ฌ์ฉํด ์์ฑ๋ ๋ฐฐ์ด์ ๊ทธ๋๋ก ๋ฐํํ๊ธฐ ๋๋ฌธ์ ์์ ํ์ง ์๋ค
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(); // ๋๋ฌํ ์ ์๋ค.
}
์ด ๋ฉ์๋๋ pickTwo
๋ฉ์๋๋ฅผ ํธ์ถํ๋ ์ชฝ์์ ClassCastException
์ ์ ๋ฐํ ์ ์๋๋ค. ๋ด๋ถ์ ์ผ๋ก ์์ฑ๋ ๋ฐฐ์ด์ด Object[]
ํ์
์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ค๋ฆญ ๊ฐ๋ณ์ธ์ ๋ฉ์๋์ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋์ฐ๋ฏธ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ๋์ฐ๋ฏธ ๋ฉ์๋๋ ์์ผ๋์นด๋ ํ์ ์ ํ์ ๋งค๊ฐ๋ณ์๋ก ๋ณํํ์ฌ ํ์ ์์ ์ฑ์ ํ๋ณดํ๋ ์ญํ ์ ํ๋ค.
public static void wildcardSwap(List<?> list, int i, int j) {
wildcardSwapHelper(list, i, j);
}
private static <E> void wildcardSwapHelper(List<E> list, int i, int j) {
list.set(i, list.set(j, list.get(i)));
}
์ ์ฝ๋์์ wildcardSwapHelper
๋ฉ์๋๋ List<E>
ํ์
์ ์ฌ์ฉํ์ฌ, List<?>
ํ์
์์ ๊บผ๋ธ ์์์ ํ์
์ ํ์
๋งค๊ฐ๋ณ์๋ก ๋ณํํ๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ธ๋ถ์์๋ List<?>
ํ์
์ ์ฌ์ฉํด ์ ์ฐํ๊ฒ ์ฒ๋ฆฌํ๊ณ , ๋ด๋ถ์์๋ List<E>
ํ์
์ ์ฌ์ฉํด ํ์
์์ ์ฑ์ ๋ณด์ฅํ ์ ์๋ค.
๊ฐ๋ณ์ธ์ ๋ฉ์๋ ๋์ , Java ํ์ค API์ธ List.of()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์์ ํ๋ค.
public static <T> List<T> pickTwo2(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(); // ๋๋ฌํ ์ ์๋ค.
}
@Test
public void test2() {
List<String> pickTwo = pickTwo2("์ผ", "์ด", "์ผ");
System.out.println("pickTwo = " + pickTwo);
}
List.of()
์ฌ์ฉ:List.of()
๋ Java 9 ์ด์์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ด๋ถ์ ์ผ๋ก@SafeVarargs
์ ๋ํ ์ด์ ์ด ์ ์ฉ๋์ด ์์ด ์์ ํ๊ฒ ๊ฐ๋ณ์ธ์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ ์ ์๋ค.- ์ฅ์ : ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํจ์ผ๋ก์จ ๊ฐ๋ณ์ธ์ ๋ฉ์๋๋ณด๋ค ๋์ฑ ์์ ํ๊ณ ์ผ๊ด๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
๊ฐ๋ณ์ธ์์ ์ ๋ค๋ฆญ์ ์ ์ด์ธ๋ฆฌ์ง ์๋๋ค.
์ ๋ค๋ฆญ ๊ฐ๋ณ์ธ์๋ ์ค๋ฌด์์ ๋งค์ฐ ์ ์ฉํ์ง๋ง, ํ์
์์ ์ฑ์ ์ ๊ฒฝ ์จ์ผ ํ๋ค. @SafeVarargs
์ ๋ํ
์ด์
์ ์ฌ์ฉํ๊ฑฐ๋ ๋์ฐ๋ฏธ ๋ฉ์๋๋ฅผ ํตํด ์์ผ๋์นด๋ ํ์
์ ํ์
๋งค๊ฐ๋ณ์๋ก ๋ณํํ์ฌ ํ์
์์ ์ฑ์ ํ๋ณดํ ์ ์๋ค. ํญ์ ๊ฐ๋ณ์ธ์ ๋ฐฐ์ด์ ๊ฐ์ ์ ์ฅํ์ง ์๋๋ก ์ฃผ์ํ๊ณ , ๋ฐฐ์ด์ ์ธ๋ถ์ ๋
ธ์ถํ์ง ์๋ ๊ฒ์ด ์์ ์ฑ์ ๋ณด์ฅํ๋ ํต์ฌ
- ๊ฐ๋ณ์ธ์ ๊ธฐ๋ฅ์ ๋ฐฐ์ด์ ๋ ธ์ถํ์ฌ ์ถ์ํ๊ฐ ์๋ฒฝํ์ง ๋ชปํ๊ณ , ๋ฐฐ์ด๊ณผ ์ ๋ค๋ฆญ ํ์ ์ ๊ท์น์ด ์๋ก ๋ค๋ฅด๋ค.
- ์ ๋ค๋ฆญ
varargs ๋งค๊ฐ๋ณ์
๋ ํ์ ์์ ํ์ง๋ ์์ง๋ง, ํ์ฉ๋๋ค. - ๋งค์ฐ ํธ๋ฆฌํ์ง๋ง, ์ธ๋ถ์ varargs ๋ฐฐ์ด์ ๋ ธ์ถํ๊ฑฐ๋, ๋ด๋ถ์ ์ผ๋ก ๋ค๋ฅธ ๋ฐฐ์ด์ ์ ์ฅํด๋๊ณ ๋ณ์กฐํ๋ ๋ฑ์ ์ผ์ ์์ ํด์ผ ํ๋ค.
- ์์ ์ด ๋ณด์ฅ๋์๋ค๋ฉด
@SafeVarargs
์ ๋ํ ์ด์ ์ ์ด์ฉํ์ฌ ์์ ํจ์ ํ์ํ์.
๊ฒฐ๊ตญ ์ฐ์ง ๋ง๋ผ๋ ๊ฑฐ์์...? ์ ์ค์ ์ฝ๋์์๋ ์ ์๋์ด ์๋ ํด๋์ค ๋นผ๊ณ ๋ ์ ์ฐ๋ ๋ฏ?
์๋๋ Collection ํด๋์ค
์ถ์ฒ