์ž˜์€ ๋ชจ๋ฅด์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค ์“ฐ๋ฉด์„œ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋˜๊ฑด ๋‹คํ˜•์„ฑ.


๋‹คํ˜•์„ฑ์— ๋Œ€ํ•ดย ๋‚ด๊ฐ€ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”๊ฑด Fighter์™€ Mage ํด๋ž˜์Šค๋ฅผ Human์ด๋ผ๋Š” ๋™์ผํ•œ ์Šˆํผํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›๊ฒŒ ํ•˜๋ฉด


Fight: Human

Mage: Human


Human์— ๋Œ€ํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ Human์„ ์ƒ์†ํ•˜๊ณ  ์žˆ๋Š” Fighter๋ž‘ Mage์˜ ์˜ค๋ธŒ์ ํŠธ๋“ค์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์Œ.


List humans = new List();


humans.add(new Fighter());

humans.add(new Mage());


๊ทธ๋Ÿฌ๋ฉด ์ผ๊ด„์ ์œผ๋กœ Human ํด๋ž˜์Šค๊ฐ€ ๊ฐ€์ง„ย attack() ์ฝœ ํ•  ๋•Œ ์•„๋ž˜์ฒ˜๋Ÿผ ํ•œ๋ฒˆ์— ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ.


humans.forEach(o => {

o.attack();

});


์š”๊นŒ์ง€ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋‹คํ˜•์„ฑ. ๊ณตํ†ต์ ์ด ์žˆ๋Š” ๊ฒƒ๋ผ๋ฆฌ ๋ฌถ์–ด์„œ ์ข€ ๋” ํŽธํ•˜๊ฒŒ ์“ฐ๋Š” ๊ทธ๋Ÿฐ๊ฑฐ??ย ๋” ๋ณต์žกํ•˜๊ณ  ์ „๋ฌธ์ ์ธ ๋‚ด์šฉ์€ ์ž˜ ๋ชจ๋ฆผ.



์•„๋ฌดํŠผ Fighter๋ž‘ Mage๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ๊ฐ‘์ž๊ธฐย ๊ธฐํš์ด ๋ฐ”๋€๊ฑฐ์ž„. heal() ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด์„œ, Priest ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ๋จ.

๊ทธ๋ฆฌ๊ณ  Mage๋Š” attack()๊ณผ heal() ๋‘๊ฐ€์ง€๋ฅผ ๊ฐ€์ง€๋„๋ก ๋ณ€๊ฒฝ๋จ.


Fighter->attack()

Mage->attack(), heal()

Priest->heal()


Mage๋ž‘ Fighter๋Š” Human์œผ๋กœ ๋ฌถ์ด๊ณ , Priest๋ž‘ Mage๋Š” heal()์„ ๊ฐ€์ง„ ์–ด๋–ค ํด๋ž˜์Šค๋กœ ๋ฌถ์ผ๊ฑฐ ๊ฐ™์ง€๋งŒ...


c#์—์„  ๋‹ค์ค‘ ์ƒ์†์ด ์•ˆ๋จ, Mage: Human, Healer ๊ฐ™์€๊ฒŒ ์•ˆ๋จ. ๊ทธ๋ž˜์„œ ํ•œ๋ฒˆ์— ๋ฌถ๊ธฐ๊ฐ€ ์ข€ ์• ๋งคํ•ด์ง.


Human์— heal()์„ ๋„ฃ์œผ๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, heal()์ด ์•ˆ๋˜๋Š” Fighter๋ฅผ Healers ๊ฐ™์€ ์ปจํ…Œ์ด๋„ˆ์— ๋„ฃ๊ธฐ๋„ ์‹ซ๊ณ , heal() ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์‹ถ์€ ๊ธฐ๋ถ„๋„ ์•„๋‹˜. ๊ทธ๋ƒฅ ๊ทธ๋Ÿผ.



์ด๊ฑธ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ธํ„ฐํŽ˜์ด์Šค


๊ณต๊ฒฉ ๊ฐ€๋Šฅํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๋Š” ๋А๋‚Œ์œผ๋กœ IAttackable ์ด๋ผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ฌ, ๊ทธ๋ฆฌ๊ณ  IHealable๋„ ๋งŒ๋“ฌ.


interface IAttackable

{

int attack();

}


๊ทธ๋ฆฌ๊ณ  ๊ฐ ์ง์—… ํด๋ž˜์Šค๋“ค์ด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†(?)ํ•˜๋„๋ก ๋งŒ๋“ฌ. ์ •ํ™•ํ•œ ์šฉ์–ด๋Š” ์ž˜ ๋ชจ๋ฆฌ๊ฒ ์Œ...


Fighter: IAttackable

Mage: IAttackable, IHealable

Priest: IHealable


์ด๋ ‡๊ฒŒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ถ™์ด๋ฉด ๊ธฐ์กด List์€ย List attackers ๋ผ๋Š” ์ปจํ…Œ์ด๋„ˆ๋กœ ๋ฐ”๊พธ๋ฉด, ์ด์ „์ฒ˜๋Ÿผย Fighter๋ž‘ Mage๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ณ , attackers.forEach() ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ attack()์„ ์ฝœ ํ•  ์ˆ˜ ์žˆ์Œ.


List healers ๋ฅผ ๋งŒ๋“ค๋ฉด Mage์™€ Priest๋ฅผ ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•ด์ค„ ์ˆ˜ ์žˆ์Œ. ์ด๋Ÿฐ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๋ฌถ์„ ์ˆ˜ ์žˆ๋Š” ๊ฟ€๊ธฐ๋Šฅ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ์ƒ๊ฐํ•จ.


์ธํ„ฐํŽ˜์ด์Šค๋Š” public method๋ฅผ ์ •์˜๋งŒํ•ด๋‘๋ฉด ์“ฐ๋Š” ์‚ฌ๋žŒ์ด ์ƒ์„ธ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š”๊ฑฐ๋ผ์„œ ๋ญ”๊ฐ€ ์ข€ ํ•ฉ๋ฆฌ์ ์ž„.



์ถ”์ƒ ํด๋ž˜์Šค๋ž‘ ์ธํ„ฐํŽ˜์ด์Šค๋ž‘ ๋ฌด์Šจ ์ฐจ์ด๊ฐ€ ์žˆ๋ƒ๊ณ  ์งˆ๋ฌธํ•˜๋ฉด ๊ทธ ํ•ด๋‹ต์„ ์ฐพ๋Š” ์ฆ๊ฑฐ์›€์€ ๋…์ž์—๊ฒŒ ๋‚จ๊ธด๋‹ค๋Š” ๋ง๋กœ ๋Œ€์ฒด.