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

์•„์ดํ…œ20 ์ถ”์ƒ ํด๋ž˜์Šค๋ณด๋‹ค๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์šฐ์„ ํ•˜๋ผ

  • ์ž๋ฐ”๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‹ค์ค‘ ๊ตฌํ˜„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ถ”์ƒ ํด๋ž˜์Šค, ์ด๋ ‡๊ฒŒ ๋‘ ๊ฐ€์ง€๋‹ค. ์ž๋ฐ” 8๋ถ€ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค๋„ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ(default method)๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด, ์ด์ œ๋Š” ๋‘ ๋ฉ”์ปค๋‹ˆ์ฆ˜ ๋ชจ๋‘ ์ธ์Šคํ„ด์Šค ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

์ถ”์ƒ ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์Šค์˜ ์ฐจ์ด๋Š”?

  • ํ•œํŽธ, ๋‘˜์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ์ถ”์ƒ ํด๋ž˜์Šค๊ฐ€ ์ •์˜ํ•œ ํƒ€์ž…์„ ๊ตฌํ˜„ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ๋ฐ˜๋“œ์‹œ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ํ•˜์œ„ ํด๋ž˜์Šค๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ์ž๋ฐ”๋Š” ๋‹จ์ผ ์ƒ์†๋งŒ ์ง€์›ํ•˜๋‹ˆ, ์ถ”์ƒ ํด๋ž˜์Šค ๋ฐฉ์‹์€ ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ์ •์˜ํ•˜๋Š” ๋ฐ ์ปค๋‹ค๋ž€ ์ œ์•ฝ์„ ์•ˆ๊ฒŒ ๋˜๋Š” ์…ˆ์ด๋‹ค. ๋ฐ˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์„ ์–ธํ•œ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ๋‘ ์ •์˜ํ•˜๊ณ  ๊ทธ ์ผ๋ฐ˜ ๊ทœ์•ฝ์„ ์ž˜ ์ง€ํ‚จ ํด๋ž˜์Šค๋ผ๋ฉด ๋‹ค๋ฅธ ์–ด๋–ค ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ–ˆ๋“  ๊ฐ™์€ ํƒ€์ž…์œผ๋กœ ์ทจ๊ธ‰๋œ๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ธฐ์กด ํด๋ž˜์Šค์—๋„ ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•ด ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๊ธฐ์กด ํด๋ž˜์Šค ์œ„์— ๋ผ์›Œ๋„ฃ๊ธฐ๊ฐ€ ์–ด๋ ค์šด๊ฒŒ ์ผ๋ฐ˜์ ์ด๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ๊ณ„์ธต๊ตฌ์กฐ ์ƒ ๋‘ ํด๋ž˜์Šค์˜ ๊ณตํ†ต ์กฐ์ƒ์ด์–ด์•ผ ํ•œ๋‹ค. ๊ฒฐ๊ตญ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ์ถ”์ƒ ํด๋ž˜์Šค์˜ ๋ชจ๋“  ์ž์†์ด ์ด๋ฅผ ์ƒ์†ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ๋„ ๊ฐ•์ œ๋กœ ๋ง์ด๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ฏน์Šค์ธ(mixin) ์ •์˜์— ์•ˆ์„ฑ๋งž์ถค์ด๋‹ค. ๋ฏน์Šค์ธ์ด๋ž€ ํด๋ž˜์Šค๊ฐ€ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…์œผ๋กœ, ๋ฏน์Šค์ธ์„ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค์— ์›๋ž˜์˜ โ€˜์ฃผ๋œ ํƒ€์ž…โ€™ ์™ธ์—๋„ ํŠน์ • ์„ ํƒ์  ํ–‰์œ„๋ฅผ ์ œ๊ณตํ•œ๋‹ค๊ณ  ์„ ์–ธํ•˜๋Š” ํšจ๊ณผ๋ฅผ ์ค€๋‹ค. ๋Œ€์ƒ ํƒ€์ž…์˜ ์ฃผ๋œ ๊ธฐ๋Šฅ์— ์„ ํƒ์  ๊ธฐ๋Šฅ์„ โ€˜ํ˜ผํ•ฉ (mixed in)โ€™ํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฏน์Šค์ธ์ด๋ผ ๋ถ€๋ฅธ๋‹ค. ์ถ”์ƒ ํด๋ž˜์Šค๋กœ๋Š” ์ด๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋Š” ๊ณ„์ธต๊ตฌ์กฐ๊ฐ€ ์—†๋Š” ํƒ€์ž… ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ๊ตฌํ˜„ํ•ด๋„ ๊ดœ์ฐฎ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ถ”์ƒ ํด๋ž˜์Šค๋Š” ์กฐํ•ฉ์˜ ์ „๋ถ€๋ฅผ ๊ฐ๊ฐ ํด๋ž˜์Šค๋กœ ์ •์˜ํ•ด์•ผํ•œ๋‹ค. 2^n๊ฐœ์˜ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฉฐ ์ด๋ฅผ ์กฐํ•ฉ ํญ๋ฐœ์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค(combinatorial explosion)

