๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
728x90

์ด ๊ธ€์€ <์ด๊ฒƒ์ด C#์ด๋‹ค> ์ฑ…์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ณต๋ถ€ํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค.

 

 

 

๊ฐœ์š”

 

๊ฐœ์ธ์ ์œผ๋กœ ์ƒ๊ฐํ•˜๋Š” ๊ฐ์ฒด ์ง€ํ–ฅ์˜ ๊ฝƒ ์ค‘ ํ•˜๋‚˜๋Š” ์—…์บ์ŠคํŒ…(Upcasting)์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค.  ์ˆ˜๋งŽ์€ ์ž์‹ ํด๋ž˜์Šค๋“ค์ด ์žˆ์ง€๋งŒ, ๊ทธ ๋งŽ์€ ํด๋ž˜์Šค๋“ค์„ ๋ถ€๋ชจ ํด๋ž˜์Šค ํ•˜๋‚˜๋กœ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์ƒ์‚ฐ์„ฑ์— ์ •๋ง ํฐ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์ฒ˜์Œ ๊ฐ์ฒด์ง€ํ–ฅ์–ธ์–ด๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ๋‹น์—ฐํžˆ ๋‚˜๋„ ์ด๊ฒŒ ๋ฌด์Šจ ์˜๋ฏธ์ธ์ง€ ์ž˜ ์•Œ์ง€ ๋ชปํ–ˆ๋‹ค.

 

๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋‚ด์šฉ์„ ์˜ˆ์‹œ๋ฅผ ๋“ค๋ฉด์„œ ํ•œ ๋ฒˆ ์„ค๋ช…ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž์‹ ํด๋ž˜์Šค๋“ค์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

class Monster
{
    public void Attack() { ... }
}

class Slime : Monster
{
    public void LiquidAttack() { ... }
}

class Bubbling : Monster
{
    public void TailAttack() { ... }
}

class RibbonPig : Monster
{
    public void StrikeAttack() { ... }
}

...

/*  ๋ฌผ๋ก  ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์งœ๊ธฐ๋ณด๋‹จ, ์˜ค๋ฒ„๋ผ์ด๋”ฉํ•˜์—ฌ ์“ธ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒŒ ๋” ํšจ์œจ์ ์ด์ง€๋งŒ ์˜ˆ์‹œ๋ฅผ ์œ„ํ•ด,,,  */

 

 

์ˆ˜๋งŽ์€ ๋ชฌ์Šคํ„ฐ ์ข…๋ฅ˜๊ฐ€ ์žˆ๊ณ , ์ด์ œ ์ด ๋ชฌ์Šคํ„ฐ๋“ค์„ ๋งต์—์„œ ์Šคํฐ(Spawn)๋˜๋„๋ก ํ•˜๋Š” ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•œ๋‹ค.

๊ทผ๋ฐ ์—… ์บ์ŠคํŒ…์„ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ชฌ์Šคํ„ฐ ์ข…๋ฅ˜ ์ˆ˜๋งŒํผ ์˜ค๋ฒ„๋กœ๋”ฉ์„ ํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์ƒ๊ธด๋‹ค.

class MonsterSpawn
{
    public void Spawn(Slime slime) { ... }
    public void Spawn(Bubbling bubbling) { ... }
    public void Spawn(RibbonPig ribbonPig) { ... }
    ...
}

 

ํ•˜์ง€๋งŒ, ๋ถ€๋ชจ๋Š” ์ž์‹์„ ํ’ˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์—…์บ์ŠคํŒ…์„ ์ด์šฉํ•˜๋ฉด ๋ฉ”์†Œ๋“œ ํ•˜๋‚˜๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค.

class MonsterSpawn
{
    public void Spawn(Monster monster) { ... }
}

 

 

"๊ฐ์ฒด๋ฅผ ๋ฐ›์€ ๊ฑด ์ข‹์•„, ๊ทผ๋ฐ ๊ทธ๋Ÿฌ๋ฉด ๊ฐ ์ž์‹ ํด๋ž˜์Šค์˜ ๊ณ ์œ  ๊ธฐ๋Šฅ์€ ์–ด๋–ป๊ฒŒ ์จ?"

 

์—…์บ์ŠคํŒ…์„ ํ†ตํ•ด ์ž์‹ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋ฅผ ๋ฐ›์•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ, ๋ฐ›์€ ์ž์‹ ํด๋ž˜์Šค์˜ ๊ณ ์œ  ๊ธฐ๋Šฅ์€ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

์ž์‹ ํด๋ž˜์Šค๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ํ™•์žฅ ๋ฒ„์ „์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ชจ ํด๋ž˜์Šค ๋ณ€์ˆ˜๋กœ๋Š” ์ž์‹ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœ ํ˜•๋ณ€ํ™˜(Type casting)์ด๋‹ค. C#์—์„œ๋Š” is์™€ as๋ผ๋Š” ๋ฉ‹์ง„ ํ˜•๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

 

 

is ์—ฐ์‚ฐ์ž

 

๊ฐ์ฒด๊ฐ€ ํ•ด๋‹น ํ˜•์‹์— ํ•ด๋‹นํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•˜์—ฌ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ bool ๊ฐ’์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

Monster monster = new Slime();
Slime slime;

if(monster is Slime)
{
    slime = (Slime)monster;
    slime.LiquidAttack();
}

 

 

as ์—ฐ์‚ฐ์ž

 

ํ˜•์‹ ๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž์™€ ๊ฐ™์€ ์—ญํ• ์„ ํ•˜๋‚˜, ๋ณ€ํ™˜ ์‹คํŒจ ์‹œ ์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ํ˜•์‹ ๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž์™€ ๋‹ฌ๋ฆฌ as ์—ฐ์‚ฐ์ž๋Š” ๊ฐ์ฒด ์ฐธ์กฐ๋ฅผ null๋กœ ๋งŒ๋“ ๋‹ค. ์–ด๋ ต๊ฒŒ ๋งํ–ˆ์ง€๋งŒ, ํ˜•๋ณ€ํ™˜์— ์„ฑ๊ณตํ•˜๋ฉด ๊ทธ ํƒ€์ž…์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๊ณ , ์‹คํŒจํ•˜๋ฉด null์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๋ง์ด๋‹ค.

Monster monster = new Bubbling();
Bubbling bubbling = monster as Bubbling;

bubbling?.TailAttack();

 

์ผ๋ฐ˜์ ์œผ๋กœ (Slime) ๊ณผ ๊ฐ™์€ ๊ผด๋กœ ํ˜•๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ ๋Œ€์‹  as ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. ํ˜•๋ณ€ํ™˜์— ์‹คํŒจํ•˜๋”๋ผ๋„ ์˜ˆ์™ธ๊ฐ€ ์ผ์–ด๋‚˜ ๊ฐ‘์ž๊ธฐ ์ฝ”๋“œ์˜ ์‹คํ–‰์ด ์ ํ”„๋˜๋Š” ์ผ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ๋”์šฑ ์ˆ˜์›”ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

๋‹จ, as ์—ฐ์‚ฐ์ž๋Š” ์ฐธ์กฐ ํ˜•์‹์— ๋Œ€ํ•ด์„œ๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๊ฐ’ ํ˜•์‹์˜ ๊ฐ์ฒด๋Š” ๊ธฐ์กด ํ˜•๋ณ€ํ™˜ ๋ฐฉ์‹๋Œ€๋กœ ํ•ด์•ผ ํ•œ๋‹ค.

 

 

728x90
๋ฐ˜์‘ํ˜•