๐ฏ ์์ดํ
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=