์ถ”์ƒ ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค (skeletal implementation)

  • ์ธํ„ฐํŽ˜์ด์Šค๋กœ๋Š” ํƒ€์ž…์„ ์ •์˜ํ•˜๊ณ , ํ•„์š”ํ•˜๋ฉด ๋””ํดํŠธ ๋ฉ”์„œ๋“œ ๋ช‡ ๊ฐœ๋„ ํ•จ๊ป˜ ์ œ๊ณตํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค๋Š” ๋‚˜๋จธ์ง€ ๋ฉ”์„œ๋“œ๋“ค๊นŒ์ง€ ๊ตฌํ˜„ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด๋‘๋ฉด ๋‹จ์ˆœํžˆ ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ผ์ด ๋Œ€๋ถ€๋ถ„ ์™„๋ฃŒ๋œ๋‹ค. ๋ฐ”๋กœ ํ…œํ”Œ๋ฆฟ ๋ฉ”์„œ๋“œ ํŒจํ„ด์ด๋‹ค.

  • ๊ณจ๊ฒฉ ๊ตฌํ˜„ ํด๋ž˜์Šค์˜ ์•„๋ฆ„๋‹ค์›€์€ ์ถ”์ƒ ํด๋ž˜์Šค์ฒ˜๋Ÿผ ๊ตฌํ˜„์„ ๋„์™€์ฃผ๋Š” ๋™์‹œ์—, ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ํƒ€์ž…์„ ์ •์˜ํ•  ๋•Œ ๋”ฐ๋ผ์˜ค๋Š” ์‹ฌ๊ฐํ•œ ์ œ์•ฝ์—์„œ๋Š” ์ž์œ ๋กญ๋‹ค๋Š” ์ ์— ์žˆ๋‹ค.

ํ•ต์‹ฌ์ •๋ฆฌ

์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค์ค‘ ๊ตฌํ˜„์šฉ ํƒ€์ž…์œผ๋กœ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ•˜๋‹ค.
๋ณต์žกํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋ฉด ๊ตฌํ˜„ํ•˜๋Š” ์ˆ˜๊ณ ๋ฅผ ๋œ์–ด์ฃผ๋Š” ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ํ•จ๊ป˜ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ผญ ๊ณ ๋ คํ•ด๋ณด์ž.
๊ณจ๊ฒฉ ๊ตฌํ˜„์€ โ€˜๊ฐ€๋Šฅํ•œ ํ•œโ€™ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋””ํดํŠธ ๋ฉ”์„œ๋“œ๋กœ ์ œ๊ณตํ•˜์—ฌ ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ๋ชจ๋“  ๊ณณ์—์„œ ํ™œ์šฉํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
โ€˜๊ฐ€๋Šฅํ•œ ํ•œโ€™์ด๋ผ๊ณ  ํ•œ ์ด์œ ๋Š”, ์ธํ„ฐํŽ˜์ด์Šค์— ๊ฑธ๋ ค ์žˆ๋Š” ๊ตฌํ˜„์ƒ์˜ ์ œ์•ฝ ๋•Œ๋ฌธ์— ๊ณจ๊ฒฉ ๊ตฌํ˜„์„ ์ถ”์ƒ ํด๋ž˜์Šค๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋” ํ”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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