๐ฏ ์์ดํ
28. ๋ฐฐ์ด๋ณด๋ค๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ผ.
๋ฐฐ์ด๊ณผ ์ ๋ค๋ฆญ ํ์ ์๋ ์ค์ํ ์ฐจ์ด๊ฐ ๋ ๊ฐ์ง ์๋ค.
1๏ธโฃ ๋ฐฐ์ด์ ๊ณต๋ณ์ด์ง๋ง, ์ ๋ค๋ฆญ์ ๋ถ๊ณต๋ณ์ด๋ค.
Sub๊ฐ Super์ ํ์ ํ์
์ด๋ผ๋ฉด ๋ฐฐ์ด Sub[]๋ ๋ฐฐ์ด Super[]์ ํ์ ํ์
์ด ๋๋ค.
๋ฐ๋ฉด, ์๋ก ๋ค๋ฅธ ํ์
Type1, Type2๊ฐ ์์ ๋, List<Type1>์ List<Type2>์ ํ์ ํ์
๋ ์๋๊ณ ์์ ํ์
๋ ์๋๋ค.
์ด๋ ์ชฝ์ด๋ Long์ฉ ์ ์ฅ์์ String์ ๋ฃ์ ์๋ ์๋ค. ๋ค๋ง ๋ฐฐ์ด์์๋ ๊ทธ ์ค์๋ฅผ ๋ฐํ์์์ผ ์๊ฒ ๋์ง๋ง, ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํ์ผํ ๋ ๋ฐ๋ก ์ ์ ์๋ค.
2๏ธโฃ ๋ฐฐ์ด์ ์ค์ฒดํ(reify)๋๋ค.
๋ฐฐ์ด์ ๋ฐํ์์๋ ์์ ์ด ๋ด๊ธฐ๋ก ํ ์์์ ํ์
์ ์ธ์งํ๊ณ ํ์ธํ๋ค. ๊ทธ๋์ ์ ์ฝ๋์ ๋ณด๋ฏ Long๋ฐฐ์ด์ String์ ๋ฃ์ผ๋ ค ํ๋ฉด ArrayStoreException์ด ๋ฐ์ํ๋ค.
๋ฐ๋ฉด, ์ ๋ค๋ฆญ์ ํ์
์ ๋ณด๊ฐ ๋ฐํ์์๋ ์๊ฑฐ(erasure)๋๋ค.
- Item28.java
public class Item28 {
public static void main(String[] args) {
List<String> strings = new ArrayList<>();
strings.add("que");
strings.add("devel");
}
}
Item28.java๋ฅผ ์ปดํ์ผํ Item28.class
public class Item28 {
public Item28() {
}
public static void main(String[] var0) {
ArrayList var1 = new ArrayList();
var1.add("que");
var1.add("devel");
}
}
์ด๋ฌํ ์๊ฑฐ๋ ์ ๋ค๋ฆญ์ด ์ง์๋๊ธฐ ์ ์ ๋ ๊ฑฐ์ ์ฝ๋์ ์ ๋ค๋ฆญ ํ์ ์ ํจ๊ป ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๋งค์ปค๋์ฆ์ผ๋ก, ์๋ฐ5๊ฐ ์ ๋ค๋ฆญ์ผ๋ก ์์กฐ๋กญ๊ฒ ์ ํ๋ ์ ์๋๋ก ํด์คฌ๋ค.
๋ฐฐ์ด์ ์ ๋ค๋ฆญ ํ์
, ๋งค๊ฐ๋ณ์ํ ํ์
, ํ์
๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ ์ ์๋ค.
์ฆ, new List<E>, new List<String>[], new E[] ์์ผ๋ก ์์ฑํ๋ฉด ์ปดํ์ผํ ๋ ์ ๋ค๋ฆญ ๋ฐฐ์ด ์์ฑ ์ค๋ฅ๋ฅผ ์ผ์ผํจ๋ค.
๊ทธ ์ด์ ๋ ํ์
์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ ํ์ฉํ๋ค๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์๋ ์์ฑํ ํ๋ณํ ์ฝ๋์์ ๋ฐํ์์ ClassCastException์ด ๋ฐ์ํ ์ ์๋ค.
- ์ ๋ค๋ฆญ ๋ฐฐ์ด ์์ฑ์ ํ์ฉํ์ง ์๋ ์ด์ - ์ปดํ์ผ๋์ง ์๋๋ค.
List<String>[] stringLists = new List<String>[1]; // (1)
List<Integer> intList = List.of(42); // (2)
Object[] objects = stringLists; // (3)
objects[0] = intList; // (4)
String s = stringLists[0].get(0); // (5)
๐ฉ if. ์ ๋ค๋ฆญ ๋ฐฐ์ด์ ์์ฑํ๋ (1)์ด ํ์ฉ๋๋ค๋ฉด?
1๏ธโฃ (2)๋ ์์๊ฐ ํ๋์ธ List<Integer>๋ฅผ ์์ฑํ๋ค.
2๏ธโฃ (3)์ (1)์์ ์์ฑํ List<String>์ ๋ฐฐ์ด์ Object ๋ฐฐ์ด์ ํ ๋นํ๋ค. ๋ฐฐ์ด์ ๊ณต๋ณ์ด๋ ์๋ฌด ๋ฌธ์ ์๋ค.
3๏ธโฃ (4)๋ (2)์์ ์์ฑํ List<Integer>์ ์ธ์คํด์ค๋ฅผ Object ๋ฐฐ์ด์ ์ฒซ ์์๋ก ์ ์ฅํ๋ค. ์ ๋ค๋ฆญ์ ์๊ฑฐ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด์ ์ด ์ญ์ ์ฑ๊ณตํ๋ค.
( ์ฆ, ๋ฐํ์์๋ List<Integer> ์ธ์คํด์ค์ ํ์
์ ๋จ์ํ List๊ฐ ๋๊ณ , List<Integer>[] ์ธ์คํด์ค์ ํ์
์ List[]๊ฐ ๋๋ค. ๋ฐ๋ผ์ (4)์์๋ ArrayStoreException์ ์ผ์ผํค์ง ์๋๋ค.)
4๏ธโฃ List<String> ์ธ์คํด์ค๋ง ๋ด๊ฒ ๋ค๊ณ ์ ์ธํ stringLists๋ฐฐ์ด์๋ ์ง๊ธ List<Integer> ์ธ์คํด์ค๊ฐ ์ ์ฅ๋ผ ์๋ค. ๊ทธ๋ฆฌ๊ณ (5)๋ ์ด ๋ฐฐ์ด์ ์ฒ์ ๋ฆฌ์คํธ์์ ์ฒซ ์์๋ฅผ ๊บผ๋ด๋ ค ํ๋ค.
5๏ธโฃ ์ปดํ์ผ๋ฌ๋ ๊บผ๋ธ ์์๋ฅผ ์๋์ผ๋ก String์ผ๋ก ํ๋ณํํ๋๋ฐ, ์ด ์์๋ Integer์ด๋ฏ๋ก ๋ฐํ์์ ClassCastException์ด ๋ฐ์ํ๋ค.
๋ฐ๋ผ์, ์ด๋ฐ ์ผ์ ๋ฐฉ์งํ๋ ค๋ฉด (1)์์ ์ปดํ์ผ ์ค๋ฅ๋ฅผ ๋ด์ผ ํ๋ค.
์๊ฑฐ ๋งค์ปค๋์ฆ ๋๋ฌธ์ ๋งค๊ฐ๋ณ์ํ ํ์
๊ฐ์ด๋ฐ ์ค์ฒดํ๋ ์ ์๋ ํ์
์ List<?>์ Map<?,?> ๊ฐ์ ๋นํ์ ์ ์์ผ๋ ์นด๋ ํ์
๋ฟ์ด๋ค.
but, ๋ฐฐ์ด์ ๋นํ์ ์ ์์ผ๋์นด๋ ํ์
์ผ๋ก ๋ง๋ค ์๋ ์์ง๋ง, ์ ์ฉํ๊ฒ ์ฐ์ผ ์ผ์ ๊ฑฐ์ ์๋ค.
- ์์ฑ์์์ ์ปฌ๋ ์
์ ๋ฐ๋ Chooser ํด๋์ค
public class Chooser {
private final Object[] choiceArray;
public Chooser(Collection choiceArray) {
this.choiceArray = choiceArray.toArray();
}
public Object choose(){
Random rnd = ThreadLocalRandom.current();
return choiceArray[rnd.nextInt(choiceArray.length)];
}
}
- ๋ฆฌ์คํธ ๊ธฐ๋ฐ Chooser - ํ์
์์ ์ฑ ํ๋ณด!
public class Chooser<T> {
private final List<T> choiceArray;
public Chooser(Collection<T> choiceArray) {
this.choiceArray = new ArrayList<>(choiceArray);
}
public T choose(){
Random rnd = ThreadLocalRandom.current();
return choiceArray.get(rnd.nextInt(choiceArray.size()));
}
}
์ฐธ๊ณ ์๋ฃ
Joshua Bloch, ใEffective Java 3/Eใ, ๊ฐ์๋งต์ ์ฎ๊น, ํ๋ก๊ทธ๋๋ฐ์ธ์ฌ์ดํธ(2018)
http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&mallGb=KOR&barcode=9788966262281&orderClick=LEa&Kc=