# [[Switch Statements (Switch ๋ฌธ)]] ## ๐Ÿ“Œ Brief Summary Switch ๋ฌธ์€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์ƒ์†์ด๋‚˜ ๋‹คํ˜•์„ฑ(Polymorphism)์˜ ์ด์ ์„ ์ œ๋Œ€๋กœ ์‚ด๋ฆฌ์ง€ ๋ชปํ•˜๊ณ  ์ ˆ์ฐจ์ง€ํ–ฅ์ ์œผ๋กœ ์ฝ”๋“œ๊ฐ€ ๊ตฌํ˜„๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋Œ€ํ‘œ์ ์ธ '์ฝ”๋“œ ์Šค๋ฉœ(OO Abusers)' ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค [1-3]. ์ด๋Ÿฌํ•œ ์กฐ๊ฑด๋ฌธ์€ ํ”„๋กœ๊ทธ๋žจ ์—ฌ๋Ÿฌ ๊ณณ์— ํฉ์–ด์ ธ ์ฝ”๋“œ ์ค‘๋ณต์„ ์œ ๋ฐœํ•˜๋ฉฐ, ์ƒˆ๋กœ์šด ์กฐ๊ฑด์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ๊ด€๋ จ๋œ ๋ชจ๋“  Switch ๋ฌธ์„ ์ฐพ์•„ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๊ตฌ์กฐ์  ๊ฒฐํ•จ์„ ๋‚ณ์Šต๋‹ˆ๋‹ค [2]. ์ผ๋ฐ˜์ ์œผ๋กœ '์กฐ๊ฑด์‹์„ ๋‹คํ˜•์„ฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ(Replace Conditional with Polymorphism)'์™€ ๊ฐ™์€ ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹œ์Šคํ…œ์˜ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 5]. ## ๐Ÿ“– Core Content * **๊ฐ์ฒด์ง€ํ–ฅ ์„ค๊ณ„์˜ ๊ฒฐํ•จ ์ง€ํ‘œ:** ๊ฐ์ฒด์ง€ํ–ฅ ์ฝ”๋“œ์˜ ๊ฐ€์žฅ ๋šœ๋ ทํ•œ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” Switch(๋˜๋Š” case) ๋ฌธ์ด ์ƒ๋Œ€์ ์œผ๋กœ ์ ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค [2]. Switch ๋ฌธ์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๋“ฑ์žฅํ•˜๋Š” ๊ฒƒ์€ ๊ฐ์ฒด์ง€ํ–ฅ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋‚จ์šฉํ–ˆ๊ฑฐ๋‚˜(OO Abusers) ์ž˜๋ชป ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ์‹ ํ˜ธ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค [1, 3]. Switch ๋ฌธ์˜ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋Š” ์ค‘๋ณต์„ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค๋Š” ์ ์ด๋ฉฐ, ์ƒˆ๋กœ์šด ๋ถ„๊ธฐ ์กฐ๊ฑด์ด ์ƒ๊ธธ ๋•Œ๋งˆ๋‹ค ํฉ์–ด์ง„ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ๋ณ€๊ฒฝ์„ ๋ฐฉํ•ดํ•ฉ๋‹ˆ๋‹ค [2]. * **๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•œ ๋ฆฌํŒฉํ† ๋ง:** Switch ๋ฌธ์„ ๋งˆ์ฃผ์น˜๋ฉด ๊ฐ€์žฅ ๋จผ์ € ๋‹คํ˜•์„ฑ์˜ ์ ์šฉ์„ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [4]. * Switch ๋ฌธ์ด ์ข…์ข… ํƒ€์ž… ์ฝ”๋“œ(Type Code)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ, ์šฐ์„  'ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ(Extract Method)'์™€ 'ํ•จ์ˆ˜ ์˜ฎ๊ธฐ๊ธฐ(Move Method)'๋ฅผ ์‚ฌ์šฉํ•ด ํ•ด๋‹น Switch ๋ฌธ์„ ๋‹คํ˜•์„ฑ์ด ํ•„์š”ํ•œ ํด๋ž˜์Šค๋กœ ์ด๋™์‹œํ‚ต๋‹ˆ๋‹ค [4]. * ๊ทธ ๋‹ค์Œ 'ํƒ€์ž… ์ฝ”๋“œ๋ฅผ ์„œ๋ธŒํด๋ž˜์Šค๋กœ ๋ฐ”๊พธ๊ธฐ(Replace Type Code with Subclasses)'๋‚˜ 'ํƒ€์ž… ์ฝ”๋“œ๋ฅผ ์ƒํƒœ/์ „๋žต ํŒจํ„ด์œผ๋กœ ๋ฐ”๊พธ๊ธฐ(Replace Type Code with State/Strategy)'๋ฅผ ํ†ตํ•ด ์ƒ์† ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค [4]. * ๋งˆ์ง€๋ง‰์œผ๋กœ '์กฐ๊ฑด์‹์„ ๋‹คํ˜•์„ฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ(Replace Conditional with Polymorphism)'๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ถ„๊ธฐ ๋กœ์ง์„ ๋™์  ๋ฐ”์ธ๋”ฉ์œผ๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค [4, 5]. ์ด๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ํƒ€์ž…์ด ์ถ”๊ฐ€๋  ๋•Œ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š”๊ฐ€ ์—†๊ฒŒ ๋˜์–ด ๊ฐœ๋ฐฉ-ํ์‡„ ์›์น™(Open-Closed Principle)์„ ์ค€์ˆ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [5, 6]. * **๋‹คํ˜•์„ฑ ์™ธ์˜ ๋Œ€์•ˆ ๊ธฐ๋ฒ•:** ์กฐ๊ฑด์ด Null์ธ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ถ„๊ธฐ๊ฐ€ ์žˆ๋‹ค๋ฉด '๋„ ๊ฐ์ฒด ๋„์ž…ํ•˜๊ธฐ(Introduce Null Object)' ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ Switch ๋ฌธ์˜ ๋ณต์žก์„ฑ์„ ๋œ์–ด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7]. ## โš–๏ธ Trade-offs & Caveats * **๋‹คํ˜•์„ฑ ์ ์šฉ์˜ ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง(Overkill) ์œ„ํ—˜:** Switch ๋ฌธ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์กฐ๊ฑด ๋‹คํ˜•์„ฑ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ๋ฉ”์„œ๋“œ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์†Œ์ˆ˜์˜ ์กฐ๊ฑด ์ผ€์ด์Šค๋งŒ ์กด์žฌํ•˜๊ณ  ํ–ฅํ›„ ์ด ์กฐ๊ฑด๋“ค์ด ๋ณ€๊ฒฝ๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ, ๋‹คํ˜•์„ฑ์„ ๋„์ž…ํ•˜๋Š” ๊ฒƒ์€ ์˜คํžˆ๋ ค ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์„ ๊ฐ€์ค‘์‹œํ‚ค๋Š” ์˜ค๋ฒ„์—”์ง€๋‹ˆ์–ด๋ง(Overkill)์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [7]. * ์ด๋Ÿฌํ•œ ์ œ์•ฝ ์ƒํ™ฉ์—์„œ๋Š” ๋‹คํ˜•์„ฑ ๋Œ€์‹  '๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ช…์‹œ์  ๋ฉ”์„œ๋“œ๋กœ ๋ฐ”๊พธ๊ธฐ(Replace Parameter with Explicit Methods)'์™€ ๊ฐ™์ด ๋” ๋‹จ์ˆœํ•œ ๋ฆฌํŒฉํ† ๋ง ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•ฉ๋‹ˆ๋‹ค [7]. --- *Last updated: 2026-05-03*