์ด ๊ธ์ <์ด๊ฒ์ด 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 ์ฐ์ฐ์๋ ์ฐธ์กฐ ํ์์ ๋ํด์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ฏ๋ก ๊ฐ ํ์์ ๊ฐ์ฒด๋ ๊ธฐ์กด ํ๋ณํ ๋ฐฉ์๋๋ก ํด์ผ ํ๋ค.
'๐ฏ๏ธLanguage > C#' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C#] ์ค์ฒฉ ํด๋์ค(Nested Class)์ ๋ถํ ํด๋์ค(Partial Class) (2) | 2022.03.21 |
---|---|
[C#] const์ readonly ๋ ๋ค ์ฝ๊ธฐ ์ ์ฉ์ธ๋ฐ, ๋ญ๊ฐ ๋ค๋ฅผ๊น? (0) | 2022.03.21 |
[C#} new ์ sealed ํค์๋ (0) | 2022.03.21 |
[C#] ๋ถ๋ชจ ํด๋์ค๋ฅผ ๊ฐ๋ฆฌํค๋ Base ํค์๋์ ์์ฑ์ (0) | 2022.03.20 |
[C#] this( ) ์์ฑ์์ ์ ๊ทผ ํ์ ์(Access Modifier) (0) | 2022.03.18 |