Double Dispatch

[์›๋ณธ ๋งํฌ]

Double Dispatch๋Š” ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•œ ๋ณ€ํ˜• ํŒจํ„ด ์ค‘ ํ•˜๋‚˜๋‹ค.

Dispatch๋ฅผ 2์ค‘์œผ๋กœ ํ•œ๋‹ค๋Š” ๊ฑด๋ฐ, ์—ฌ๊ธฐ์„œ Dispatch๋Š” Dynamic Dispatch - ๋‹ค์‹œ ๋งํ•ด์„œ ๋ฉ”์„œ๋“œ ์˜ค๋ฒ„๋ผ์ด๋”ฉ์„ ํ†ตํ•œ ํ•จ์ˆ˜ ์ˆ˜์ค€์˜ ๋‹คํ˜•์„ฑ ๋™์ž‘์ด๋‹ค.

Dynamic Dispatch๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํŠน์ • ๊ฐ์ฒด์˜ ์‹ค์ œ ํƒ€์ž…์— ๋”ฐ๋ผ์„œ ์‹ค์ œ ๋™์ž‘ ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๊ณ , ํ•˜๋‚˜์˜ ๊ฐ์ฒด์˜ ์ƒํƒœ์— ๋”ฐ๋ผ์„œ๋งŒ ๋ถ„๊ธฐํ•ด๋„ ์ถฉ๋ถ„ํ•œ ๊ฒฝ์šฐ์—๋Š” ์ด๊ฒƒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค.
Double Dispatch๋Š” ๊ฐ์ฒด 2๊ฐ€์ง€์˜ ํƒ€์ž…์˜ ์กฐํ•ฉ์— ๋”ฐ๋ผ์„œ ๋™์ž‘์„ ๋” ๋ณต์žกํ•˜๊ฒŒ ์ œ์–ดํ•  ํ•„์š”๊ฐ€ ์žˆ์„ ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.




Single Dispatch

์ฝ”๋“œ๋กœ ๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋ฅผ ํ•˜๋‚˜ ๋“ค์–ด๋ณด๊ฒ ๋‹ค.
์–ธ์–ด๋Š” Rust์ด๊ธด ํ•œ๋ฐ, ์ดํ•ด์— ์–ด๋ ค์›€์€ ์—†์„ ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ ์ฝ”๋“œ๋Š” Person์ด๋ž€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ , ๊ฐ ๊ฐ์ฒด๋“ค์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ์ฒด์˜ ํƒ€์ž…๋ณ„ ๋™์ž‘์„ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์‹ค์ œ ๊ฐ์ฒด ํƒ€์ž…์— ๋”ฐ๋ผ์„œ ๋‹ค๋ฅธ ๋™์ž‘ - ๋‹ค๋ฅธ ๋กœ๊น…์„ ํ•  ๊ฒƒ์ด๋‹ค.

์ด๊ฒŒ ์ผ๋ฐ˜์ ์œผ๋กœ ๋งํ•˜๋Š” ๊ฐ์ฒด์˜ ๋‹คํ˜•์„ฑ์ด๋‹ค.
์‚ฌ์‹ค ๊ตฌํ˜„ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๊ฐ์ฒด์˜ ํƒ€์ž… ํ”Œ๋ž˜๊ทธ๋ฅผ ํ†ตํ•ด์„œ ๊ฐ€์ƒํ•จ์ˆ˜๋ฅผ if-else๋กœ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ, ๋ฌธ๋ฒ•์ ์œผ๋กœ๋Š” ๊ฐ์ฒด๊ฐ€ ๋Šฅ๋™์ ์œผ๋กœ ์ž์‹ ์˜ ํ–‰๋™์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊น”๋”ํ•˜๊ฒŒ ๋ณด์ธ๋‹ค.




๊ฐ์ฒด ๊ฐ„์˜ ๋ณต์žกํ•œ ์ƒํ˜ธ์ž‘์šฉ

์ด์ œ ์ข€ ๋” ๋ณต์žกํ•œ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ๋‹ค.
์‚ฌ๋žŒ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ๊ณผ ๋งŒ๋‚ฌ์„ ๋•Œ์˜ ๋™์ž‘์„ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์˜ˆ๋ฅผ ๋“ค๋ฉด, ํ•™์ƒ์ด ํ•™์ƒ๊ณผ ๋งŒ๋‚ฌ์„ ๋•Œ, ํ•™์ƒ์ด ๊ต์‚ฌ์™€ ๋งŒ๋‚ฌ์„ ๋–„, ๊ต์‚ฌ์™€ ๊ต์‚ฌ๊ฐ€ ๋งŒ๋‚ฌ์„ ๋•Œ ๋“ฑ์„ ์ „๋ถ€ ๋‹ค๋ฅด๊ฒŒ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ํ•œ๋‹ค.

