์ถ”์ƒํด๋ž˜์Šค๋Š” ์™œ ํ•„์š”ํ• ๊นŒ?

๋‹คํ˜•์„ฑ์€ ๋ฉ‹์ง€๊ณ  ๊ฐ•๋ ฅํ•œ ๊ฐœ๋…

  • OO 4๋Œ€ ํŠน์„ฑ์ธ ์ด์œ  (์ƒ์†, ์บก์Šํ™”, ๋‹คํ˜•์„ฑ, ์ถ”์ƒํ™”)
  • ๋‹คํ˜•์„ฑ์€ ์ƒ์†์— ๊ธฐ๋ฐ˜
  • ์ƒ์†๊ณผ ๋‹คํ˜•์„ฑ์€ ์ถ”์ƒํ™”์— ๊ธฐ๋ฐ˜
    • ๊ณตํ†ต๋œ ๊ฒƒ์„ ๋ฝ‘์•„๋‚ด์–ด ์ผ๋ฐ˜ํ™”๋œ, ๋ฒ”์šฉ์ ์ธ ๊ฒƒ์œผ๋กœ ์ ์šฉ
    • ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์—์„œ ๊ณตํ†ต ๋ถ„๋ชจ๋ฅผ ๋ฝ‘์•„ ๋ถ€๋ชจ ํด๋ž˜์Šค๋กœ ์ œ์ž‘
    • ์ž์‹๋งˆ๋‹ค ๋‹ฌ๋ฆฌ ์ž‘๋™ํ•˜๋Š” ๊ตฌํ˜„์„ ๋ถ€๋ชจ์˜ method signature๋กœ ์ผ๋ฐ˜ํ™”
  • ์ถ”์ƒํ™”๋Š” ์กฐ๊ธˆ๋” ๋ณต์žกํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ

์ƒˆ๋กœ์šด ๊ฐœ๋…์€ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๋„ ๊ฐ€์ ธ์˜จ๋‹ค

  • ์ถ”์ƒํ™”๋Š” ๋ง‰๊ฐ•ํ•˜์ง€๋งŒ ๊ทธ๋กœ ์ธํ•ด ์ƒ๊ฐ์ง€ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒ
  • ์—ญ์‹œ ์‚ฌ๋žŒ์€ ์ง์ ‘ ํ•ด๋ณด๊ณ  ๋‹นํ•ด๋ด์•ผ ๋‹ต์„ ์ฐพ์Œ
  • ์ƒˆ๋กœ์šด ๊ฐœ๋… == ์œ„ํ—˜ํ•จ
  • ์ถฉ๋ถ„ํ•œ ๊ฒ€์ฆ์ด ์—†๋‹ค๋ฉด ์‹ ๋ขฐ๋„ ์—†๋Š” ๊ฒƒ.
  • ํ…Œ์ŠคํŠธ ์šฉ์œผ๋กœ ์‚ฌ์šฉ์€ ๊ฐ€๋Šฅํ•˜๋‚˜, ํ”„๋กœ๋•ํŠธ์— ๋„ฃ๋Š” ๊ฒƒ์€ ์‹ ์ค‘ํžˆ.
  • ์—„์ฒญ ์ข‹๋‹ค๋ผ๊ณ  ๋งํ•˜๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๊ผญ ์งˆ๋ฌธํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ โ€œ๋‹จ์ ์ด ๋ญ”๋ฐ?โ€

๋งจ๋‚  ์‹ธ์šฐ๋Š” ๋ชฌ์Šคํ„ฐ

  • ๋ชฌ์Šคํ„ฐ: ์˜ค์šฐ๊ฑฐ, ์œ ๋ น, ํŠธ๋กค
  • ๊ณต๊ฒฉํ•˜๋Š” ๋ชฌ์Šคํ„ฐ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ํ”ผํ•ด์น˜ ๊ณ„์‚ฐ๋ฒ•์„ ๋‹ค๋ฅด๊ฒŒ ์ ์šฉํ•  ์˜ˆ์ •
  • ๋‚˜์ค‘์— ๋ชฌ์Šคํ„ฐ ์ข…๋ฅ˜๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Œ == ๋‹คํ˜•์„ฑ์œผ๋กœ ์„ค๊ณ„๊ฐ€ ์ ํ•ฉ

