item 26 Jung inchul - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
Effective Java 3e ์์ดํ 26๋ฅผ ์์ฝํ ๋ด์ฉ ์ ๋๋ค.
ํด๋์ค์ ์ธํฐํ์ด์ค ์ ์ธ์ ํ์
๋งค๊ฐ๋ณ์
๊ฐ ์ฐ์ด๋ฉด ์ด๋ฅผ ์ ๋ค๋ฆญ ํด๋์ค
ํน์ ์ ๋ค๋ฆญ ์ธํฐํ์ด์ค
๋ผ ํ๋ค. ์ ๋ค๋ฆญ ํด๋์ค์ ์ ๋ค๋ฆญ ์ธํฐํ์ด์ค๋ฅผ ํตํ์ด ์ ๋ค๋ฆญ ํ์
์ด๋ผ ํ๋ค.
์ ๋ค๋ฆญ ํ์
์ ํ๋ ์ ์ํ๋ฉด ๊ทธ์ ๋ธ๋ฆฐ ๋ก ํ์
(raw type)
๋ ํจ๊ป ์ ์๋๋ค. ๋ก ํ์
์ด๋ ์ ๋ค๋ฆญ ํ์
์์ ํ์
๋งค๊ฐ๋ณ์๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์์ ๋๋ฅผ ๋งํ๋ค.
public class StampCollection {
private final Collection stamps = ...;
public static void main(String[] args) {
StampCollection stamps = new StampCollection();
// ์ค์๋ก ๋์ ์ ๋ฃ๋๋ค.
stamps.add(new Coin(...)); // "unchecked call" ๊ฒฝ๊ณ ๋ฅผ ๋ด๋ฑ๋๋ค.
for (Iterator i = stamps.iterator(); i.hasNext();) {
Stamp stamp = (Stamp) i.next(); // ClassCastException์ ๋์ง๋ค.
stamp.cancel();
}
}
์ด๋ ๊ฒ ๋๋ฉด ๋ฐํ์
์ ๋ฌธ์ ๋ฅผ ๊ฒช๋ ์ฝ๋์ ์์ธ์ ์ ๊ณตํ ์ฝ๋๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์๋นํ ๋จ์ด์ ธ ์์ ๊ฐ๋ฅ์ฑ์ด ์ปค์ง๋ค.
์ด๋ ๋ฏ ๋ก ํ์
(ํ์
๋งค๊ฐ๋ณ์๊ฐ ์๋ ์ ๋ค๋ฆญ ํ์
)์ ์ฐ๋ ๊ฑธ ์ธ์ด ์ฐจ์์์ ๋ง์ ๋์ง๋ ์์์ง๋ง ์ ๋๋ก ์จ์๋ ์ ๋๋ค. ๋ก ํ์
์ ์ฐ๋ฉด ์ ๋ค๋ฆญ์ด ์๊ฒจ์ฃผ๋ ์์ ์ฑ
๊ณผ ํํ๋ ฅ
์ ๋ชจ๋ ์ฝ๊ฒ ๋๋ค.
List
๊ฐ์ ๋ก ํ์
์ ์ฌ์ฉํด์๋ ์ ๋๋, List<Object>
์ฒ๋ผ ์์ ๊ฐ์ฒด๋ฅผ ํ์ฉํ๋ ๋งค๊ฐ๋ณ์ํ ํ์
์ ๊ด์ฐฎ๋ค.
List
๋ ์ ๋ค๋ฆญ ํ์
์์ ์์ ํ ๋ฐ์ ๋บ ๊ฒ์ด๊ณ , List<Object>
๋ ๋ชจ๋ ํ์
์ ํ์ฉ
ํ๋ค๋ ์์ฌ๋ฅผ ์ปดํ์ผ๋ฌ์ ๋ช
ํํ ์ ๋ฌํ ๊ฒ์ด๋ค. ์ฆ, List<String>
์ ๋ก ํ์
์ธ List์ ํ์
ํ์
์ด์ง๋ง, List<Object>
์ ํ์ ํ์
์ ์๋๋ค. ๊ทธ ๊ฒฐ๊ณผ, List<Object>
๊ฐ์ ๋งค๊ฐ ๋ณ์ ํ ํ์
์ ์ฌ์ฉํ ๋์ ๋ฌ๋ฆฌ List ๊ฐ์ ๋ก ํ์
์ ์ฌ์ฉํ๋ฉด ํ์
์์ ์ฑ
์ ์๊ฒ ๋๋ค.
static int numElementsInCommon(Set s1, Set s2) {
int result = 0;
for (Object o1 : s1)
if (s2.contains(o1))
result++;
return result;
}
์ด ๋ฉ์๋๋ ๋์์ ํ์ง๋ง ๋ก ํ์
์ ์ฌ์ฉํด ์์ ํ์ง ์๋ค. ๋ฐ๋ผ์ ๋น ํ์ ์ ์์ผ๋์นด๋ ํ์
์ ๋์ ์ฌ์ฉํ๋ ๊ฒ ์ข๋ค.
static int numElementsInCommon(Set<?> s1, Set<?> s2) { ... }
์์ผ๋์นด๋ ํ์
์ ์์ ํ๊ณ , ๋ก ํ์
์ ์์ ํ์ง ์๋ค. ๋ก ํ์
์ปฌ๋ ์
์๋ ์๋ฌด ์์๋ ๋ฃ์ ์ ์์ผ๋ ํ์
๋ถ๋ณ์
์ ํผ์ํ๊ธฐ ์ฝ๋ค. ๋ฐ๋ฉด, Collection<?>์๋ (null ์ธ์๋
) ์ด๋ค ์์๋ ๋ฃ์ ์ ์๋ค. ๋ค๋ฅธ ์์๋ฅผ ๋ฃ์ผ๋ ค ํ๋ฉด ์ปดํ์ผํ ๋ ๋ค์์ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ณด๊ฒ ๋ ๊ฒ์ด๋ค.
WildCard.java:13: error: incompatible types: String cannot be
converted to CAP#1
c.add("verboten");
^
์ฆ, ์ปฌ๋ ์ ์ ํ์ ๋ถ๋ณ์์ ํผ์ํ์ง ๋ชปํ๊ฒ ๋ง์๋ค.
class ๋ฆฌํฐ๋ด
์๋ ๋ก ํ์
์ ์จ์ผ ํ๋ค. ์๋ฐ ๋ช
์ธ๋ class ๋ฆฌํฐ๋ด์ ๋งค๊ฐ๋ณ์ํ ํ์
์ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ํ๋ค.
- ํ์ฉ : List.class, String[].class, int.class
- ํ์ฉํ์ง ์์ : List.class, List<?>.class
๋ ๋ค๋ฅธ ์ด์ ๋ ๋ฐํ์
์๋ ์ ๋ค๋ฆญ ํ์
์ ๋ณด๊ฐ ์ง์์ง๋ฏ๋ก instanceof
์ฐ์ฌ์๋ ๋น ํ์ ์ ์์ผ๋์นด๋ ํ์
์ด์ธ์ ๋งค๊ฐ๋ณ์ํ ํ์
์๋ ์ ์ฉํ ์ ์๋ค. ๋น ํ์ ์ ์์ผ๋ ์นด๋ ํ์
์ ๊บฝ์ ๊ดํธ์ ๋ฌผ์ํ๋ ์๋ฌด๋ฐ ์ญํ ์์ด ์ฝ๋๋ง ์ง์ ๋ถํ๊ฒ ๋ง๋๋ฏ๋ก, ์ฐจ๋ผ๋ฆฌ ๋ก ํ์
์ ์ฐ๋ ํธ์ด ๊น๋ํ๋ค.
if (o instanceof Set) {
Set<?> s = (Set<?>) o;
...
}
๋ก ํ์
์ ์ฌ์ฉํ๋ฉด ๋ฐํ์
์ ์์ธ๊ฐ ์ผ์ด๋ ์ ์์ผ๋ ์ฌ์ฉํ๋ฉด ์ ๋๋ค. ๋ก ํ์
์ ์ ๋ค๋ฆญ์ด ๋์
๋๊ธฐ ์ด์ ์ฝ๋์์ ํธํ์ฑ
์ ์ํด ์ ๊ณต๋ ๋ฟ์ด๋ค. Set<Object>
๋ ์ด๋ค ํ์
์ ๊ฐ์ฒด๋ ์ ์ฅํ ์ ์๋ ๋งค๊ฐ ๋ณ์ํ ํ์
์ด๊ณ , Set<?>
๋ ๋ชจ์ข
์ ํ์
๊ฐ์ฒด๋ง ์ ์ฅํ ์ ์๋ ์์ผ๋์นด๋ ํ์
์ด๋ค.