item 28 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
Effective Java 3e ์์ดํ 28๋ฅผ ์์ฝํ ๋ด์ฉ ์ ๋๋ค.
๋ฐฐ์ด
๊ณผ ์ ๋ค๋ฆญ ํ์
์๋ ์ค์ํ ์ฐจ์ด๊ฐ ๋ ๊ฐ์ง ์๋ค.
Sub
๊ฐ Super
์ ํ์ ํ์
์ด๋ผ๋ฉด ๋ฐฐ์ด Sub[]
๋ ๋ฐฐ์ด Super[]
์ ํ์ ํ์
์ด ๋๋ค. ๋ฐ๋ฉด ์ ๋ค๋ฆญ์ ๋ถ๊ณต๋ณ
์ด๋ค. ์ด๊ฒ๋ง ๋ณด๋ฉด ์ ๋ค๋ฆญ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํ ์๋ ์์ง๋ง ์ฌ์ค ๋ฌธ์ ๊ฐ ์๋ ๊ฑด ๋ฐฐ์ด ์ชฝ์ด๋ค.
Object[] objectArray = new Long[1];
objectArray[0] = "ํ์
์ด ๋ฌ๋ผ ๋ฃ์ ์ ์๋ค."; // ArrayStoreException์ ๋์ง๋ค.
๋ค์ ์ฝ๋๋ ์ดํด ๋ณด์
List<Object> ol = new ArrayList<Long>(); // ํธํ๋์ง ์๋ ํ์
์ด๋ค.
ol.add("ํ์
์ด ๋ฌ๋ผ ๋ฃ์ ์ ์๋ค.");
์ด๋ ์ชฝ์ด๋ Long
์ฉ ์ ์ฅ์์ String์ ๋ฃ์ ์๋ ์๋ค. ๋ค๋ง ๋ฐฐ์ด ์์๋ ๊ทธ ์ค์๋ฅผ ๋ฐํ์
์์ผ ์๊ฒ ๋์ง๋ง, ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํ์ผํ ๋ ๋ฐ๋ก ์ ์ ์๋ค.
๋ฐฐ์ด์ ๋ฐํ์
์๋ ์์ ์ด ๋ด๊ธฐ๋ก ํ ์์์ ํ์
์ ์ธ์งํ๊ณ ํ์ธํ๋ค. ๊ทธ๋์ ์ด์ ์์ ์์ ๋ณด๋ฏ์ด Long
๋ฐฐ์ด์ String
์ ๋ฃ์ผ๋ ค ํ๋ฉด ArrayStoreException
์ด ๋ฐ์ํ๋ค. ๋ฐ๋ฉด, ์์ ์ด์ผ๊ธฐํ๋ฏ ์ ๋ค๋ฆญ
์ ํ์
์ ๋ณด๊ฐ ๋ฐํ์
์๋ ์๊ฑฐ๋๋ค.
์ด์์ ์ฃผ์ ์ฐจ์ด๋ก ์ธํด ๋ฐฐ์ด
๊ณผ ์ ๋ค๋ฆญ
์ ์ ์ด์ฐ๋ฌ์ง์ง ๋ชปํ๋ค. ๋ฐฐ์ด์ ์ ๋ค๋ฆญ ํ์
, ๋งค๊ฐ๋ณ์ํ ํ์
, ํ์
๋งค๊ฐ๋ณ์
๋ก ์ฌ์ฉํ ์ ์๋ค. ์ฆ, ์ฝ๋๋ฅผ new List<E>[]
, new List<String>[]
, new E[]
์์ผ๋ก ์์ฑํ๋ฉด ์ปดํ์ผํ ๋ ์ ๋ค๋ฆญ ๋ฐฐ์ด ์์ฑ ์ค๋ฅ๋ฅผ ์ผ์ผํจ๋ค.
ํ์
์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ ํ์ฉํ๋ค๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์๋ ์์ฑํ ํ๋ณํ ์ฝ๋์์ ๋ฐํ์์ ClassCastException
์ด ๋ฐ์ํ ์ ์๋ค.
E
, List<E>
, List<String>
๊ฐ์ ํ์
์ ์ค์ฒดํ ๋ถ๊ฐ ํ์
์ด๋ผ ํ๋ค. ์ค์ฒดํ ๋์ง ์์์ ๋ฐํ์์๋ ์ปดํ์ผ ํ์๋ณด๋ค ํ์
์ ๋ณด๋ฅผ ์ ๊ฒ ๊ฐ์ง๋ ํ์
์ด๋ค. ์๊ฑฐ ๋ฉ์ปค๋์ฆ
๋๋ฌธ์ ๋งค๊ฐ ๋ณ์ํ ํ์
๊ฐ์ด๋ฐ ์ค์ฒดํ ๋ ์ ์๋ ํ์
์ List<?>
์ Map<?,?>
๊ฐ์ ๋น ํ์ ์ ์์ผ๋ ์นด๋
ํ์
๋ฟ์ด๋ค.
**์ ๋ค๋ฆญ ์ปฌ๋ ์
์์๋ ์์ ์ ์์ ํ์
์ ๋ด์ ๋ฐฐ์ด์ ๋ฐํํ๋ ๊ฒ ๋ณดํต์ ๋ถ๊ฐ๋ฅํ๋ค.** ๋ํ ์ ๋ค๋ฆญ ํ์
๊ณผ ๊ฐ๋ณ ์ธ์ ๋ฉ์๋
๋ฅผ ํจ๊ป ์ฐ๋ฉด ํด์ํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ๊ณ ๋ฉ์์ง๋ฅผ ๋ฐ๊ฒ ๋๋ค. ์ด ๋ฌธ์ ๋ @SafeVarargs
์๋ํ
์ด์
์ผ๋ก ๋์ฒํ ์ ์๋ค.
@SafeVarargs๋ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์์๊น?
์ ๋ค๋ฆญ์ ๊ฐ๋ณ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ ์ ์ฌ์ ์๋ฌ์ ๋ํ ๊ฒฝ๊ณ ๋ฅผ ๋ฌด์ํ ์ ์๋ค.
@SuppressWarning๋ฅผ ์ด์ฉํ์ฌ ์ ๋ค๋ฆญ ๋งค๊ฐ๋ณ์์ ๋ํ ๊ฒฝ๊ณ ๋ฌด์๋ฅผ ๋์ฒดํ๊ธฐ ์ํด ๋์ด
public class JavaExample{
@SafeVarargs
private void print(List... names) {
for (List<String> name : names) {
System.out.println(name);
}
}
public static void main(String[] args) {
JavaExample obj = new JavaExample();
List<String> list = new ArrayList<String>();
list.add("Kevin");
list.add("Rick");
list.add("Negan");
obj.print(list);
}
}
๋ฐฐ์ด๋ก ํ๋ณํ ํ ๋ ์ ๋ค๋ฆญ ๋ฐฐ์ด ์์ฑ ์ค๋ฅ๋ ๋น๊ฒ์ฌ ํ๋ณํ
๊ฒฝ๊ณ ๊ฐ ๋จ๋ ๊ฒฝ์ฐ ๋๋ถ๋ถ์ ๋ฐฐ์ด์ธ E[]
๋์ ์ปฌ๋ ์
์ธ List<E>
๋ฅผ ์ฌ์ฉํ๋ฉด ํด๊ฒฐ๋๋ค. ์ฝ๋๊ฐ ์กฐ๊ธ ๋ณต์ก
ํด์ง๊ณ ์ฑ๋ฅ
์ด ์ด์ง ๋๋น ์ง ์๋ ์์ง๋ง, ๊ทธ ๋์ ํ์
์์ ์ฑ๊ณผ ์ํธ ์ด์ฉ์ฑ
์ ์ข์์ง๋ค.
public class Chooser {
private final Object[] choiceArray;
public Chooser(Collection<T> choices) {
choiceArray = choises.toArray();
}
public Object choose() {
Random rnd = ThreadLocalRandom.current();
return choiceArray[rnd.nectint(choiceArray.length)];
}
}
์ ํด๋์ค๋ ๋งค๋ฒ ํ ๋ณํํด์ผ ํ๋ ๋ฆฌํฉํ ๋ง์ด ํ์ํ๋ค.
public class Chooser<T> {
private final List<T> choiceList;
public Chooser(Collection choices) {
choiceList = new ArrayList<>(choises);
}
public Object choose() {
Random rnd = ThreadLocalRandom.current();
return choiceList.get(rnd.nextint(choiceList.size()));
}
}
์ด์ ์์ ๋ณด๋ค ์ฝ๋์์ด ์กฐ๊ธ ๋์๊ณ ์๋ง๋ ์กฐ๊ธ ๋ ๋๋ฆด ํ
์ง๋ง, ๋ฐํ์์ ClassCastException
์ ๋ง๋ ์ผ์ ์์ผ๋ ๊ทธ๋งํ ๊ฐ์น๊ฐ ์๋ค.
์ ๋ค๋ฆญ์ ๋ถ๊ณต๋ณ
์ด๊ณ ํ์
์ ๋ณด๊ฐ ์๊ฑฐ๋๋ค. ๊ทธ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ๋ฐํ์์๋ ํ์
์์ ํ์ง๋ง ์ปดํ์ผ ํ์์๋ ๊ทธ๋ ์ง ์๋ค. ์ ๋ค๋ฆญ์ ๋ฐ๋๋ค. ๊ทธ๋์ ๋์ ์์ด ์ฐ๊ธฐ๋ ์ฝ์ง ์๋ค. ๋์ ์์ด ์ฐ๋ค๊ฐ ์ปดํ์ผ ์ค๋ฅ
๋ ๊ฒฝ๊ณ ๋ฅผ ๋ง๋๋ฉด ๊ฐ์ฅ ๋จผ์ ๋ฐฐ์ด์ ๋ฆฌ์คํธ๋ก ๋์ฒด
ํ๋ ๋ฐฉ๋ฒ์ ์ ์ฉํด๋ณด์.