item 28 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki
- ๋ฐฐ์ด๊ณผ ์ ๋ค๋ฆญ ํ์ ์๋ ์ค์ํ ์ฐจ์ด๊ฐ ๋ ๊ฐ์ง ์๋ค.
- ์ด๋ ค์ ๋ณด์ด๋ ๋จ์ด์ง๋ง ๋ป์ ๊ฐ๋จํ๋ค.
Sub๊ฐ Super์ ํ์ ํ์
์ด๋ผ๋ฉด ๋ฐฐ์ด Sub[]๋ ๋ฐฐ์ด Super[]์ ํ์ ํ์
์ด ๋๋ค(๊ณต๋ณ, ์ฆ ํจ๊ป ๋ณํ๋ค๋ ๋ป์ด๋ค).
๋ฐ๋ฉด, ์ ๋ค๋ฆญ์ ๋ถ๊ณต๋ณ(invariant; ไธๅ
ฑ่ฎ)์ด๋ค.
์ฆ, ์๋ก ๋ค๋ฅธ ํ์
Type1๊ณผ Type2๊ฐ ์์ ๋, List์ List์ ํ์ ํ์
๋ ์๋๊ณ ์์ ํ์
๋ ์๋๋ค.
์ด๊ฒ๋ง ๋ณด๋ฉด ์ ๋ค๋ฆญ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํ ์๋ ์์ง๋ง,
์ฌ์ค ๋ฌธ์ ๊ฐ ์๋ ๊ฑด ๋ฐฐ์ด ์ชฝ์ด๋ค.
๋ค์์ ๋ฌธ๋ฒ์ ํ์ฉ๋๋ ์ฝ๋๋ค.
// ๋ฐํ์์ ์คํจํ๋ค.
Object[] objectArray = new Long[1];
objectArray[0] = "ํ์
์ด ๋ฌ๋ผ ๋ฃ์ ์ ์๋ค."; // ArrayStoreException์ ๋์ง๋ค.
// ์ปดํ์ผ๋์ง ์๋๋ค.
List<Object> ol = new ArrayList<Long>(); // ํธํ๋์ง ์๋ ํ์
์ด๋ค.
ol.add("ํ์
์ด ๋ฌ๋ผ ๋ฃ์ ์ ์๋ค.");
- ์ด๋ ์ชฝ์ด๋ Long์ฉ ์ ์ฅ์์ String์ ๋ฃ์ ์๋ ์๋ค. ๋ค๋ง ๋ฐฐ์ด์์๋ ๊ทธ ์ค์๋ฅผ ๋ฐํ์์์ผ ์๊ฒ ๋์ง๋ง, ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํ์ผํ ๋ ๋ฐ๋ก ์ ์ ์๋ค. ์ฌ๋ฌ๋ถ๋ ๋ฌผ๋ก ์ปดํ์ผ ์์ ์์์ฑ๋ ์ชฝ์ ์ ํธํ ๊ฒ์ด๋ค.
-
๋ฐฐ์ด์ ๋ฐํ์์๋ ์์ ์ด ๋ด๊ธฐ๋ก ํ ์์์ ํ์ ์ ์ธ์งํ๊ณ ํ์ธํ๋ค. ๊ทธ๋์ ์ฝ๋ 28-1์์ ๋ณด๋ฏ Long ๋ฐฐ์ด์ String์ ๋ฃ์ผ๋ ค ํ๋ฉด ArrayStoreException์ด ๋ฐ์ํ๋ค. ๋ฐ๋ฉด, ์์ ์ด์ผ๊ธฐํ๋ฏ ์ ๋ค๋ฆญ์ ํ์ ์ ๋ณด๊ฐ ๋ฐํ์์๋ ์๊ฑฐ (erasure)๋๋ค. ์์ ํ์ ์ ์ปดํ์ผํ์์๋ง ๊ฒ์ฌํ๋ฉฐ ๋ฐํ์์๋ ์์์กฐ์ฐจ ์๋ค๋ ๋ป์ด๋ค.
-
์ด์์ ์ฃผ์ ์ฐจ์ด๋ก ์ธํด ๋ฐฐ์ด๊ณผ ์ ๋ค๋ฆญ์ ์ ์ด์ฐ๋ฌ์ง์ง ๋ชปํ๋ค. ์์ปจ๋ ๋ฐฐ์ด์ ์ ๋ค๋ฆญ ํ์ , ๋งค๊ฐ๋ณ์ํ ํ์ , ํ์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ ์ ์๋ค. ์ฆ, ์ฝ๋๋ฅผ new List[], new List[], new E[] ์์ผ๋ก ์์ฑํ๋ฉด ์ปดํ์ผํ ๋ ์ ๋ค๋ฆญ ๋ฐฐ์ด ์์ฑ ์ค๋ฅ๋ฅผ ์ผ์ผํจ๋ค.
- ํ์ ์์ ํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฅผ ํ์ฉํ๋ค๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ์๋ ์์ฑํ ํ๋ณํ ์ฝ๋์์ ๋ฐํ์์ ClassCastException์ด ๋ฐ์ํ ์ ์๋ค. ๋ฐํ์์ 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)
- ์ ๋ค๋ฆญ ๋ฐฐ์ด์ ์์ฑํ๋ (1)์ด ํ์ฉ๋๋ค๊ณ ๊ฐ์ ํด๋ณด์.
- (2)๋ ์์๊ฐ ํ๋์ธ List๋ฅผ ์์ฑํ๋ค.
- (3)์ (1)์์ ์์ฑํ List์ ๋ฐฐ์ด์ Object ๋ฐฐ์ด์ ํ ๋นํ๋ค. ๋ฐฐ์ด์ ๊ณต๋ณ์ด๋ ์๋ฌด ๋ฌธ์ ์๋ค.
- (4)๋ (2)์์ ์์ฑํ List์ ์ธ์คํด์ค๋ฅผ Object ๋ฐฐ์ด์ ์ฒซ ์์๋ก ์ ์ฅํ๋ค. ์ ๋ค๋ฆญ์ ์๊ฑฐ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์ด์ ์ด ์ญ์ ์ฑ๊ณตํ๋ค. ์ฆ, ๋ฐํ์์๋ List ์ธ์คํด์ค์ ํ์ ์ ๋จ์ํ List๊ฐ ๋๊ณ , List[] ์ธ์คํด์ค์ ํ์ ์ List[]๊ฐ ๋๋ค. ๋ฐ๋ผ์ (4)์์๋ ArrayStoreException์ ์ผ์ผํค์ง ์๋๋ค.
- ์ด์ ๋ถํฐ๊ฐ ๋ฌธ์ ๋ค. List ์ธ์คํด์ค๋ง ๋ด๊ฒ ๋ค๊ณ ์ ์ธํ stringLists ์ด ๋ฐฐ์ด์๋ ์ง๊ธ List ์ธ์คํด์ค๊ฐ ์ ์ฅ๋ผ ์๋ค. 6 ๊ทธ๋ฆฌ๊ณ (5)๋ ์ด ๋ฐฐ์ด์ ์ฒ์ ๋ฆฌ์คํธ์์ ์ฒซ ์์๋ฅผ ๊บผ๋ด๋ คํ๋ค. ์ปดํ์ผ๋ฌ๋ ๊บผ๋ธ ์์๋ฅผ ์๋์ผ๋ก String์ผ๋ก ํ๋ณํํ๋๋ฐ, ์ด ์์๋ Integer์ด๋ฏ๋ก ๋ฐํ์์ ClassCastException์ด ๋ฐ์ํ๋ค. ์ด๋ฐ ์ผ์ ๋ฐฉ์งํ๋ ค๋ฉด (์ ๋ค๋ฆญ ๋ฐฐ์ด์ด ์์ฑ๋์ง ์๋๋ก) (1)์์ ์ปดํ์ผ ์ค๋ฅ๋ฅผ ๋ด์ผ ํ๋ค.
๋ฐฐ์ด๊ณผ ์ ๋ค๋ฆญ์๋ ๋งค์ฐ ๋ค๋ฅธ ํ์ ๊ท์น์ด ์ ์ฉ๋๋ค.
๋ฐฐ์ด์ ๊ณต๋ณ์ด๊ณ ์ค์ฒดํ๋๋ ๋ฐ๋ฉด, ์ ๋ค๋ฆญ์ ๋ถ๊ณต๋ณ์ด๊ณ ํ์ ์ ๋ณด๊ฐ ์๊ฑฐ๋๋ค.
๊ทธ ๊ฒฐ๊ณผ ๋ฐฐ์ด์ ๋ฐํ์์๋ ํ์ ์์ ํ์ง๋ง ์ปดํ์ผํ์์๋ ๊ทธ๋ ์ง ์๋ค.
์ ๋ค๋ฆญ์ ๋ฐ๋๋ค. ๊ทธ๋์ ๋์ ์์ด ์ฐ๊ธฐ๋ ์ฝ์ง ์๋ค.
๋์ ์์ด ์ฐ๋ค๊ฐ ์ปดํ์ผ ์ค๋ฅ๋ ๊ฒฝ๊ณ ๋ฅผ ๋ง๋๋ฉด, ๊ฐ์ฅ ๋จผ์ ๋ฐฐ์ด์ ๋ฆฌ์คํธ๋ก ๋์ฒดํ๋ ๋ฐฉ๋ฒ์ ์ ์ฉํด๋ณด์.