๋‹คํ˜•์„ฑ์€ ๋ฌด์—‡์ธ๊ฐ€? ์™œ ์ค‘์š”ํ•œ๊ฐ€?

Polymorphism

poly + morph + ism: ๋‹ค์–‘ํ•œ + ๋ณ€ํ•˜๋‹ค + ์ƒํƒœ = ๋‹ค์–‘ํ•œ ํ˜•ํƒœ๋กœ ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ

  • ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด OOP์˜ ํ•ต์‹ฌ์ด๋ผ ์—ฌ๊ธฐ๋Š” ํŠน์ง•
  • ๊ฐ™์€ ์ง€์‹œ๋ฅผ ๋‚ด๋ ธ๋Š”๋ฐ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๊ฐœ์ฒด๊ฐ€ ๋™์ž‘์„ ๋‹ฌ๋ฆฌ ํ•˜๋Š” ๊ฒƒ
  • ์–ด๋–ค ํ•จ์ˆ˜ ๊ตฌํ˜„์ด ์‹คํ–‰๋ ์ง€ ์‹คํ–‰์ค‘์— ๊ฒฐ์ •๋œ๋‹ค.
    • late binding (๋Šฆ์€ ๋ฐ”์ธ๋”ฉ)
    • C์—์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์™€ ๋น„์Šทํ•จ
    • ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ early binding
      • ์ปดํŒŒ์ผ ์ค‘์— ๊ฒฐ์ •๋จ
  • ๋‹คํ˜•์„ฑ์˜ ํ˜œํƒ์„ ๋ฐ›์œผ๋ ค๋ฉด ์ƒ์† ๊ด€๊ณ„๊ฐ€ ํ•„์š”
    • ๋ถ€๋ชจ ๊ฐœ์ฒด์—์„œ ํ•จ์ˆ˜ signature๋ฅผ ์„ ์–ธ
    • ์ž์‹ ๊ฐœ์ฒด์—์„œ ๊ทธ ํ•จ์ˆ˜๋ฅผ overriding
  • ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๊ฐœ์ฒด๋ฅผ ํŽธํ•˜๊ฒŒ ์ €์žฅ ๋ฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  • ์ƒ์†์€ ๋‹คํ˜•์„ฑ์˜ ํ•„์š” ์กฐ๊ฑด

๋ฌด๋Šฌ vs. ์‹ค์ฒด

Animal animal = new Dog()
animal.shout()
  • ๋ฌด๋Šฌ: 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(users, NUM_USERS, sizeof(userdata_t), compare_age_id);
 
int compare_age_id(const void* p0, const void* p1) {
    const userdata_t* user0 = p0;
    const userdata_t* user1 = p1;
 
    if (user0->age == user1->age) {
        return user0->id - user1->id;
    }
 
    return user0->age - user1->age;
}
  • 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ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์„œ๋“œ
      • ๋‹คํ˜•์ ์ธ ๋ฉ”์„œ๋“œ

Reference