์๋
! ์ค๋ ์์
์์๋ ๊ณ์ํด์ ์ ๋ค๋ฆญ์ ๋ํด ๊ณต๋ถํ๊ฒ ์ต๋๋ค. ๊ณต๊ต๋กญ๊ฒ๋ ์ด๊ฒ์ ํฐ ์ฃผ์ ์ด์ง๋ง ํผํ ์๋ ์์ต๋๋ค. ์ธ์ด์ ๋งค์ฐ ์ค์ํ ๋ถ๋ถ ์
๋๋ค . ์์ ๊ฐ๋ฅํ ์ ํ . ์์ ๊ฐ๋ฅํ ์ ํ์ ๋ฐํ์์ ์ ๋ณด๋ฅผ ์์ ํ ์ฌ์ฉํ ์ ์๋ ์ ํ์
๋๋ค. Java์์ ์ด๋ฌํ ์ ํ์๋ ํ๋ฆฌ๋ฏธํฐ๋ธ, ์์ ์ ํ ๋ฐ ๋น์ ๋ค๋ฆญ ์ ํ์ด ํฌํจ๋ฉ๋๋ค. ๋ฐ๋๋ก ์์ ๋ถ๊ฐ๋ฅ ์ ํ์ ์ ๋ณด๊ฐ ์ง์์ง๊ณ ๋ฐํ์์ ์ก์ธ์คํ ์ ์๊ฒ ๋๋ ์ ํ์
๋๋ค. ๊ณต๊ต๋กญ๊ฒ๋ ์ด๋ค์ ์ ๋ค๋ฆญ โ
List<String>
, List<Integer>
๋ฑ ์
๋๋ค.
๊ทธ๋ฐ๋ฐ varargs๊ฐ ๋ฌด์์ธ์ง ๊ธฐ์ตํ์ญ๋๊น?
์์ด๋ฒ๋ ธ์ ๊ฒฝ์ฐ๋ฅผ ๋๋นํด ์ด๊ฒ์ ๊ฐ๋ณ ๊ธธ์ด ์ธ์์ ๋๋ค. ๋ฉ์๋์ ์ผ๋ง๋ ๋ง์ ์ธ์๊ฐ ์ ๋ฌ๋ ์ง ๋ชจ๋ฅด๋ ์ํฉ์์ ์ ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ฉ์๋๊ฐ ์๋ ๊ณ์ฐ๊ธฐ ํด๋์ค๊ฐ ์๋ ๊ฒฝ์ฐ์ ๋๋คsum
. ๋ฉ์๋ sum()
๋ 2๊ฐ, 3๊ฐ, 5๊ฐ ๋๋ ์ํ๋ ๋งํผ ๋ฐ์ ์ ์์ต๋๋ค. sum()
๊ฐ๋ฅํ ๋ชจ๋ ์ธ์ ์์ ๋ํด ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ก๋ํ๋ ๊ฒ์ ๋งค์ฐ ์ด์ํ ๊ฒ์
๋๋ค . ๋์ ๋ค์๊ณผ ๊ฐ์ด ํ ์ ์์ต๋๋ค.
public class SimpleCalculator {
public static int sum(int...numbers) {
int result = 0;
for(int i : numbers) {
result += i;
}
return result;
}
public static void main(String[] args) {
System.out.println(sum(1,2,3,4,5));
System.out.println(sum(2,9));
}
}
์ฝ์ ์ถ๋ ฅ:
15
11
์ด๋ ์ ๋ค๋ฆญ๊ณผ ํจ๊ป varargs๋ฅผ ์ฌ์ฉํ ๋ ๋ช ๊ฐ์ง ์ค์ํ ๊ธฐ๋ฅ์ด ์์์ ๋ณด์ฌ์ค๋๋ค. ๋ค์ ์ฝ๋๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
import javafx.util.Pair;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static <E> void addAll(List<E> list, E... array) {
for (E element : array) {
list.add(element);
}
}
public static void main(String[] args) {
addAll(new ArrayList<String>(), // This is okay
"Leonardo da Vinci",
"Vasco de Gama"
);
// but here we get a warning
addAll(new ArrayList<Pair<String, String>>(),
new Pair<String, String>("Leonardo", "da Vinci"),
new Pair<String, String>("Vasco", "de Gama")
);
}
}
์ด ๋ฉ์๋๋ a ์ ์์ ๊ฐ์์ ๊ฐ์ฒด๋ฅผ addAll()
์
๋ ฅ์ผ๋ก ๋ฐ์ ๋ค์ ์ด๋ฌํ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ๋ชฉ๋ก์ ์ถ๊ฐํฉ๋๋ค. ๋ฉ์๋ ์์ ๋ฉ์๋๋ฅผ ๋ ๋ฒ ํธ์ถํฉ๋๋ค . ์ฒซ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ ๋ ๊ฐ์ ์ผ๋ฐ ๋ฌธ์์ด์ . ์ฌ๊ธฐ์ ๋ชจ๋ ๊ฒ์ด ์ ๋๋์ด ์์ต๋๋ค. ๋ ๋ฒ์งธ ๊ฒฝ์ฐ์๋ ์ ๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํฉ๋๋ค . ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ์๊ธฐ์น ์๊ฒ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์ต๋๋ค. List<E>
E
main()
addAll()
List
Pair<String, String>
List
Unchecked generics array creation for varargs parameter
๊ทธ๊ฒ ๋ฌด์จ ๋ป์ด์ผ? ๊ฒฝ๊ณ ๊ฐ ํ์๋๋ ์ด์ ๋ ๋ฌด์์ด๋ฉฐ ์ ๋ํ ์ธ๊ธ์ด ์๋ ์ด์ ๋ ๋ฌด์์
๋๊น array
? array
๊ฒฐ๊ตญ, ์ฐ๋ฆฌ ์ฝ๋์๋ ! ๊ฐ ์์ต๋๋ค. ๋ ๋ฒ์งธ ๊ฒฝ์ฐ๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. ๊ฒฝ๊ณ ๋ ์ปดํ์ผ๋ฌ๊ฐ ๊ฐ๋ณ ๊ธธ์ด ์ธ์(varargs)๋ฅผ ๋ฐฐ์ด๋ก ๋ณํํ๊ธฐ ๋๋ฌธ์ ๋ฐฐ์ด์ ์ธ๊ธํฉ๋๋ค. ์ฆ, ์ฐ๋ฆฌ addAll()
๋ฐฉ๋ฒ์ ์๋ช
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public static <E> void addAll(List<E> list, E... array)
์ค์ ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
public static <E> void addAll(List<E> list, E[] array)
์ฆ, main()
๋ฉ์๋์์ ์ปดํ์ผ๋ฌ๋ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ณํํฉ๋๋ค.
public static void main(String[] args) {
addAll(new ArrayList<String>(),
new String[] {
"Leonardo da Vinci",
"Vasco de Gama"
}
);
addAll(new ArrayList<Pair<String,String>>(),
new Pair<String,String>[] {
new Pair<String,String>("Leonardo","da Vinci"),
new Pair<String,String>("Vasco","de Gama")
}
);
}
๋ฐฐ์ด String
์ ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ฌ๋ Pair<String, String>
๋ฐฐ์ด์ ๊ทธ๋ ์ง ์์ต๋๋ค. ๋ฌธ์ ๋ ๊ทธ๊ฒ์ด Pair<String, String>
์์ ๋ถ๊ฐ๋ฅํ ์ ํ์ด๋ผ๋ ๊ฒ์
๋๋ค. ์ปดํ์ผํ๋ ๋์ ํ์ ์ธ์(<String, String>)์ ๋ํ ๋ชจ๋ ์ ๋ณด๊ฐ ์ง์์ง๋๋ค. ์ฌ์ ์ํ ์ ์๋ ์ ํ์ ๋ฐฐ์ด์ ๋ง๋๋ ๊ฒ์ Java์์ ํ์ฉ๋์ง ์์ต๋๋ค . Pair<String, String> ๋ฐฐ์ด์ ์๋์ผ๋ก ๋ง๋ค๋ ค๊ณ ํ๋ฉด ์ด๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
public static void main(String[] args) {
// Compilation error Generic array creation
Pair<String, String>[] array = new Pair<String, String>[10];
}
๊ทธ ์ด์ ๋ ๋ช
๋ฐฑํฉ๋๋ค. ์ ํ ์์ ์ฑ์
๋๋ค. ๊ธฐ์ตํ์๊ฒ ์ง๋ง ๋ฐฐ์ด์ ๋ง๋ค ๋ ๋ฐฐ์ด์ด ์ ์ฅํ ๊ฐ์ฒด(๋๋ ํ๋ฆฌ๋ฏธํฐ๋ธ)๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค.
int array[] = new int[10];
์ด์ ์์
์ค ํ๋์์ ์ ํ ์ญ์ ๋ฅผ ์์ธํ ์ดํด๋ณด์์ต๋๋ค. Pair
์ด ๊ฒฝ์ฐ ์ ํ ์ญ์ ๋ก ์ธํด ๊ฐ์ฒด๊ฐ ์์ ์ ์ฅ ํ๋ ์ ๋ณด๊ฐ ์์ค๋ฉ๋๋ค <String, String>
. ๋ฐฐ์ด์ ๋ง๋๋ ๊ฒ์ ์์ ํ์ง ์์ต๋๋ค. varargs ๋ฐ ์ ๋ค๋ฆญ๊ณผ ๊ด๋ จ๋ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ๋ ์ ํ ์ญ์ ๋ฐ ์๋ ๋ฐฉ์์ ๋ํด ๊ธฐ์ตํด์ผ ํฉ๋๋ค. ์์ฑํ ์ฝ๋์ ๋ํด ์ ๋์ ์ผ๋ก ํ์ ํ๊ณ ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ง ์์ ๊ฒ์์ ์๊ณ ์๋ ๊ฒฝ์ฐ ์ฃผ์์ ์ฌ์ฉํ์ฌ varargs ๊ด๋ จ ๊ฒฝ๊ณ ๋ฅผ ๋ ์ ์์ต๋๋ค . @SafeVarargs
@SafeVarargs
public static <E> void addAll(List<E> list, E... array) {
for (E element : array) {
list.add(element);
}
}
์ด ์ฃผ์์ ๋ฉ์๋์ ์ถ๊ฐํ๋ฉด ์ด์ ์ ๋ฐ์ํ ๊ฒฝ๊ณ ๊ฐ ๋ํ๋์ง ์์ต๋๋ค. ์ ๋ค๋ฆญ๊ณผ ํจ๊ป varargs๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ํ ์ ์๋ ๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ํ ์ค์ผ์
๋๋ค. ํ ์ค์ผ์ ๋ค์๊ณผ ๊ฐ์ ์ํฉ์์ ๋ฐ์ํ ์ ์์ต๋๋ค.
import java.util.ArrayList;
import java.util.List;
public class Main {
static List<String> polluteHeap() {
List numbers = new ArrayList<Number>();
numbers.add(1);
List<String> strings = numbers;
strings.add("");
return strings;
}
public static void main(String[] args) {
List<String> stringsWithHeapPollution = polluteHeap();
System.out.println(stringsWithHeapPollution.get(0));
}
}
์ฝ์ ์ถ๋ ฅ:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
๊ฐ๋จํ ๋งํด์ ํ ์ค์ผ์ ์ ํ์ ๊ฐ์ฒด๊ฐ A
ํ์ ์์ด์ผ ํ์ง๋ง B
์ ํ ์์ ๊ณผ ๊ด๋ จ๋ ์ค๋ฅ๋ก ์ธํด ์ ํ์ ๊ฐ์ฒด๊ฐ ํ์ ์๋ ๊ฒฝ์ฐ์
๋๋ค. ์ฐ๋ฆฌ์ ์์์ ์ด๊ฒ์ ์ ํํ ์ผ์ด๋๋ ์ผ์
๋๋ค. ๋จผ์ ์์ ๋ณ์๋ฅผ ์์ฑ ํ๊ณ ์ฌ๊ธฐ์ numbers
์ผ๋ฐ ์ปฌ๋ ์
( )์ ํ ๋นํ์ต๋๋ค . ๊ทธ๋ฐ ๋ค์ ์ปฌ๋ ์
์ ArrayList<Number>
๋ฒํธ๋ฅผ ์ถ๊ฐํ์ต๋๋ค .1
List<String> strings = numbers;
์ด ์ค์์ ์ปดํ์ผ๋ฌ๋ " Unchecked assignment... " ๊ฒฝ๊ณ ๋ฅผ ๋ฐํํ์ฌ ๊ฐ๋ฅํ ์ค๋ฅ๋ฅผ ๊ฒฝ๊ณ ํ๋ ค ํ์ง๋ง ๋ฌด์ํ์ต๋๋ค. List<String>
type ์ ์ ๋ค๋ฆญ ์ปฌ๋ ์
์ ๊ฐ๋ฆฌํค๋ type ์ ์ ๋ค๋ฆญ ๋ณ์๋ก ๋๋ฉ๋๋ค ArrayList<Number>
. ๋ถ๋ช
ํ ์ด ์ํฉ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค! ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ ๊ฒ ๋ฉ๋๋ค. ์ ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์ปฌ๋ ์
์ ๋ฌธ์์ด์ ์ถ๊ฐํฉ๋๋ค. ์ด์ ํ ์ค์ผ์ด ๋ฐ์ํ์ต๋๋ค. ์ซ์๋ฅผ ์ถ๊ฐํ ๋ค์ ๋งค๊ฐ๋ณ์ํ๋ ์ปฌ๋ ์
์ ๋ฌธ์์ด์ ์ถ๊ฐํ์ต๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ์ฐ๋ฆฌ์๊ฒ ๊ฒฝ๊ณ ํ์ง๋ง ์ฐ๋ฆฌ๋ ๊ทธ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ClassCastException
ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ ๋์์๋ง ์ป์ ์ ์์ต๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๊ฒ์ด varargs์ ์ด๋ค ๊ด๋ จ์ด ์์ต๋๊น? ์ ๋ค๋ฆญ๊ณผ ํจ๊ป varargs๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ํ ์ค์ผ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ค์์ ๊ฐ๋จํ ์์
๋๋ค.
import java.util.Arrays;
import java.util.List;
public class Main {
static void polluteHeap(List<String>... stringsLists) {
Object[] array = stringsLists;
List<Integer> numbersList = Arrays.asList(66,22,44,12);
array[0] = numbersList;
String str = stringsLists[0].get(0);
}
public static void main(String[] args) {
List<String> cars1 = Arrays.asList("Ford", "Fiat", "Kia");
List<String> cars2 = Arrays.asList("Ferrari", "Bugatti", "Zaporozhets");
polluteHeap(cars1, cars2);
}
}
๋ฌด์จ ์ผ์ด์ผ? ์ ํ ์ญ์ ๋ก ์ธํด ๊ฐ๋ณ ๊ธธ์ด ์ธ์
List<String>...stringsLists
๋ชฉ๋ก์ ๋ฐฐ์ด์ด ๋ฉ๋๋ค List[]
. ์ด ๋๋ฌธ์ Object[] array
๋ฉ์๋์ ์ฒซ ๋ฒ์งธ ์ค์ ์๋ ๋ณ์์ ์ฝ๊ฒ ํ ๋นํ ์ ์์ต๋๋ค. ๋ชฉ๋ก์ ์๋ ๊ฐ์ฒด์ ์ ํ์ด ์ง์์ก์ต๋๋ค! ๊ทธ๋ฆฌ๊ณ ์ด์ ์ฐ๋ฆฌ๋ Object[]
์๋ฐ์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ Object
! ์ฒ์์๋ ๋ฌธ์์ด ๋ชฉ๋ก์ ๋ฐฐ์ด๋ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ํ ์ญ์ ์ ๊ฐ๋ณ ์ธ์ ์ฌ์ฉ ๋๋ถ์ ์ซ์ ๋ชฉ๋ก์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก ์๋ก ๋ค๋ฅธ ์ ํ์ ๊ฐ์ฒด๋ฅผ ํผํฉํ์ฌ ํ์ ์ค์ผ์ํต๋๋ค. ClassCastException
๋ฐฐ์ด์์ ๋ฌธ์์ด์ ์ฝ์ผ๋ ค๊ณ ํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋ ๋ฌ๋ผ์ง๋๋ค . ์ฝ์ ์ถ๋ ฅ:
Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
๊ฐ๋จํ ๋ฉ์ปค๋์ฆ์ธ varargs๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ์๊ธฐ์น ์์ ๊ฒฐ๊ณผ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. :) ์ด๊ฒ์ผ๋ก ์ค๋ ์์
์ ๋๋ฉ๋๋ค. ๋ช ๊ฐ์ง ๊ณผ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ์์ง ๋ง์๊ณ , ์๊ฐ๊ณผ ์๋์ง๊ฐ ์๋ค๋ฉด ์ถ๊ฐ ๋
์๋ฅผ ๊ณต๋ถํ์ญ์์ค. " Effective Java "๋ ์ค์ค๋ก ์ฝ์ง ์์ต๋๋ค! :) ๋ค์ ์๊ฐ๊น์ง!
GO TO FULL VERSION