๋คํ์ฑ์ ๋ฌด์์ธ๊ฐ? ์ ์ค์ํ๊ฐ?
Polymorphism
poly + morph + ism: ๋ค์ํ + ๋ณํ๋ค + ์ํ = ๋ค์ํ ํํ๋ก ๋ณํ ์ ์๋ ๋ฅ๋ ฅ
- ๋ง์ ์ฌ๋๋ค์ด OOP์ ํต์ฌ์ด๋ผ ์ฌ๊ธฐ๋ ํน์ง
- ๊ฐ์ ์ง์๋ฅผ ๋ด๋ ธ๋๋ฐ ๋ค๋ฅธ ์ข ๋ฅ์ ๊ฐ์ฒด๊ฐ ๋์์ ๋ฌ๋ฆฌ ํ๋ ๊ฒ
- ์ด๋ค ํจ์ ๊ตฌํ์ด ์คํ๋ ์ง ์คํ์ค์ ๊ฒฐ์ ๋๋ค.
- late binding (๋ฆ์ ๋ฐ์ธ๋ฉ)
- C์์ ์๊ฐํด๋ณด๋ฉด ํจ์ ํฌ์ธํฐ์ ๋น์ทํจ
- ์ผ๋ฐ์ ์ธ ํจ์ ํธ์ถ์ early binding
- ์ปดํ์ผ ์ค์ ๊ฒฐ์ ๋จ
- ๋คํ์ฑ์ ํํ์ ๋ฐ์ผ๋ ค๋ฉด ์์ ๊ด๊ณ๊ฐ ํ์
- ๋ถ๋ชจ ๊ฐ์ฒด์์ ํจ์ signature๋ฅผ ์ ์ธ
- ์์ ๊ฐ์ฒด์์ ๊ทธ ํจ์๋ฅผ overriding
- ๋ค๋ฅธ ์ข ๋ฅ์ ๊ฐ์ฒด๋ฅผ ํธํ๊ฒ ์ ์ฅ ๋ฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ
- ์์์ ๋คํ์ฑ์ ํ์ ์กฐ๊ฑด
๋ฌด๋ฌ vs. ์ค์ฒด
- ๋ฌด๋ฌ:
Animal
- ์ค์ฒด:
Dog
- ์ด ๊ฒฝ์ฐ ์ค์ฒด์ ์ ์๋
shout()
ํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ค. - ์ฆ, ์ค์ ๊ฐ์ฒด์ ๊ตฌํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค.
- ๋จ, ๋น์ฐํ ๋ถ๋ชจ ํด๋์ค์์ ์ ์ํ method signature์ ๋ํด์ ๋คํ์ฑ์ด ์ ์ฉ๋๋ค.
- ์์ ํด๋์ค์์ ๋ฐ๋ก ์ ์ํ method์ ๋ํด์๋ ์ ๊ทผ์ด ๋ถ๊ฐํ๋ค.
- ์ฆ, overriding ํ ๋
์์ ๋ํด์ ์ ์ฉ๋๋ค.
- ๋น์ฐํ ์ ํ์ฌํญ์ด๋ค.
Overriding vs. Overloading
- Overriding: ์์ ๊ด๊ณ์์ ์์ ๊ฐ์ฒด๊ฐ ๋ถ๋ชจ ๊ฐ์ฒด์ ์ ์๋ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์ฌ ์ฌ์ฉํ๋ ๊ฒ, Method signature๋ ๋์ผ
- Overloading: ๊ฐ์ ๋ฉ์๋ ์ด๋ฆ์ ๊ฐ์ง๊ณ , Parameter(๋งค๊ฐ๋ณ์)์ ๊ธธ์ด, ๊ฐ์๋ค์ด ๋ฌ๋ผ์ง๋ ๊ฒ
๋คํ์ฑ์ ์ฅ์
- ์ ์ฐจ์ ์ผ ๊ฒฝ์ฐ if๋ฌธ ์ฌ์ฉํ์ฌ ๋ถ๊ธฐํด์ฃผ์ด์ผ ํ๋ค.
- ์๋ฃํ์ ์ฝ๋๊ฐ ํด๋์ค ์์ ๋ค์ด๊ฐ์ฌ ์บก์ํ๋๋ค.
- ์ ์ง ๋ณด์์ฑ์ด ๋์์ง๋ค.
- ์๋ก์ด ํด๋์ค์ถ๊ฐ์, ํด๋์ค ์ฝ๋๋ง ์ถ๊ฐํ๋ฉด ๋๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์ค์ด๋ ๋ค.
์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ๋ฉด OO๊ฐ ์๋๋ค?
- ๊ทน๋จ์ ์ธ ์ฌ๋๋ค์
- ์ฃผ์ฅ: if๋ ๊ตฌ์กฐ์ ํ๋ก๊ทธ๋๋ฐ์ ์ผ๋ถ๋, ๋ชจ๋ ๊ฒ์ ๋คํ์ฑ์ ๋ฐ๊ฟ์ผ ํ๋ค
- โ๋ชจ๋ ๊ฒโ: ์ค๋ต
- ์์ ํ ์๋ชป๋ ์ฃผ์ฅ.
- ํด๋์ค ๋ด๋ถ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์กฐ๊ฑด๋ฌธ ์์ด ์์ฑํ๊ธฐ ๋งค์ฐ ์ด๋ ต๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ตณ์ด ๋ชจ๋ ๊ฑธ OO๋ก ๋ง๋ค์ด์ผ ํ ์ด์ ๊ฐ ์๋ค.
๋ฆ์ ๋ฐ์ธ๋ฉ vs. ์ด๋ฅธ ๋ฐ์ธ๋ฉ
- late binding == dynamic binding
- ์ด๋ค ๊ตฌํ์ด ๋ธ๋ ค์ฌ์ง๋ ๋ชจ๋ฆ. ์คํ์ค์ ๊ฒฐ์ ํด์ค
- early binding == static binding
- ์ด๋ค ๊ตฌํ์ด ์คํ๋์ด์ผ ํ๋์ง ์ ํด์ ธ์์
- C์์ ๋์ํ๋ ํจ์ ํธ์ถ ๋ฐฉ์
C ํจ์ ํฌ์ธํฐ์์ ๋น๊ต
- C์์ ๋ฆ์ ๋ฐ์ธ๋ฉ์ด ๊ฐ๋ฅํ๊ธฐ๋ ํ๋ค.
- ๋ฐ๋ก ํจ์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
- quickSort๊ฐ์ ๊ฒฝ์ฐ, ๋ ์์์ ๋์๋ฅผ ๋น๊ตํ๋ ๊ณผ์ ์ ํจ์ํฌ์ธํฐ๋ฅผ ๋ฃ์ด์ค๋ค.
- ๋๊ฐ์ void pointer๋ฅผ parameter๋ก ๋ฐ์ผ๋ฉฐ, ๋ฐํํ์ int์ฌ์ผ ํ๋ค.
- ์ด๋ฌํ ํ์ ์ ํจ์ ํฌ์ธํฐ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋๊ณ , ์ด ๊ตฌํ์ ๊ฐ๊ฐ์ ํ์ฉ๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.
- ๊ทธ๋ฆฌ๊ณ ์คํ์ค์ ๊ฒฐ์ ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฆ์ ๋ฐ์ธ๋ฉ์ด๋ค.
C์์์ ๋คํ์ฑ
- ๋น์ฃผ๋ฅ ์ธ์ด์์๋ method signature๊ฐ ๋์ผํ์ง ์์๋ ๋คํ์ฑ์ ์ง์ํ ์ ์๋ค.
- ์ด ๋ง์ ์๋ฏธ๋, C์์ ํ๋ ๋คํ์ฑ์ ๋งํ๋ ๊ฒ์ด๋ค.
- C๋ OO์ธ์ด๊ฐ ์๋์๋ ๋ถ๊ตฌํ๊ณ ๋คํ์ฑ์ด ๊ฐ๋ฅํ๋ค.
- C๊ฐ ๋จผ์ ๋์ค๊ณ OO๊ฐ ๋์ค์ ๋ฑ์ฅํ๋ค.
- ๊ทธ๋ผ C์์ ๋คํ์ฑ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๊ตฌ์กฐ์ ์ผ๋ก๋ง ๋ฐ๊ฟ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์๋๊น? ํ๋ ์๊ฐ์ด ๋ค ์ ์๋ค.
- ์ ๋ต์ด๋ค.
C์ ์๋ ๊ธฐ๋ฅ์ ํ๋์จ์ด์ ์๋ค.
- C๋ ๊ฐ์ฅ ๋จ์ํ๊ณ ํ๋์จ์ด์ ๊ฐ๊น์ด ์ธ์ด์ด๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, C์ ์๋ ์ด์ ๋ ํ๋์จ์ด์ ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ๋ง์ฝ์ ์์ผ๋ฉด ํ๋์จ์ด์ ์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
- ๊ทธ๋ฐ๋ฐ C์ ์๋ ๊ธฐ๋ฅ์ด Java, C#, C++์ ์๋ค. ๊ทธ๋ผ ์ด๊ฑด ๋ญ์ง?
- ๋ค๋ฅธ ํ๋ก๊ทธ๋๋จธ๊ฐ ๋ง๋ค์ด์ค ๊ธฐ๋ฅ์ด๋ค.
- ์๋ฅผ ๋ค์ด, Java์๋ง ์๋ ๊ธฐ๋ฅ์ C์ ๊ธฐ๋ฅ์ ์กฐํฉํด์ ๋ง๋ ๊ฒ
- ๊ทธ ๊ธฐ๋ฅ์ ๋ง๋ ์ฌ๋: Java Compilter์ JVM์ ๋ง๋ ์์ง๋์ด
- ์ฆ, ์ปดํ์ผ๋ฌ์ JVM์ด ํจ์ ํฌ์ธํฐ ๊ฐ์ ๊ฒ์ ๋์ ์ ๋ฌํด์ฃผ๋ ๊ฒ์ด ์ ๋ถ๋ค.
Java์ C์ ๊ธฐ๋ณธ ํจ์ ํธ์ถ ๋ฐฉ์ ๋น๊ต
- C
- ์ด๋ฅธ ๋ฐ์ธ๋ฉ
- ์ํ๋ฉด ๋ฆ์ ๋ฐ์ธ๋ฉ ๊ฐ๋ฅ(ํจ์ ํฌ์ธํฐ ์ ๋ฌ)
- Java
- ๊ธฐ๋ณธ์ ์ผ๋ก๋ ๋ฆ์ ๋ฐ์ธ๋ฉ(๋ฌผ๋ก ์ด๋ฅธ๋ฐ์ธ๋ฉ๋ ๊ฐ๋ฅํ๊ธด ํจ)
- == ๊ฐ์ ๋ฉ์๋ (virtual method): C++์์ ๋ณดํต ์ฌ์ฉํ๋ ์ฉ์ด
- ์์ ํด๋์ค์์ ๋์์ overridingํ ์ ์๋ ๋ฉ์๋
- ๋คํ์ ์ธ ๋ฉ์๋