์ƒํƒœ์™€ ๋™์ž‘

  • ์ƒํƒœ
    • HP
    • ์ƒ์กด ์—ฌ๋ถ€
    • ๊ณต๊ฒฉ๋ ฅ
    • ๋ฐฉ์–ด๋ ฅ
  • ๋™์ž‘
    • ๊ณต๊ฒฉํ•˜๋‹ค

์‹ค์ œ ๋™์ž‘

// Monster
public void attack(Monster target) {
    // ๊ฐ ๋ชฌ์Šคํ„ฐ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„์–ด์žˆ์Œ
}
 
protected void inflictDamage(int amount) {
    this.hp = Math.Max(0, this.hp - amount);
}
 
// Ghost
public void attack(Monster target) {
    // ํ”ผํ•ด๋Ÿ‰ ๊ณ„์‚ฐ
 
    target.inflicDamage(damage)
}
 
// Troll
public void attack(Monster target) {
    // ํ”ผํ•ด๋Ÿ‰ ๊ณ„์‚ฐ
 
    target.inflicDamage(damage)
}

๋‹คํ˜•์„ฑ์ด ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ๋„ˆ๋ฌด ๋„“๊ฒŒ ๋ด„

  • ๊ทผ๋ฐ ์—ฌ๊ธฐ์„œ target.inflictDamange()๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š์œผ๋ฉด?
  • ํ˜ธ์ถœํ•ด๋„ hp๊ฐ€ ์•ˆ๊นŽ์ด๋Š” ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€
  • ๊ตณ์ด ์ž์‹ํ•œํ…Œ ์ด ์—ญํ• ๊นŒ์ง€ ๋ฐ”๋ผ๋Š”๊ฒŒ ๋งž์•˜์„๊นŒ?
  • ํ”ผํ•ด๋Ÿ‰๋งŒ ๊ณ„์‚ฐํ•˜๋ผ๋Š” ์ฑ…์ž„๋งŒ ๊ตฌํ˜„ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋งž๋‹ค.
// Monster
public final void attack(Monster target) {
    int damage = calculateDamage(target);
    target.hp = Math.Max(0, target.hp - damage);
}
 
public int calculateDamage(Monster target) {
    return 0;
}
 
// Ghost
public int calculateDamage(Monster target) {
    return target.getDefense() - target.getAttack();
}
 
// Ogre
public int calculateDamage(Monster target) {
    return this.getAttack() - target.getAttack() - target.getDefense();
}
 
// Troll
public int calculateDamage(Monster target) {
    return this.getAttack() - target.getDefense() / 2;
}

calculateDamage๋ฅผ ์•„์˜ˆ ๊ตฌํ˜„์„ ์•ˆํ•œ๋‹ค๋ฉด..?

  • ์œ„์ฒ˜๋Ÿผ ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋  ๊ฒƒ ๊ฐ™์•˜์œผ๋‚˜..
  • ์‚ฌ์šฉํ•˜๋Š”์ชฝ์„ ๋ฏฟ์„ ์ˆ˜ ์—†๋‹ค.
  • calculateDamage()๋ฅผ override๋ฅผ ์•ˆํ•˜๋ฉด ๋˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.
  • ์ด๋Š” ์ด๋ฏธ 0์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ตฌํ˜„์ด Monster์— ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๊ตฌํ˜„์„ ๊ฐ•์ œํ•˜๊ณ  ์‹ถ์€๋ฐ, ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ๋ ๊นŒ?
  • ์‚ฌ์‹ค ๊ตฌํ˜„์„ ์—†์• ๋ฉด ๋œ๋‹ค.

๊ตฌํ˜„์ด ์—†๋Š” ๋ฉ”์„œ๋“œ

  • signature๋Š” ์žˆ์Œ
  • ๋‚ด๋ถ€ ์ฝ”๋“œ๋Š” ์—†์Œ
  • ๋™์ž‘์ด ์ผ๋ถ€๋ผ๋„ ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ํด๋ž˜์Šค๋Š” ์‹ค์ฒด๊ฐ€ ์™„์„ฑ๋˜์ง€ ์•Š์€ ํด๋ž˜์Šค
  • not concrete
  • == abstract
  • ์‚ฌ์‹ค C์—์„œ๋Š” ์„ ์–ธ๊ณผ ๊ตฌํ˜„์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง๊ด€์ ์œผ๋กœ ๋‹ค๊ฐ€์˜จ๋‹ค.
  • ์ž๋ฐ”๋Š” ์ด๊ฒŒ ์‚ฌ์‹ค ์•ˆ๋˜๊ธดํ•œ๋‹ค.

