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