๋‹จ์ˆœํ•˜๊ฒŒ ๊ตฌํ˜„ํ•œ๋‹ค๋ฉด ์ด๋Ÿฐ ์‹์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๋ฐฉ์‹์€ ๊ธฐ๋ณธ์ ์ธ ๊ฐ์ฒด์ง€ํ–ฅ ๋…ผ๋ฆฌ์—์„œ ๋งŽ์ด ๋ฒ—์–ด๋‚œ๋‹ค.
์‚ฌ์šฉ์ž์˜ ์ตœ์ข… ํ•จ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ฐœ๋ณ„ ๊ตฌ์ฒด ํƒ€์ž…์— ์˜์กดํ•ด๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์•„๋‹ˆ๋ฉด, ๋™์ž‘์„ ๋‹จ์ผ ๋ฉ”์„œ๋“œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์ •์˜ํ•˜๋˜, ํ•ด๋‹น ๊ตฌํ˜„์—์„œ ํƒ€์ž…์œผ๋กœ ๋ถ„๊ธฐ๋ฅผ ์น  ์ˆ˜๋„ ์žˆ๋‹ค.

๋™์ž‘์€ ํ•˜์ง€๋งŒ, ์ด๊ฒƒ๋„ ์•ˆํ‹ฐ ํŒจํ„ด์— ์†ํ•œ๋‹ค.
๋‹ค์šด์บ์ŠคํŒ…์„ ํ†ตํ•œ ํƒ€์ž… ์ฒดํฌ๋Š” ๊ฐ€๋…์„ฑ๋„ ๋‚˜์˜์กฐ ๋ณ€๊ฒฝ์ด๋‚˜ ํ™•์žฅ์— ์ทจ์•ฝํ•œ ๋ถ€๋ถ„์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.




Double Dispatch

Double Dispatch๋Š” ๋‹คํ˜•์„ฑ์— ์˜ํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ถ„๊ธฐ๋ฅผ 2์ค‘์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ์ด๋Ÿฐ ์‹์ด๋‹ค.
API ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ตœ์ข… ํ•จ์ˆ˜๊ฐ€ ์žˆ๊ณ , ๊ฑฐ๊ธฐ์—์„œ ๋ถ„๊ธฐ๋ฅผ ํƒœ์šธ 2๋ฒˆ์งธ ๋””์ŠคํŒจ์น˜ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค.


๊ทธ๋Ÿผ ๊ฐ๊ฐ์˜ ๊ฐ์ฒด๋“ค์ด ํ•จ์ˆ˜๋ฅผ ์ ์ ˆํžˆ ๊ตฌํ˜„ํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฒ˜์Œ meet์œผ๋กœ ๊ฐ์ฒด ๋ถ„๊ธฐ๋ฅผ ํƒ€๊ณ  (first dispatch), other์˜ ๊ฐœ๋ณ„ meet์„ ๋ถ€๋ฅด๋ฉด์„œ 2๋ฒˆ์งธ ๊ฐ์ฒด ๋ถ„๊ธฐ๋ฅผ ํƒ„๋‹ค. ๊ทธ๋ž˜์„œ double dispatch๋‹ค.
์ด๋ฅผ ํ†ตํ•ด์„œ 2๊ฐ€์ง€์˜ ํƒ€์ž… ๋ถ„๊ธฐ๋ฅผ ๋‹คํ˜•์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ˆจ๊ฒผ๋‹ค. ์‚ฌ์‹ค if-else๋Š” ์žˆ์ง€๋งŒ, ์ด์ œ ๊ทธ๊ฒŒ ์ฝ”๋“œ์—์„œ ๋“œ๋Ÿฌ๋‚˜์ง„ ์•Š๋Š”๋‹ค.


์ตœ์ข… ์‚ฌ์šฉ์ž๋Š” ์ด๋ ‡๊ฒŒ first dispatch ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.




Double Dispatch์˜ ํ•œ๊ณ„

์‚ฌ์‹ค ์œ„ ์˜ˆ์ œ์—๋Š” ๋ฏธ๋ฌ˜ํ•œ ๋ถ€๋ถ„์ด ์žˆ๋‹ค.

meet ํ•จ์ˆ˜ ๋‚ด์—์„œ ์šฐํ•ญ ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ์ฒด ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์™ผ์ชฝ๊ณผ ์˜ค๋ฅธ์ชฝ์˜ ์ˆœ์„œ๊ฐ€ ๋’ค๋ฐ”๋€๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฃผ์ฒด๊ฐ€ ๋ฐ”๋€Œ์—ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ด๊ฑด ๊ฐ์ฒด ํƒ€์ž… ๊ฐ„์˜ ๋Œ€์นญ์„ฑ์ด ๋ณด์žฅ๋  ๋•Œ๋งŒ ์ด์ƒ์ ์œผ๋กœ ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ตฌํ˜„ ํŒจํ„ด์ด๋‹ค.
๊ฐ์ฒด ๊ฐ„์˜ ์—ฐ์‚ฐ ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” ์‚ฌ์šฉํ•˜๊ธฐ์— ์ข€ ์• ๋งคํ•˜๋‹ค.



์ฐธ์กฐ
https://en.wikipedia.org/wiki/Double_dispatch
https://refactoring.guru/design-patterns/visitor-double-dispatch
https://medium.com/@andrei-trukhin/understanding-double-dispatch-a-journey-through-design-patterns-e7bebeb45089