์• ์ดˆ์— ๋ฌธ์ œ๋„ ์žˆ๋‹ค.

  • Monster๋ผ๋Š” ๊ฐœ์ฒด๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ๋ง์ด๋˜๋Š”๊ฐ€?
  • ์ด๋Š” Group์„ ๋‚˜๋ˆ„๊ธฐ ์œ„ํ•œ ์šฉ๋„๋กœ์„œ ์กด์žฌํ•œ๋‹ค. ์ฆ‰, ์ถ”์ƒ์ ์ด๊ณ , ์ผ๋ฐ˜ํ™”๋˜์–ด ์žˆ๋‹ค.
  • ์–ด๋Š ์ข…๋ฅ˜์—๋„ ์†ํ•˜์ง€ ์•Š๋Š” Monster๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฑด ๋ญ”๊ฐ€ ์ด์ƒํ•˜๋‹ค. ๊ตฌ์ฒด์ ์ธ ๊ฐœ์ฒด๋งŒ์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ‰, ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๊ทผ๋ณธ์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” ๋ฌธ์ œ๋‹ค.

๋ชฉํ‘œ

  1. Monster์˜ ์ž์‹ ํด๋ž˜์Šค๊ฐ€ calculateDamage()๋ฅผ ๋ฌด์กฐ๊ฑด ๊ตฌํ˜„ํ•˜๊ฒŒ ํ•œ๋‹ค.
  2. Monster๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค.

๊ตฌํ˜„์ด ์—†๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค๊นŒ

  • Java๋Š” C์ฒ˜๋Ÿผ ์„ ์–ธ๊ณผ ๊ตฌํ˜„์ด ๋ถ„๋ฆฌ๋˜์–ด์žˆ์ง€ ์•Š๋‹ค.
  • ๊ตฌํ˜„์„ ๊ทธ๋ƒฅ ์—†์• ๊ณ  calculateDamage(); ์ด๋Ÿฐ์‹์œผ๋กœ ์“ฐ๋ฉด abstract๊ฐ€ ๋น ์กŒ๋‹ค๋Š” ๋“ฑ์˜ ์—๋Ÿฌ๋ฅผ ๋ณธ๋‹ค.
  • ๊ทธ๋ž˜์„œ method ์•ž์— abstract๋ฅผ ๋‹ฌ๊ณ  ์ปดํŒŒ์ผ ํ•ด๋ณด๋ฉด, ์ด๋ฒˆ์—๋Š” class๊ฐ€ abstract๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ์—๋Ÿฌ๋ฅผ ๋ณธ๋‹ค.
  • ์ฆ‰, Method๊ฐ€ abstract๋ฉด class๋„ abstractํ•œ ๊ฑด์ง€ ํ™•์ธํ•ด๋ณด์•„์•ผ ํ•œ๋‹ค.
  • ์‚ฌ์‹ค method๊ฐ€ abstract๋ฉด, ์ฆ‰ ๊ตฌํ˜„์„ ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด ์ด method๊ฐ€ ์†ํ•œ class๋„ ์ถ”์ƒ์ ์ด๋ผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋งŒ์•ฝ ๊ทธ๊ฒƒ์ด ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด abstract๋กœ ์„ ์–ธํ•œ ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ Monster ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”์„œ๋“œ๋ฅผ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ธ๋ฐ,
  • method์˜ ๊ตฌํ˜„์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋ฆฝ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค.
  • ์ฆ‰, Method๊ฐ€ abstract๋ฉด class๋„ abstractํ•˜๋‹ค.

์ถ”์ƒ ํด๋ž˜์Šค

  • Class diagram์—์„œ๋Š” italic์œผ๋กœ ํ‘œ๊ธฐ (class name, method name)
  • abstract class๋กœ ๋งŒ๋“ค๋ฉด ๋จ
  • ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์Œ
  • ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค๊ฐ€ ๋  ์ˆ˜๋Š” ์žˆ์Œ
  • ๋ฐ˜๋“œ์‹œ ์ถ”์ƒ ๋ฉ”์„œ๋“œ๊ฐ€ ๋“ค์–ด์žˆ์„ ํ•„์š”๋Š” ์—†์Œ. ์ฆ‰, ๊ตฌํ˜„์ด ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Œ

Reference