2023. 3. 17. 10:17ใJAVA/Effective JAVA
[์ดํํฐ๋ธ ์๋ฐ] Item28. ๋ฐฐ์ด๋ณด๋ค๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ผ.
๋ฐฐ์ด๊ณผ ์ ๋ค๋ฆญ ํ์ ์๋ ์ค์ํ ๋๊ฐ์ง ์ฐจ์ด์ ์ด ์๋ค.
1๏ธโฃ ๋ฐฐ์ด์ ๊ณต๋ณ์ด๊ณ , ์ ๋ค๋ฆญ์ ๋ถ๊ณต๋ณ์ด๋ค.
๊ณต๋ณ, ๋ถ๊ณต๋ณ ๋ง์ด ์ด๋ ค์ด๋ฐ ์ฐ์ ๊ณต๋ณ์ 'ํจ๊ป ๋ณํ๋ค' ๋ผ๋ ๋ป์ด๋ค.
// ๊ณต๋ณ
Object[] anything = new String[10]; // String ํ์
์ Object ํ์
์ ๋ด์ ์ ์๋ค. (ํธํ์ด ๋๊ธฐ ๋๋ฌธ์)
anything[0] = 1; // ์ปดํ์ผ ์๋ฌ๊ฐ ๋์ง ์์ง๋ง ๋ฌธ์ ๊ฐ ์๋ ์ฝ๋๋ค. (๋ฌธ์์ด ๋ฐฐ์ด์ธ๋ฐ ์ซ์๋ฅผ ๋ฃ๊ณ ์์ผ๋ฏ๋ก ๋ฒ๊ทธ๋ค..!)
๋ฐฐ์ด์์๋ Sub์ด Super์ ํ์ ํ์ ์ด๋ผ๋ฉด ๋ฐฐ์ด Sub[]์ Super[]์ ํ์ ํ์ ์ด ๋๋ค.
์์ ๋ฐ๋ผ์ Object๋ String์ ์์ ํ์ ์ด๊ธฐ ๋๋ฌธ์ Object[]์ String[]์ ๋ด์ ์ ์๋ค.
// ๋ถ๊ณต๋ณ
List<String> names = new ArrayList<>();
// List<Object> objects = names; // List<String>์ List<Object>์ ๋ฃ์ ์ ์๋ค. compile error ๋ฐ์
ํ์ง๋ง ์ ๋ค๋ฆญ์ ๋ถ๊ณต๋ณ์ผ๋ก ์ฆ, ์๋ก ๋ค๋ฅธ ํ์ Type1 ๊ณผ Type2๊ฐ ์์ ๋ List<Type1> ์ List<Type2>์ ํ์ ํ์ ๋ ์๋๊ณ ์์ ํ์ ๋ ์๋๋ค.
์ง๊ธ ์์ ์์ ๋ฐฐ์ด์ด๋ ๋ฆฌ์คํธ์ด๋ String์ ์ซ์๋ฅผ ๋ฃ์ ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋๋๊ฑด ๋ง๋ค.
๊ทธ๋ฐ๋ฐ ๋ฐฐ์ด์์๋ ์ปดํ์ผ ์์ ์ ์๋ฌ๋ฅผ ๋ฐ๊ฒฌํ์ง ๋ชปํ๊ณ ๋ฐํ์์์์ผ ์ ์ ์์ง๋ง, ๋ฆฌ์คํธ๋ ์ปดํ์ผํ ๋ ๋ฐ๋ก ์ ์ ์๋ค.
๊ณ~~์ ์๊ธฐํ๋๊ฑฐ์ง๋ง ์ปดํ์ผ ์์ ์ ์๋ฌ๋ฅผ ๋ฐ๊ฒฌํ๋๊ฒ ํจ์ฌ ์ข๋ค ใ ใ
2๏ธโฃ ๋ฐฐ์ด์ ์ค์ฒดํ๊ฐ ๋๊ณ , ์ ๋ค๋ฆญ์ ์ค์ฒดํ ๋์ง ์๋๋ค. (์๊ฑฐ)
๋ฐฐ์ด์ ์ค์ฒดํ๊ฐ ๋๋ค๋ ๊ฒ์ ๋ฐฐ์ด์ ๋ฐํ์์๋ ์์ ์ด ๋ด๊ธฐ๋ก ํ ์์์ ํ์ ์ ์ธ์งํ๊ณ ํ์ธํ๊ณ ์๋ค๋ ๊ฒ์ด๋ค.
๋ฐ๋ฉด์ ์ ๋ค๋ฆญ์ ํ์ ์ ๋ณด๊ฐ ๋ฐํ์์๋ ์๊ฑฐ๊ฐ ๋๋ค. -> ์์ ํ์ ์ ์ปดํ์ผ์๋ง ๊ฒ์ฌํ๋ฉฐ ๋ฐํ์์๋ ์ ์ ์กฐ์ฐจ ์๋ค๋ ๋ป์ด๋ค.
public static void main(String[] args)
{
// ์ปดํ์ผํ๊ณ ๋๋ฉด ์ ๋ค๋ฆญ์ด ์ฌ๋ผ์ง๋ค. (์๊ฑฐ) -> ํ์ ํธํ์ฑ์ ์ํด์ ์๊ฑฐ์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ณ ํ๋ณํ ์ฝ๋๋ฅผ ๋ฃ์ด์ค
List<String> names = new ArrayList<>();
names.add("hyejin");
String name = names.get(0);
System.out.println("name = " + name);
}
byte code๋ก ํ์ธ์ ํด๋ณด๋ฉด (IntelliJ ์์๋ shift ๋๋ฒ ๋๋ฅด๊ณ show bytecode ํ๋ฉด ํ์ธํ ์ ์๋ค.)
List๋ ์ ๋ค๋ฆญ์ด ์๊ฑฐ๋๊ณ ๋ก ํ์ ์ธ ๊ฒ์ ํ์ธํ ์ ์๊ณ , ๋ฐ์์ String์ผ๋ก cast ํ๊ณ ์๋ค.
* ์๊ฑฐ๋ ์ ๋ค๋ฆญ์ด ์ง์๋๊ธฐ ์ ์ ๋ ๊ฑฐ์ ์ฝ๋์ ์ ๋ค๋ฆญ ํ์ ์ ํจ๊ป ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๋ฉ์ปค๋์ฆ์ผ๋ก ์๋ฐ 5๊ฐ ์ ๋ค๋ฆญ์ผ๋ก ์์กฐ๋กญ๊ฒ ์ ํ๋ ์ ์๋๋ก ํด์คฌ๋ค.
์ด๋ฐ ์ฐจ์ด๋ก ์ธํด ๋ฐฐ์ด๊ณผ ์ ๋ค๋ฆญ์ ์ ์ด์ฐ๋ฌ์ง์ง ๋ชปํ๋ค.
๋ฐฐ์ด์ ์ ๋ค๋ฆญ ํ์ , ๋งค๊ฐ๋ณ์ํ ํ์ , ํ์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ ์ ์๋ค. -> ์ฆ, new List<E>[], new List<String>[], new E[] ์ด๋ฐ์์ผ๋ก ์ฌ์ฉํ์ง ๋ชปํ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ฐ์์ผ๋ก ์์ฑํ๋ฉด ์ปดํ์ผํ ๋ ์ ๋ค๋ฆญ ๋ฐฐ์ด ์์ฑ ์ค๋ฅ๋ฅผ ์ผ์ผํจ๋ค.
-> ์ ๋ค๋ฆญ ๋ฐฐ์ด์ ์์ฑํ์ง ๋ชปํ๊ฒ ํ๋ ์ด์ ๋ ํ์ ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค! ์ด๋ฅผ ํ์ฉํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์๋ ์์ฑํ ํ๋ณํ ์ฝ๋์์ ๋ฐํ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ผ๋ก ๋ฐํ์์ด ๋ฐ์ํ๋ ์ผ์ ๋ง์์ฃผ๊ฒ ๋ค๋ ์ ๋ค๋ฆญ ํ์ ์์คํ ์ ์ทจ์ง์ ๋ง์ง ์๊ธฐ ๋๋ฌธ์ด๋ค.
public class Chooser_Array // ๋ฐฐ์ด ๊ธฐ๋ฐ Chooser
{
private final Object[] choiceList;
public Chooser_Array(Collection choices)
{
choiceList = choices.toArray();
}
public Object choose()
{
Random rnd = ThreadLocalRandom.current();
return choiceList[rnd.nextInt(choiceList.length)];
}
public static void main(String[] args)
{
List<Integer> intList = List.of(1, 2, 3, 4, 5, 6);
Chooser_Array chooser = new Chooser_Array(intList);
for (int i = 0; i < 10; i++)
{
Number choice = (Number) chooser.choose();
System.out.println("choice = " + choice);
}
}
}
-> ์์ฑ์์์ ์ปฌ๋ ์ ์ ๋ฐ๋ Chooser_Array ํด๋์ค๊ฐ ์๋ค.
์ด ํด๋์ค์์๋ ์ปฌ๋ ์ ์์ ์์ ์ค ํ๋๋ฅผ ๋ฌด์์๋ก ์ ํํด ๋ฐํํ๋ choose ๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ค.
์ผ๋จ Choose_Array ํด๋์ค๋ ์ ๋ค๋ฆญ์ ์ฌ์ฉํ์ง ์๊ณ ๋ฐฐ์ด์ ์ฌ์ฉํ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฒ์ ์ด๋ค.
๋ฐฐ์ด ๊ธฐ๋ฐ Chooser ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด choose ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ๋ง๋ค ๋ฐํ๋ Object๋ฅผ ์ํ๋ ํ์ ์ผ๋ก ํ๋ณํํด์ค์ผ ํ๋ค.
Number choice = (Number) chooser.choose();
๊ทผ๋ฐ ์ด๋ ํน์๋ ํ์ ์ด ๋ค๋ฅธ ์์๊ฐ ๋ค์ด ์๋ค๋ฉด ๋ฐํ์์ ํ๋ณํ ์ค๋ฅ๊ฐ ๋ ๊ฒ์ด๋ค.
public class Chooser_List<T> // ๋ฆฌ์คํธ ๊ธฐ๋ฐ Chooser
{
private final List<T> choiceList;
public Chooser_List(Collection<T> choices)
{
choiceList = new ArrayList<>(choices);
}
public T choose()
{
Random rnd = ThreadLocalRandom.current();
return choiceList.get(rnd.nextInt(choiceList.size()));
}
public static void main(String[] args)
{
// ๋ฆฌ์คํธ ๊ธฐ๋ฐ chooser๋ ํจ์ฌ ๋ ์์ ํ ์ฝ๋๊ฐ ๋๋ค.
List<Integer> intList = List.of(1, 2, 3, 4, 5, 6);
Chooser_List<Integer> chooser = new Chooser_List<>(intList);
for (int i = 0; i < 10; i++)
{
Number choice = chooser.choose();
System.out.println("choice = " + choice);
}
}
}
์ด ํด๋์ค๋ ์ด์ ๋ฐฐ์ด ๋์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ ํด๋์ค๋ก ํ์ ์์ ์ฑ๊ณผ ์ํธ์ด์ฉ์ฑ์ด ํจ์ฌ ์ข์์ง๋ค.
๐ ์ ๋ฆฌ
๋ฐฐ์ด๊ณผ ์ ๋ค๋ฆญ์ ๋๊ฐ์ง ๋ค๋ฅธ ํ์ ๊ท์น์ด ์ ์ฉ๋๋ค.
๋ฐฐ์ด์ ๊ณต๋ณ์ด๊ณ ์ค์ฒดํ๋๋ ๋ฐ๋ฉด, ์ ๋ค๋ฆญ์ ๋ถ๊ณต๋ณ์ด๊ณ ํ์ ์ ๋ณด๊ฐ ์๊ฑฐ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ๋ฐํ์์๋ ํ์ ์์ ํ์ง๋ง ์ปดํ์ผํ์์๋ ๊ทธ๋ ์ง ์๋ค. ์ ๋ค๋ฆญ์ ๊ทธ ๋ฐ๋๊ณ ,,
๋ฐ๋ผ์ ์ด ๋์ ์์ด ์ฐ๊ธฐ๊ฐ ์ด๋ ต๋ค. ๋ฐ๋ผ์ ๋ฐฐ์ด๋ณด๋ค๋ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข๋ค!!
'JAVA > Effective JAVA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ดํํฐ๋ธ ์๋ฐ] Item29. ์ด์์ด๋ฉด ์ ๋ค๋ฆญ ํ์ ์ผ๋ก ๋ง๋ค๋ผ. (0) | 2023.03.20 |
---|---|
[์ดํํฐ๋ธ ์๋ฐ] Item28 ์๋ฒฝ๊ณต๋ต. @SafeVarags (0) | 2023.03.17 |
[์ดํํฐ๋ธ ์๋ฐ] Item27 ์๋ฒฝ๊ณต๋ต. ์ ๋ํ ์ด์ (0) | 2023.03.16 |
[์ดํํฐ๋ธ ์๋ฐ] Item27. ๋น๊ฒ์ฌ ๊ฒฝ๊ณ ๋ฅผ ์ ๊ฑฐํ๋ผ. (0) | 2023.03.16 |
[์ดํํฐ๋ธ ์๋ฐ] Item26 ์๋ฒฝ๊ณต๋ต. GenericRepository (0) | 2023.03.15 |