# [[Polymorphism (๋‹คํ˜•์„ฑ)]] ## ๐Ÿ“Œ Brief ์‹ค Summary ๋‹คํ˜•์„ฑ(Polymorphism)์€ ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ๊ฐ์ฒด๊ฐ€ ์ž์‹ ์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ์ ์ ˆํ•œ ๋™์ž‘์„ ์Šค์Šค๋กœ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋‹ค [1, 2]. ๋ฆฌํŒฉํ† ๋ง ์›์น™์—์„œ ๋‹คํ˜•์„ฑ์€ ์ฃผ๋กœ ๊ธธ๊ณ  ๋ณต์žกํ•œ ์กฐ๊ฑด๋ฌธ(switch ๋˜๋Š” if-else)์„ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์žฌ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋กœ ๋Œ€์ฒดํ•˜์—ฌ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ๋ช…ํ™•์„ฑ์„ ๋†’์ด๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค [1, 3, 4]. ์ด๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ํƒ€์ž…์ด๋‚˜ ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š” ์—†์ด ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ ์•„ํ‚คํ…์ฒ˜์˜ ๋ณ€๊ฒฝ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค [3, 5, 6]. ## ๐Ÿ“– Core Content * **์กฐ๊ฑด๋ถ€ ๋กœ์ง์˜ ๋‹จ์ˆœํ™” ๋ฐ ์œ ์—ฐ์„ฑ ํ™•๋ณด:** ์ ˆ์ฐจ์ง€ํ–ฅ์  ์ฝ”๋“œ์—์„œ ํ”ํžˆ ๋‚˜ํƒ€๋‚˜๋Š” ๊ธด ๋ถ„๊ธฐ๋ฌธ(Switch ๊ตฌ๋ฌธ ๋“ฑ)์€ ์ค‘๋ณต์„ ์œ ๋ฐœํ•˜๊ณ , ์ƒˆ๋กœ์šด ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ๊ด€๋ จ๋œ ๋ชจ๋“  ์กฐ๊ฑด๋ฌธ์„ ์ฐพ์•„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๋งค์šฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค [3, 7]. ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•˜๋ฉด ๋ช…์‹œ์ ์ธ ์กฐ๊ฑด๋ฌธ์„ ๋‹คํ˜•์„ฑ ๋ฉ”์‹œ์ง€๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ถ„๊ธฐ ๋กœ์ง์„ ์ธ์ฝ”๋”ฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ์ฒด์—๊ฒŒ ํƒ€์ž…์„ ๋ฌป๊ณ  ํ–‰๋™์„ ๊ฒฐ์ •ํ•˜๋Š” ๋Œ€์‹  ๋‹จ์ˆœํžˆ ํ–‰๋™์„ ํ˜ธ์ถœ(invoke)ํ•˜์—ฌ ๊ฐ์ฒด ์Šค์Šค๋กœ ์˜ฌ๋ฐ”๋ฅธ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค [2, 4, 5]. * **'์กฐ๊ฑด์‹์„ ๋‹คํ˜•์„ฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ(Replace Conditional with Polymorphism)' ํ”„๋กœ์„ธ์Šค:** ๊ฐ์ฒด์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋™์ž‘์„ ์„ ํƒํ•˜๋Š” ์กฐ๊ฑด๋ฌธ์ด ์žˆ์„ ๋•Œ, ๊ฐ ์กฐ๊ฑด์˜ ๋ถ„๊ธฐ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์žฌ์ •์˜(overriding)๋œ ๋ฉ”์„œ๋“œ๋กœ ์˜ฎ๊ธฐ๊ณ  ์›๋ณธ ๋ฉ”์„œ๋“œ๋Š” ์ถ”์ƒ(abstract) ๋ฉ”์„œ๋“œ๋กœ ์„ ์–ธํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๋ฒ•์ด๋‹ค [1, 8]. ์ด ๊ณผ์ •์˜ ์ „์ œ ์กฐ๊ฑด์œผ๋กœ 'ํƒ€์ž… ์ฝ”๋“œ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ ๋ฐ”๊พธ๊ธฐ(Replace Type Code with Subclasses)' ๋˜๋Š” 'ํƒ€์ž… ์ฝ”๋“œ๋ฅผ ์ƒํƒœ/์ „๋žต์œผ๋กœ ๋ฐ”๊พธ๊ธฐ(Replace Type Code with State/Strategy)'๋ฅผ ์ ์šฉํ•˜์—ฌ ๋‹คํ˜•์„ฑ ๋™์ž‘์„ ํ˜ธ์ŠคํŒ…ํ•  ์ƒ์† ๊ตฌ์กฐ๋ฅผ ์šฐ์„ ์ ์œผ๋กœ ๊ตฌ์ถ•ํ•ด์•ผ ํ•œ๋‹ค [9, 10]. * **๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(Open/Closed Principle) ์ค€์ˆ˜:** ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ๋ถ„๊ธฐ๋ณ„ ๋กœ์ง์„ ๋ณ„๋„์˜ ํด๋ž˜์Šค๋กœ ๊ฒฉ๋ฆฌํ•˜๋ฉด, ์ƒˆ๋กœ์šด ์กฐ๊ฑด์ด๋‚˜ ํƒ€์ž…์ด ์š”๊ตฌ๋  ๋•Œ ๊ธฐ์กด ๋กœ์ง์„ '์ˆ˜์ˆ 'ํ•˜๋Š” ๋Œ€์‹  ์ƒˆ๋กœ์šด ๊ตฌ์ฒด ํด๋ž˜์Šค(Concrete Class)๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค [3, 6]. ์ด๋Ÿฌํ•œ ์„ค๊ณ„๋Š” ๋‹จ์ผ ์กฐ๊ฑด ๋กœ์ง์ด ํ”„๋กœ๊ทธ๋žจ์˜ ์—ฌ๋Ÿฌ ๊ณณ์— ํฉ์–ด์ ธ ์žˆ์„ ๋•Œ(์ค‘๋ณต ์ฝ”๋“œ) ์ง„๊ฐ€๋ฅผ ๋ฐœํœ˜ํ•˜๋ฉฐ, ๋ณ€ํ™”ํ•˜๋Š” ๋ณ€ํ˜•(variant)๋“ค์„ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์ˆจ๊ฒจ ์‹œ์Šคํ…œ ์˜์กด์„ฑ์„ ๋‚ฎ์ถ˜๋‹ค [5, 7, 11]. * **Null ๊ฐ์ฒด ํŒจํ„ด(Introduce Null Object)์„ ํ†ตํ•œ ๋‹คํ˜•์„ฑ ์ ์šฉ:** Null ๊ฐ’์„ ํ™•์ธํ•˜๋Š” ๋ฐ˜๋ณต์ ์ธ ์กฐ๊ฑด๋ฌธ ์—ญ์‹œ ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ์šฐ์•„ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค [2]. Null ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š” ํŠน์ˆ˜ ํ•˜์œ„ ํด๋ž˜์Šค(Null Object)๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํ•ด๋‹น ํƒ€์ž…์˜ ๊ธฐ๋ณธ ๋™์ž‘์„ ์žฌ์ •์˜ํ•จ์œผ๋กœ์จ, ๋ช…์‹œ์ ์ธ null ์ฒดํฌ ๋กœ์ง ์—†์ด๋„ ๋‹คํ˜•์„ฑ ํ˜ธ์ถœ์„ ํ†ตํ•ด ๊ฐ์ฒด๊ฐ€ ์ ์ ˆํ•œ ํ–‰๋™์„ ์œ„์ž„๋ฐ›์•„ ์ˆ˜ํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค [2, 12]. ## โš–๏ธ Trade-offs & Caveats * **๊ณผ๋„ํ•œ ์—”์ง€๋‹ˆ์–ด๋ง(Overkill) ์œ„ํ—˜:** ๋‹จ์ผ ๋ฉ”์„œ๋“œ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์†Œ์ˆ˜์˜ ์กฐ๊ฑด๋งŒ ์กด์žฌํ•˜๋ฉฐ ํ–ฅํ›„ ์กฐ๊ฑด์ด ๋ณ€๊ฒฝ๋˜๊ฑฐ๋‚˜ ํ™•์žฅ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ์ƒ์†๊ณผ ๋‹คํ˜•์„ฑ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์˜คํžˆ๋ ค ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋‹ค [13]. ์ด ๊ฒฝ์šฐ์—๋Š” ๋‹คํ˜•์„ฑ ๋Œ€์‹  '๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ช…์‹œ์  ๋ฉ”์„œ๋“œ๋กœ ๋ฐ”๊พธ๊ธฐ(Replace Parameter with Explicit Methods)' ๊ฐ™์€ ๋‹จ์ˆœํ•œ ๊ธฐ๋ฒ•์ด ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค [13]. * **๊ฐ์ฒด ์ƒ๋ช…์ฃผ๊ธฐ์— ๋”ฐ๋ฅธ ์ƒ์† ์ ์šฉ ์ œ์•ฝ:** ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ํ™œ์šฉํ•ด ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•  ๋•Œ ์ฃผ์˜ํ•ด์•ผ ํ•  ๊ฐ€์žฅ ํฐ ์ œ์•ฝ์€ '๊ฐ์ฒด๋Š” ์ƒ์„ฑ๋œ ์ดํ›„ ์ž์‹ ์˜ ํด๋ž˜์Šค๋ฅผ ๋Ÿฐํƒ€์ž„์— ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค'๋Š” ์ ์ด๋‹ค [14]. ๊ฐ์ฒด์˜ ํƒ€์ž… ์ฝ”๋“œ๋‚˜ ์ƒํƒœ๊ฐ€ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋™์•ˆ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๊ฑฐ๋‚˜, ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ์ด๋ฏธ ๋‹ค๋ฅธ ์ด์œ ๋กœ ํ•˜์œ„ ํด๋ž˜์Šคํ™”๋˜์–ด ์žˆ๋‹ค๋ฉด ๋‹จ์ˆœ ์ƒ์†์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค [9, 15]. ์ด๋Ÿฌํ•œ ์ œ์•ฝ ์ƒํ™ฉ์—์„œ๋Š” ์ƒ์† ๋Œ€์‹  '์ƒํƒœ ํŒจํ„ด(State Pattern)'์ด๋‚˜ '์ „๋žต ํŒจํ„ด(Strategy Pattern)'์„ ๊ฒฐํ•ฉํ•˜์—ฌ ๊ฐ„์ ‘ ์ฐธ์กฐ(indirection) ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ตฌ์กฐ์  ํƒ€ํ˜‘์ด ํ•„์š”ํ•˜๋‹ค [14-16]. ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [์•„ํ‚คํ…์ฒ˜ ๋ฐ ๊ธฐ๋ฐ˜ ์›์น™] - [[Open/Closed Principle (๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™)]] - ์—ฐ๊ฒฐ ์ด์œ : ๋‹คํ˜•์„ฑ์„ ํ†ตํ•œ ๋ฆฌํŒฉํ† ๋ง์˜ ํ•ต์‹ฌ ๋ชฉํ‘œ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ๋™์ž‘์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค [3, 6]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹คํ˜•์„ฑ์ด ์–ด๋–ป๊ฒŒ ์ฝ”๋“œ์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ์‹œ์Šคํ…œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š”์ง€ ์•„ํ‚คํ…์ฒ˜ ๊ด€์ ์—์„œ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. #### [์ฝ”๋“œ ๊ตฌ์กฐ ๊ฒฐํ•จ (Code Smells)] - [[Switch Statements (Switch ๋ฌธ)]] - ์—ฐ๊ฒฐ ์ด์œ : ๋‹คํ˜•์„ฑ ๋ฆฌํŒฉํ† ๋ง์˜ ๊ฐ€์žฅ ์ฃผ์š”ํ•œ ํƒ€๊ฒŸ์ด์ž ๋Œ€์ƒ์ด ๋˜๋Š” ์ฝ”๋“œ ๋ƒ„์ƒˆ์ด๋‹ค [5, 7]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ฐ์ฒด ์ง€ํ–ฅ ์‹œ์Šคํ…œ์—์„œ ์ค‘๋ณต๋œ ์กฐ๊ฑด๋ฌธ์ด ์™œ ์น˜๋ช…์ ์ธ ์œ ์ง€๋ณด์ˆ˜ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค. - [[Primitive Obsession (๊ธฐ๋ณธ ํƒ€์ž… ์ง‘์ฐฉ)]] - ์—ฐ๊ฒฐ ์ด์œ : ํƒ€์ž… ์ฝ”๋“œ(Type Code)๋ฅผ ๋‹จ์ˆœ ์ •์ˆ˜๋‚˜ ๋ฌธ์ž์—ด ๊ฐ™์€ ๊ธฐ๋ณธ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ ๋‹คํ˜•์„ฑ ์ ์šฉ์„ ๋ฐฉํ•ดํ•˜๋Š” ์›์ธ์ด ๋œ๋‹ค [17]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๊ธฐ๋ณธ ํƒ€์ž…์„ ๊ฐ์ฒด๋‚˜ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ ๊ฒฉ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์ด ๋‹คํ˜•์„ฑ ์„ค๊ณ„์˜ ์ฒซ ๋‹จ์ถ”์ž„์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. #### [๊ตฌํ˜„ ๋ฐ ๋ฆฌํŒฉํ† ๋ง ํŒจํ„ด] - [[State/Strategy Pattern (์ƒํƒœ/์ „๋žต ํŒจํ„ด)]] - ์—ฐ๊ฒฐ ์ด์œ : ๊ฐ์ฒด์˜ ํƒ€์ž…์ด๋‚˜ ์ƒํƒœ๊ฐ€ ๋Ÿฐํƒ€์ž„์— ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ๋‹จ์ˆœ ์ƒ์†์„ ํ™œ์šฉํ•œ ๋‹คํ˜•์„ฑ์˜ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด ํ•„์ˆ˜์ ์œผ๋กœ ๊ฒฐํ•ฉ๋˜์–ด์•ผ ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค [14, 15]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹คํ˜•์„ฑ์„ ํ†ตํ•œ ์œ„์ž„(Delegation)์˜ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ˜„ ๋ฐฉ์‹๊ณผ ๊ตฌ์กฐ์  ์œ ์—ฐ์„ฑ์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋‹ค. - [[Introduce Null Object (Null ๊ฐ์ฒด ๋„์ž…)]] - ์—ฐ๊ฒฐ ์ด์œ : ์กฐ๊ฑด๋ฌธ์˜ ์ผ์ข…์ธ ๋ฐ˜๋ณต์ ์ธ Null ์ฒดํฌ๋ฅผ ๋‹คํ˜•์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ์•„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ํŠน์ˆ˜ ์‚ฌ๋ก€์ด๋‹ค [2]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ๋‹คํ˜•์„ฑ์˜ ๋ฒ”์œ„๋ฅผ ์ƒํƒœ ๋ฐ ํƒ€์ž… ๊ฒ€์ฆ์„ ๋„˜์–ด ์˜ˆ์™ธ/๋น„์ •์ƒ ์ƒํƒœ(Null)์˜ ๊ธฐ๋ณธ ์ฒ˜๋ฆฌ๋กœ๊นŒ์ง€ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ### Deeper Research Questions - ์ƒํƒœ ํŒจํ„ด(State)๊ณผ ์ „๋žต ํŒจํ„ด(Strategy)์„ ์ด์šฉํ•˜์—ฌ ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•  ๋•Œ, ๋‘ ํŒจํ„ด ๊ฐ„์˜ ์„ ํƒ ๊ธฐ์ค€๊ณผ ๊ฐ๊ฐ์ด ์‹œ์Šคํ…œ ๊ตฌ์กฐ์— ๋ฏธ์น˜๋Š” ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€? - ๋‹จ์ˆœํ•œ ์กฐ๊ฑด๋ฌธ ๋ถ„๊ธฐ์™€ ๋‹คํ˜•์„ฑ์„ ์ด์šฉํ•œ ๊ฐ์ฒด ๊ตฌ์กฐํ™” ์‚ฌ์ด์—์„œ, ์„ค๊ณ„๊ฐ€ '์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง'์œผ๋กœ ๋น ์ง€์ง€ ์•Š๋„๋ก ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค๋ฌด์  ์ž„๊ณ„์ (Threshold)์€ ๋ฌด์—‡์ธ๊ฐ€? - ๋™์  ๋ฐ”์ธ๋”ฉ(Dynamic Binding)์ด ์ˆ˜๋ฐ˜๋˜๋Š” ๋‹คํ˜•์„ฑ์ด ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•œ ์‹œ์Šคํ…œ์—์„œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š”๊ฐ€? ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ€๋…์„ฑ๊ณผ ์„ฑ๋Šฅ ์‚ฌ์ด์˜ ๋ฐ˜๋Œ€๊ธ‰๋ถ€๋ฅผ ์–ด๋–ป๊ฒŒ ์กฐ์œจํ•  ๊ฒƒ์ธ๊ฐ€? - Null Object ํŒจํ„ด์„ ํ†ตํ•ด ๋‹คํ˜•์„ฑ์œผ๋กœ Null ์ฒดํฌ๋ฅผ ์ œ๊ฑฐํ•  ๋•Œ, ๋ฐ˜๋“œ์‹œ ํฌ์ฐฉํ•ด์•ผ ํ•˜๋Š” ์‹œ์Šคํ…œ์˜ ์˜ค๋ฅ˜๊ฐ€ ์€๋‹‰๋˜๋Š” ๋ถ€์ž‘์šฉ(์˜ˆ์™ธ ๋ฎ์–ด์“ฐ๊ธฐ)์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ์„ค๊ณ„ ํ•œ๊ณ„๋Š” ๋ฌด์—‡์ธ๊ฐ€? - ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ๊ณ„์ธต์ด ๋ถ„๋ฆฌ๋œ ๋„๋ฉ”์ธ ๋ชจ๋ธ์ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๋‹จ์ผ ํ…Œ์ด๋ธ”๊ณผ ๋งคํ•‘๋  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ง๋ ฌํ™” ๋ฐ ์Šคํ‚ค๋งˆ ๊ตฌ์กฐ์˜ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š”๊ฐ€? (์†Œ์Šค์— ๊ด€๋ จ ์ •๋ณด๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. ํ›„์† ์กฐ์‚ฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.) ### Practical Application Contexts - **Implementation:** ๋ณต์žกํ•˜๊ฒŒ ์–ฝํžŒ Switch๋ฌธ์ด๋‚˜ ์ค‘์ฒฉ๋œ If-Else๋ฌธ์„ ๋ฐœ๊ฒฌํ–ˆ์„ ๋•Œ, ๋‹คํ˜•์„ฑ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ ๋’ค ๊ฐ ์กฐ๊ฑด ๋ถ„๊ธฐ๋ฅผ ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์žฌ์ •์˜๋œ ๋ฉ”์„œ๋“œ๋กœ ์ถ”์ถœํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค. - **System Design:** ์†Œํ”„ํŠธ์›จ์–ด ์„ค๊ณ„ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ๋ณ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž…(์˜ˆ: ์˜ํ™”์˜ ๋ถ„๋ฅ˜, ์ง์›์˜ ๊ธ‰์—ฌ ์ฒด๊ณ„ ๋“ฑ)์„ ์ˆ˜์šฉํ•ด์•ผ ํ•  ๋•Œ, ํƒ€์ž… ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋‹คํ˜•์„ฑ ๊ตฌ์กฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ฐ˜์˜ํ•˜์—ฌ ์„ค๊ณ„ ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•œ๋‹ค. - **Operation / Maintenance:** ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜ ์ค‘ ํŠน์ • ๋กœ์ง์„ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ ์ „๋ฐ˜์— ํฉ์–ด์ง„ ๋ถ„๊ธฐ๋ฌธ์„ ๋ชจ๋‘ ์ฐพ์•„์•ผ ํ•˜๋Š” '์‚ฐํƒ„์ด ์ˆ˜์ˆ (Shotgun Surgery)' ๋ƒ„์ƒˆ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ, ๋‹คํ˜•์„ฑ์„ ๋„์ž…ํ•˜์—ฌ ๋ณ€๊ฒฝ ์ง€์ ์„ ํ•˜๋‚˜๋กœ ๋ชจ์€๋‹ค. - **Learning Path:** ๋ฆฌํŒฉํ† ๋ง์˜ ๊ธฐ๋ณธ๊ธฐ์ธ '๋ฉ”์„œ๋“œ ์ถ”์ถœ(Extract Method)'๊ณผ '๋ฉ”์„œ๋“œ ์ด๋™(Move Method)'์„ ๋งˆ์Šคํ„ฐํ•œ ๋’ค, ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ํ•ต์‹ฌ์ธ ๋‹คํ˜•์„ฑ ๊ด€๋ จ ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๋ฒ•์„ ํ•™์Šตํ•˜์—ฌ ๋””์ž์ธ ํŒจํ„ด์˜ ํ™œ์šฉ์œผ๋กœ ๋‚˜์•„๊ฐ„๋‹ค. - **My Project Relevance:** ํ• ์ธ ์ •์ฑ…, ๋“ฑ๊ธ‰ ๊ถŒํ•œ ์ฒ˜๋ฆฌ ๋“ฑ ๋ณ€๋™์„ฑ์ด ๋†’์€ ๊ทœ์น™์ด ํฌํ•จ๋œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ, ์š”๊ตฌ์‚ฌํ•ญ์ด ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ์ •์ฑ… ํด๋ž˜์Šค๋งŒ ์ถ”๊ฐ€ํ•˜๋Š” ์•ˆ์ •์ ์ธ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. ### Adjacent Topics - [[Test-Driven Development (ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ)]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ์กฐ๊ฑด์‹์„ ๋‹คํ˜•์„ฑ ๊ตฌ์กฐ๋กœ ๋Œ€ํญ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง์„ ์ˆ˜ํ–‰ํ•  ๋•Œ, ๊ธฐ์กด ๋™์ž‘์ด ๋ณ€ํ•˜์ง€ ์•Š์•˜์Œ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ๊ฐ–์ถฐ์ ธ์•ผ ํ•˜๋Š” ํ…Œ์ŠคํŠธ์˜ ์ž๋™ํ™” ๋ฐ ์•ˆ์ „๋ง ๊ตฌ์ถ• ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ ํ™•์žฅํ•˜์—ฌ ํ•™์Šตํ•œ๋‹ค. - [[Code Smells (์ฝ”๋“œ ๋ƒ„์ƒˆ)]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋‹คํ˜•์„ฑ์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์„ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์ง•ํ›„๋“ค(์˜ˆ: ๋ฐ˜๋ณต๋˜๋Š” ์กฐ๊ฑด๋ฌธ, ๊ธฐ๋Šฅ ์š•์‹ฌ, ๋ฐ์ดํ„ฐ ๋ญ‰์น˜ ๋“ฑ)์„ ์–ด๋–ป๊ฒŒ ๋ฏผ๊ฐํ•˜๊ฒŒ ํฌ์ฐฉํ•˜๊ณ  ํ‰๊ฐ€ํ•  ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ํ†ต์ฐฐ๋กœ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. --- *Last updated: 2026-05-03*