13일차 데일리 과제

IIRU·2026년 6월 2일

과제내용

  1. 어제 작성한 상속 클래스를 추상클래스로 변경해 봅시다. (abstract)
  2. 자식클래스에서 추상클래스를 override하여 구현해보기 (abstract, override)
  3. 2개 이상의 자식클래스를 구현하고, 부모클래스 배열에 자식클래스 업캐스팅하여 저장하기 (is, as)
  4. 다형성을 직접 구현해서 실행해보기

program.cs

using _260602_2;
using System;
using System.Drawing;

class Program()
{
    static void Main()
    {
        Monster slime = new Slime("Slime", 10, 1);
        Monster goblin = new Goblin("Goblin", 20, 2);

        Monster[] monsters = new Monster[3];
        monsters[0] = slime;
        monsters[1] = goblin;

        //슬라임이 공격
        monsters[0].Attack(monsters[1]);

        //고블린이 공격
        monsters[1].Attack(monsters[0]);


        monsters[0].PrintStatus();
        Console.WriteLine("---------------------");
        monsters[1].PrintStatus();
        Console.WriteLine("---------------------");
        
        //Monster dragon = new Dragon("Dragon", 100, 50);
        
        //다운캐스팅 성공
        if(monsters[0] is Slime s1)
        {
            monsters[0].PrintStatus();
        }
        else
        {
            Console.WriteLine("다운캐스팅 실패!");
        }

        //다운캐스팅 실패
        if (monsters[1] is Slime s2)
        {
            monsters[0].PrintStatus();
        }
        else
        {
            Console.WriteLine("다운캐스팅 실패!");
        }

        Console.WriteLine("---------------------");
        //slime이 Monster라면 m1에 대입.
        Monster m1 = slime as Monster;
        m1.PrintStatus();
    }


}

Monster.cs

using System;

namespace _260602_2
{
    internal abstract class Monster
    {
        protected string name = "";
        public string Name { get { return name; } set { name = value; } }

        protected int hp;
        public int Hp { get { return hp; } set { hp = value; } }

        protected int damage;
        public int Damage { get { return damage; } set { damage = value; } }

        public Monster(string _name, int _hp, int _damage)
        {
            this.name = _name;
            this.hp = _hp;
            this.damage = _damage;
        }

        public void SetHp(int _hp)
        {
            hp = _hp;
        }
        public abstract void Attack(Monster monster);

        public virtual void PrintStatus()
        {
            Console.WriteLine($"NAME : {name}");
            Console.WriteLine($"HP : {hp}");
            Console.WriteLine($"DAMAGE : {damage}");
        }

        public virtual void TakeDamage(int _damage)
        {
            int heal = hp - _damage;
            SetHp(heal);
        }

    }
}

Goblin.cs

using _260602_2;
using System;
using System.Xml.Linq;
using static System.Net.Mime.MediaTypeNames;

namespace _260602_2
{
    internal class Goblin : Monster
    {
        static private int maxHp;

        public Goblin(string _name, int _hp, int _damage) : base(_name, _hp, _damage)
        {
            name = _name;
            hp = _hp;
            damage = _damage;
            maxHp = _hp;
        }
        public override void Attack(Monster monster)
        {
            Console.WriteLine($"고블린의 공격 : {damage}");
            monster.TakeDamage(damage);
        }
        public override void PrintStatus()
        {
            base.PrintStatus();
            Console.WriteLine($"MaxHp :{maxHp}");
        }

    }
}

Slime.cs

using _260602_2;
using System;
using System.Xml.Linq;
using static System.Net.Mime.MediaTypeNames;

namespace _260602_2
{
    internal class Slime : Monster
    {
        static private int maxHp;
        public Slime(string _name, int _hp, int _damage) : base(_name, _hp, _damage)
        {
            name = _name;
            hp = _hp;
            damage = _damage;
            maxHp = _hp;
        }

        public override void Attack(Monster monster)
        {
            Console.WriteLine($"슬라임의 공격 : {damage}");
            monster.TakeDamage(damage);
        }

        public override void PrintStatus()
        {
            base.PrintStatus();
            Console.WriteLine($"MaxHp :{maxHp}");
        }

    }
}

Monster 클래스는 abstract로 구현.

Monster 클래스 안의 Attack을 abstract로 구현.

override를 활용해서 Slime과 Gobline 구현.

메인함수에 Monster배열을 선언하여

Monster[] 안에 제대로 업캐스팅하여 값이 들어갔는지 확인.

is , as 다운캐스팅 되는지 확인.

profile
초보 개발자 블로그입니다!

0개의 댓글