본문 바로가기

개발자_뉴비일지

주말 TIL_02

1. Overloading_오버로딩

>>같은 이름의 Damage 함수인데 세종류가 있는 것을 볼 수 있다.

 

2. Overriding_오버라이딩

class FightUnit
{
    protected string Name = "None";
    protected int AT = 10;
    protected int HP = 100;

    //자식이 나의 GetAT를 구현했다면 자식 형태의 GetAT를 호출해라. -> 오버라이딩 / 다형성의 핵심 문법
    public virtual int GetAT()
    {
        return AT;
    }

    //프로퍼티도 virtual가능
    protected virtual int DMGAT
    {
        get
        {
            return AT;
        }
    }

    public void Damage(FightUnit _OtherFightUnit)
    {
        int AT = _OtherFightUnit.DMGAT;//각자만의 것이어야함.
        //함수 하나로 쓰고자 하는 목적에는 쓸 수 없음.
        //AT는 FightUnit의 것이기 때문.

        Console.WriteLine(_OtherFightUnit.Name + "에게" + GetAT() + "만큼의 데미지를 입었습니다.");

        HP -= AT;
    }
}

class Player : FightUnit
{
    int ItemAT = 5;

    //FightUnit의 GetAT보다 Player의 GetAT가 호출된다.
    //나는 부모님의 GetAT를 재구현했다.
    protected override int DMGAT
    {
        get
        {
            return AT + ItemAT;
            //Player의 GetAT는 ItemAT까지 더해진다.
        }
    }

    public Player(string _Name)
    {
        Name = _Name;
    }
}

class Monster : FightUnit
{
    int MonsterLv = 2;

    public override int GetAT()
    {
        return AT + MonsterLv;
    }

    public Monster(string _Name)
    {
        Name = _Name;
    }
}

namespace _30Overriding
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Player NewPlayer = new Player("플레이어"); //이름을 넣어주기로 했으니 넣어줘야함.
            Monster NewMonster = new Monster("몬스터");

            //NewPlayer.GetAT();
            NewPlayer.Damage(NewMonster);
            //상속받아서 Damage함수 사용 가능
            NewMonster.Damage(NewPlayer);
            //각자가 공격력을 산출하는 방식이 다른것이 문제.
        }
    }
}

 

3. Interface_인터페이스

//사용자 정의 자료형.
interface QuestUnit
{
    //int A =0; 멤버변수 x
    //함수의 형태만 물려줄 수 있는 문법
    void Talk(QuestUnit _OtherUnit);
    //함수의 정의만 내려놓는다.
    //private도 쓸 수 없음.
    void Event(QuestUnit _OtherUnit);
}

class FightUnit
{
    int AT;
    int DMG;

    public void Damage()
    {

    }
}

//인터페이스는 함수 구현을 강제할 수 있다.
//Talk와 Event를 구현해야 함.
class Player : FightUnit, QuestUnit
{
    public void Talk(QuestUnit _OtherUnit)
    {

    }

    public void Event(QuestUnit _OtherUnit)
    {

    }
}

class NPC : FightUnit, QuestUnit
{
    public void Talk(QuestUnit _OtherUnit)
    {

    }

    public void Event(QuestUnit _OtherUnit)
    {

    }
}

namespace _31Interfaace
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Player NewPlayer = new Player();
            NPC NewNPC = new NPC();

            QuestUnit NewQuestUnit = NewNPC;

            //업캐스팅이 된다.
            NewPlayer.Talk(NewNPC);
            NewNPC.Talk(NewPlayer);
        }
    }
}

 

4. Array_배열

class Item
{
    public string Name;
    public int AT;
    public int DF;
}

static void Main(string[] args)
{
    //배열은 기본자료형에 속한다.
    //ArrInt는 int의 배열형(int의 집합), int가 10개 생겼다.
    int[] ArrInt = new int[10];
    //여러개가 모여있고 연속되어 있다.

    Console.WriteLine(ArrInt[0]);
    //for문과 많이 사용된다.
    for (int i = 0; i < ArrInt.Length; i++)
    {
        Console.WriteLine(ArrInt[i]);
    }

    //클래스도 배열이 가능. 사용자 정의 자료형
    Item[] ArrItem = new Item[10];
    //아이템이라는 참조형을 담을 수 있는 공간이 10개 생겼다.
    //아이템이라는 메모리를 가리킬 수 있는 참조형이 10개 생겼다.
    //아이템 자체가 100개가 생긴것은 아님! Item NewItem = new Item();//->아이템이 생긴것.
    for (int i = 0; i < ArrItem.Length; i++)
    {
        ArrItem[i] = new Item();//->아이템이 10개 생긴것.
    }

    ArrItem[0].Name = "철검";
    ArrItem[1].Name = "전설의 검";
    ArrItem[2].Name = "갑옷";
    ArrItem[3].Name = "멋진 갑옷";
    ArrItem[4].Name = "포션";

    for (int i = 0; i < ArrItem.Length; i++)
    {
        Console.WriteLine(ArrItem[i].Name);
    }
}