# [[๋‹คํ˜•์„ฑ (Polymorphism)]] ## ๐Ÿ“Œ Brief Summary ๋‹คํ˜•์„ฑ(Polymorphism)์€ ๊ฐ์ฒด์˜ ํƒ€์ž…์ด๋‚˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ํ–‰๋™์„ ๋ช…์‹œ์ ์ธ ์กฐ๊ฑด๋ฌธ(switch๋‚˜ if-else)์œผ๋กœ ํ™•์ธํ•˜๋Š” ๋Œ€์‹ , ๊ฐ์ฒด์ง€ํ–ฅ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•ต์‹ฌ ๊ฐœ๋…์ด๋‹ค [1-3]. ๋ฆฌํŒฉํ† ๋ง์—์„œ ๋‹คํ˜•์„ฑ์€ ์ฃผ๋กœ ์ˆ˜๋งŽ์€ ๋ถ„๊ธฐ๋ฅผ ๊ฐ€์ง„ ๋ณต์žกํ•œ ์กฐ๊ฑด๋ฌธ์„ ์„œ๋ธŒํด๋ž˜์Šค์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋ฉ”์„œ๋“œ๋กœ ๊ต์ฒดํ•˜์—ฌ ์ฝ”๋“œ์˜ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ๊ตฌ์กฐ๋ฅผ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ํ™œ์šฉ๋œ๋‹ค [4-6]. ์ด๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ํƒ€์ž…์ด๋‚˜ ์‚ฌ๋ก€๊ฐ€ ์ถ”๊ฐ€๋  ๋•Œ ๊ธฐ์กด์˜ ๋กœ์ง์„ ๋œฏ์–ด๊ณ ์น  ํ•„์š” ์—†์ด ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋˜๋ฏ€๋กœ, ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(Open/Closed Principle)์„ ์ค€์ˆ˜ํ•˜๋ฉฐ ์•„ํ‚คํ…์ฒ˜์˜ ๋ณ€๊ฒฝ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ ๋‹ค [1, 3, 4, 7]. ## ๐Ÿ“– Core Content * **์กฐ๊ฑด๋ฌธ(Switch/Case)์˜ ๋ฌธ์ œ์ ๊ณผ ๊ฐ์ฒด์ง€ํ–ฅ ๋‚จ์šฉ(OO Abusers):** ๊ฐ์ฒด์ง€ํ–ฅ ์ฝ”๋“œ์˜ ์ฃผ์š” ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” switch(๋˜๋Š” case) ๋ฌธ์ด ์ƒ๋Œ€์ ์œผ๋กœ ์ ๋‹ค๋Š” ์ ์ด๋‹ค [5]. ๋™์ผํ•œ ์กฐ๊ฑด์˜ switch ๋ฌธ์ด ํ”„๋กœ๊ทธ๋žจ ๊ณณ๊ณณ์— ํฉ์–ด์ ธ ์žˆ์œผ๋ฉด, ์ƒˆ๋กœ์šด ํƒ€์ž…์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ์กฐ๊ฑด๋ฌธ์„ ์ฐพ์•„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ์น˜๋ช…์ ์ธ ์œ ์ง€๋ณด์ˆ˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค [1]. ์ด๋Ÿฌํ•œ ์ƒํƒœ๋Š” ์ƒ์†๊ณผ ๋‹คํ˜•์„ฑ ๊ฐ™์€ ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์ด์ ์„ ์ œ๋Œ€๋กœ ์‚ด๋ฆฌ์ง€ ๋ชปํ•˜๊ณ  ์ ˆ์ฐจ์ง€ํ–ฅ์ ์œผ๋กœ ๊ตฌํ˜„๋œ ๊ฒƒ์œผ๋กœ, '๊ฐ์ฒด์ง€ํ–ฅ ๋‚จ์šฉ(OO Abusers)'์ด๋ผ๋Š” ์ฝ”๋“œ ์Šค๋ฉœ(Code Smell)๋กœ ๋ถ„๋ฅ˜๋œ๋‹ค [8]. ๋Œ€๋ถ€๋ถ„์˜ switch ๋ฌธ์„ ๋ฐœ๊ฒฌํ–ˆ์„ ๋•Œ๋Š” ๋‹คํ˜•์„ฑ ์ ์šฉ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค [9]. * **๋‹คํ˜•์„ฑ์„ ํ†ตํ•œ ์กฐ๊ฑด๋ฌธ ๊ต์ฒด (Replace Conditional with Polymorphism):** ๊ฐ์ฒด์˜ ํƒ€์ž…์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ๋™์ž‘์„ ์„ ํƒํ•˜๋Š” ์กฐ๊ฑด๋ฌธ์ด ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์กฐ๊ฑด๋ฌธ์˜ ๊ฐ ๋ถ„๊ธฐ(leg)๋ฅผ ์„œ๋ธŒํด๋ž˜์Šค์˜ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ๋ฉ”์„œ๋“œ๋กœ ์ด๋™์‹œํ‚ค๊ณ  ์›๋ณธ ๋ฉ”์„œ๋“œ๋Š” ์ถ”์ƒ(abstract) ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค [6]. ์ด๋Š” ๋ณ€๊ฒฝ์˜ ์ง€์‹์„ ํด๋ผ์ด์–ธํŠธ์—์„œ ํด๋ž˜์Šค ๋‚ด๋ถ€๋กœ ์˜ฎ๊ฒจ์ค€๋‹ค [10]. ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ๋ณต์žกํ•œ ์กฐ๊ฑด์‹์„ ๋‹คํ˜•์„ฑ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋กœ ๋Œ€์ฒดํ•จ์œผ๋กœ์จ ๊ฐ ํ–‰๋™์„ ๊ณ ๋ฆฝ์‹œํ‚ค๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ๋งค์šฐ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค [4, 7]. * **๋ฆฌํŒฉํ† ๋ง ์ ์šฉ ๋‹จ๊ณ„:** 1. ๋‹ค์ค‘ ๋ถ„๊ธฐ๋ฅผ ๊ฐ€์ง„ ๋ณต์žกํ•œ ์กฐ๊ฑด๋ฌธ์„ ์‹๋ณ„ํ•œ๋‹ค [4]. ๋‹คํ˜•์„ฑ์„ ์ ์šฉํ•˜๊ธฐ ์ „์—๋Š” ์ด๋ฅผ ์ง€์›ํ•  ์ƒ์† ๊ตฌ์กฐ(Inheritance Structure)๊ฐ€ ๋จผ์ € ์ค€๋น„๋˜์–ด ์žˆ์–ด์•ผ ํ•œ๋‹ค [11]. 2. ๋‹ฌ๋ผ์ง€๋Š” ํ–‰๋™์„ ๋‹ด์„ ์ธํ„ฐํŽ˜์ด์Šค๋‚˜ ๋ฒ ์ด์Šค ํด๋ž˜์Šค(Base Class)๋ฅผ ์ƒ์„ฑํ•œ๋‹ค [4]. 3. ์กฐ๊ฑด ๋ถ„๊ธฐ๋งˆ๋‹ค ํ•ด๋‹นํ•˜๋Š” ๊ตฌ์ฒด ํด๋ž˜์Šค(Concrete Class)๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค [4]. 4. ๊ธฐ์กด ์กฐ๊ฑด ๋กœ์ง์„ ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•œ ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ๋กœ ๊ต์ฒดํ•œ๋‹ค [4]. 5. ๊ฐ๊ฐ์˜ ๊ตฌํ˜„ ํด๋ž˜์Šค๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ํ…Œ์ŠคํŠธํ•œ๋‹ค [4]. * **Null ๊ฐ์ฒด ๋„์ž… (Introduce Null Object):** ๋‹คํ˜•์„ฑ์˜ ๋ณธ์งˆ์€ ๊ฐ์ฒด์—๊ฒŒ ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ๋ฌป๊ณ  ๊ทธ ๋Œ€๋‹ต์— ๋”ฐ๋ผ ํ–‰๋™์„ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋‹จ์ˆœํžˆ ํ–‰๋™์„ ํ˜ธ์ถœํ•˜๋ฉด ๊ฐ์ฒด๊ฐ€ ์ž์‹ ์˜ ํƒ€์ž…์— ๋งž๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค [2]. ๋ฐ˜๋ณต๋˜๋Š” Null ๊ฐ’ ๊ฒ€์‚ฌ ์—ญ์‹œ Null ๊ฐ์ฒด๋ผ๋Š” ํŠน๋ณ„ํ•œ ํ˜•ํƒœ์˜ ์„œ๋ธŒํด๋ž˜์Šค(Special Case)๋ฅผ ๋„์ž…ํ•˜์—ฌ ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ์กฐ๊ฑด๋ฌธ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค [12, 13]. ## โš–๏ธ Trade-offs & Caveats * **๊ณผ๋„ํ•œ ์„ค๊ณ„ (Overkill):** ์กฐ๊ฑด๋ฌธ์ด ๋‹จ ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ณ , ํ–ฅํ›„์—๋„ ์ƒˆ๋กœ์šด ํƒ€์ž…์˜ ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋‹คํ˜•์„ฑ์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์ง€๋‚˜์นœ ์„ค๊ณ„(Overkill)๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค [14]. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” '๋ช…์‹œ์  ๋ฉ”์„œ๋“œ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ต์ฒด(Replace Parameter with Explicit Methods)'์™€ ๊ฐ™์€ ๋” ๋‹จ์ˆœํ•œ ๋Œ€์•ˆ์ด ์ ํ•ฉํ•˜๋‹ค [14]. * **๊ฐ์ฒด ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋™์•ˆ์˜ ํƒ€์ž… ๋ณ€๊ฒฝ ์ œ์•ฝ:** ๋‹คํ˜•์„ฑ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ธŒํด๋ž˜์‹ฑ(Subclassing)์„ ์‚ฌ์šฉํ•  ๋•Œ ํ•œ ๊ฐ€์ง€ ์ œ์•ฝ์ด ์žˆ๋‹ค. ๊ฐ์ฒด๋Š” ์ƒ์„ฑ๋œ ์ดํ›„ ์ˆ˜๋ช… ์ฃผ๊ธฐ ๋™์•ˆ ์ž์‹ ์˜ ํด๋ž˜์Šค(๋ถ„๋ฅ˜)๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ ์ด๋‹ค [15]. ๋”ฐ๋ผ์„œ ๊ฐ์ฒด์˜ ์ƒํƒœ๋‚˜ ํƒ€์ž… ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰ ๋„์ค‘์— ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๊ฑฐ๋‚˜, ์ด๋ฏธ ๋‹ค๋ฅธ ์ด์œ ๋กœ ์ธํ•ด ์„œ๋ธŒํด๋ž˜์‹ฑ์ด ์ ์šฉ๋œ ์ƒํƒœ๋ผ๋ฉด ๋‹คํ˜•์„ฑ์„ ์ง์ ‘ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค [11, 15, 16]. ์ด ๊ฒฝ์šฐ์—๋Š” '์ƒํƒœ/์ „๋žต ํŒจํ„ด์œผ๋กœ ํƒ€์ž… ์ฝ”๋“œ ๊ต์ฒด(Replace Type Code with State/Strategy)'๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ธ๋””๋ ‰์…˜(Indirection)์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์œ„์ž„์„ ํ†ตํ•ด ๋‹คํ˜•์„ฑ์„ ๋‹ฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค [11, 15, 16]. * **์ƒ์† ๊ตฌ์กฐ ์ƒ์„ฑ์˜ ์„ ํ–‰:** ๋‹คํ˜•์„ฑ์„ ํ†ตํ•ด ์กฐ๊ฑด๋ฌธ์„ ๊ต์ฒดํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ์„œ๋ธŒํด๋ž˜์‹ฑ์ด๋‚˜ ์ƒํƒœ/์ „๋žต ํŒจํ„ด์„ ์ด์šฉํ•œ ์ƒ์† ๊ณ„์ธต ๊ตฌ์กฐ๊ฐ€ ์‚ฌ์ „์— ๋งŒ๋“ค์–ด์ ธ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ, ์ดˆ๊ธฐ ๊ตฌ์กฐ๋ฅผ ์žก๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์ด ์š”๊ตฌ๋œ๋‹ค [11, 17]. --- *Last updated: 2026-05-03*