item 28 dodo4513 - JAVA-JIKIMI/EFFECTIVE-JAVA3 GitHub Wiki

์•„์ดํ…œ28 ๋ฐฐ์—ด๋ณด๋‹ค๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ผ

  • ๋ฐฐ์—ด๊ณผ ์ œ๋„ค๋ฆญ ํƒ€์ž…์—๋Š” ์ค‘์š”ํ•œ ์ฐจ์ด๊ฐ€ ๋‘ ๊ฐ€์ง€ ์žˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ, ๋ฐฐ์—ด์€ ๊ณต๋ณ€ (covariant; ๅ…ฑ่ฎŠ)์ด๋‹ค.

  • ์–ด๋ ค์›Œ ๋ณด์ด๋Š” ๋‹จ์–ด์ง€๋งŒ ๋œป์€ ๊ฐ„๋‹จํ•˜๋‹ค. 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์„ ๋„ฃ์„ ์ˆ˜๋Š” ์—†๋‹ค. ๋‹ค๋งŒ ๋ฐฐ์—ด์—์„œ๋Š” ๊ทธ ์‹ค์ˆ˜๋ฅผ ๋Ÿฐํƒ€์ž„์—์•ผ ์•Œ๊ฒŒ ๋˜์ง€๋งŒ, ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผํ•  ๋•Œ ๋ฐ”๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„๋„ ๋ฌผ๋ก  ์ปดํŒŒ์ผ ์‹œ์— ์•Œ์•„์ฑ„๋Š” ์ชฝ์„ ์„ ํ˜ธํ•  ๊ฒƒ์ด๋‹ค.

๋‘ ๋ฒˆ์งธ ์ฃผ์š” ์ฐจ์ด๋กœ, ๋ฐฐ์—ด์€ ์‹ค์ฒดํ™”(reify)๋œ๋‹ค.

  • ๋ฐฐ์—ด์€ ๋Ÿฐํƒ€์ž„์—๋„ ์ž์‹ ์ด ๋‹ด๊ธฐ๋กœ ํ•œ ์›์†Œ์˜ ํƒ€์ž…์„ ์ธ์ง€ํ•˜๊ณ  ํ™•์ธํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ฝ”๋“œ 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. ์ œ๋„ค๋ฆญ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜๋Š” (1)์ด ํ—ˆ์šฉ๋œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.
  2. (2)๋Š” ์›์†Œ๊ฐ€ ํ•˜๋‚˜์ธ List๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  3. (3)์€ (1)์—์„œ ์ƒ์„ฑํ•œ List์˜ ๋ฐฐ์—ด์„ Object ๋ฐฐ์—ด์— ํ• ๋‹นํ•œ๋‹ค. ๋ฐฐ์—ด์€ ๊ณต๋ณ€์ด๋‹ˆ ์•„๋ฌด ๋ฌธ์ œ์—†๋‹ค.
  4. (4)๋Š” (2)์—์„œ ์ƒ์„ฑํ•œ List์˜ ์ธ์Šคํ„ด์Šค๋ฅผ Object ๋ฐฐ์—ด์˜ ์ฒซ ์›์†Œ๋กœ ์ €์žฅํ•œ๋‹ค. ์ œ๋„ค๋ฆญ์€ ์†Œ๊ฑฐ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์–ด์„œ ์ด ์—ญ์‹œ ์„ฑ๊ณตํ•œ๋‹ค. ์ฆ‰, ๋Ÿฐํƒ€์ž„์—๋Š” List ์ธ์Šคํ„ด์Šค์˜ ํƒ€์ž…์€ ๋‹จ์ˆœํžˆ List๊ฐ€ ๋˜๊ณ , List[] ์ธ์Šคํ„ด์Šค์˜ ํƒ€์ž…์€ List[]๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ (4)์—์„œ๋„ ArrayStoreException์„ ์ผ์œผํ‚ค์ง€ ์•Š๋Š”๋‹ค.
  5. ์ด์ œ๋ถ€ํ„ฐ๊ฐ€ ๋ฌธ์ œ๋‹ค. List ์ธ์Šคํ„ด์Šค๋งŒ ๋‹ด๊ฒ ๋‹ค๊ณ  ์„ ์–ธํ•œ stringLists ์ด ๋ฐฐ์—ด์—๋Š” ์ง€๊ธˆ List ์ธ์Šคํ„ด์Šค๊ฐ€ ์ €์žฅ๋ผ ์žˆ๋‹ค. 6 ๊ทธ๋ฆฌ๊ณ  (5)๋Š” ์ด ๋ฐฐ์—ด์˜ ์ฒ˜์Œ ๋ฆฌ์ŠคํŠธ์—์„œ ์ฒซ ์›์†Œ๋ฅผ ๊บผ๋‚ด๋ คํ•œ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊บผ๋‚ธ ์›์†Œ๋ฅผ ์ž๋™์œผ๋กœ String์œผ๋กœ ํ˜•๋ณ€ํ™˜ํ•˜๋Š”๋ฐ, ์ด ์›์†Œ๋Š” Integer์ด๋ฏ€๋กœ ๋Ÿฐํƒ€์ž„์— ClassCastException์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Ÿฐ ์ผ์„ ๋ฐฉ์ง€ํ•˜๋ ค๋ฉด (์ œ๋„ค๋ฆญ ๋ฐฐ์—ด์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๋„๋ก) (1)์—์„œ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋ฅผ ๋‚ด์•ผ ํ•œ๋‹ค.

ํ•ต์‹ฌ์ •๋ฆฌ

๋ฐฐ์—ด๊ณผ ์ œ๋„ค๋ฆญ์—๋Š” ๋งค์šฐ ๋‹ค๋ฅธ ํƒ€์ž… ๊ทœ์น™์ด ์ ์šฉ๋œ๋‹ค.
๋ฐฐ์—ด์€ ๊ณต๋ณ€์ด๊ณ  ์‹ค์ฒดํ™”๋˜๋Š” ๋ฐ˜๋ฉด, ์ œ๋„ค๋ฆญ์€ ๋ถˆ๊ณต๋ณ€์ด๊ณ  ํƒ€์ž… ์ •๋ณด๊ฐ€ ์†Œ๊ฑฐ๋œ๋‹ค.
๊ทธ ๊ฒฐ๊ณผ ๋ฐฐ์—ด์€ ๋Ÿฐํƒ€์ž„์—๋Š” ํƒ€์ž… ์•ˆ์ „ํ•˜์ง€๋งŒ ์ปดํŒŒ์ผํƒ€์ž„์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค.
์ œ๋„ค๋ฆญ์€ ๋ฐ˜๋Œ€๋‹ค. ๊ทธ๋ž˜์„œ ๋‘˜์„ ์„ž์–ด ์“ฐ๊ธฐ๋ž€ ์‰ฝ์ง€ ์•Š๋‹ค.

๋‘˜์„ ์„ž์–ด ์“ฐ๋‹ค๊ฐ€ ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋‚˜ ๊ฒฝ๊ณ ๋ฅผ ๋งŒ๋‚˜๋ฉด, ๊ฐ€์žฅ ๋จผ์ € ๋ฐฐ์—ด์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•ด๋ณด์ž.

โš ๏ธ **GitHub.com Fallback** โš ๏ธ