본문 바로가기

개발자_뉴비일지

주말TIL _03

1. InnerUserDataType

class Player
{
    //그 클래스가 자기만 쓰는 경우 안에 넣어둘 수도 있다.
    public enum PLAYERJOB
    {
        NOVICE,
        KNIGHT,
        FIGHTER,
        BERSERKER,
        FIREMAGE,
    }

    PLAYERJOB job= PLAYERJOB.NOVICE;

    //직업과 관련된 멤버변수도 있어야 할 것
    void ClassChange()
    {

    }
}

class Inven
{
    private int SelectIndex = 0;

    public void InnerClassTest()
    {
        InvenSlot NewInvenSlot = new InvenSlot();
        NewInvenSlot.Select(this);
    }

    public class InvenSlot
    {
        int Index;

        public void Select(Inven _inven)
        {
            _inven.SelectIndex = 100;
            //자신을 가지고, 클래스의 멤버변수를 마치 public처럼 사용할 수 있다.

            selectIndex = 100;
            //자기 클래스 내부에 있다고 해서 쓸 수 없음.
            //자기 클래스 내부에 있는 다른 클래스 일 뿐/
        }
    }
    //클래스 안에 넣어 놓는 장점
    //이름겹침에서 자유롭다.
    //하나의 클래스가 자신의 내부에서 모든걸 처리하려면 자신과 밀접히 관련된 것들은
    //자신 내부에 두는 것이 좋다.
    public enum INVENIR
    {
        ID_LEFT,
        ID_RIGHT,
        ID_UP,
        ID_DOWN,
    }

    void selectMove()//방향을 의미할 만한 인자값
    {

    }
}

namespace _35InnerUserDataType
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Player NewPlayer = new Player();
            Inven NewInven = new Inven();
            Inven.INVENIR IDIR = Inven.INVENIR.ID_LEFT;
        }
    }
}

 

2. Generic

//제네릭 함수->멤버함수에도 통용
//자료형을 변수처럼 사용하고 싶을 때
//함수의 식별자에 <다양한 자료형을 대표할 이름>
public static class GTest
{
    public static T ConsolePrint<T>(T _Value)
    {
        Console.WriteLine(_Value);
        return _Value;
    }

    public static T ConsolePrint<T, U>(T _Value, U _Value2)
    {
        Console.WriteLine(_Value);
        Console.WriteLine(_Value2);
        return _Value;
    }

    public static void ConsolePrint(string _Text)
    {
        Console.WriteLine(_Text);
    }

    public static void Test(int _number)
    {

    }
}

class CashItem
{

}

class GameItem
{

}

class Inven<T>
{
    T[] ArrInvenItem;

    public void ItemIn(T _item)
    {

    }
}

namespace _36Generic00
{
    internal class Program
    {
        static void Main(string[] args)
        {
            GTest.ConsolePrint(1000);//정수
            GTest.ConsolePrint(1.3265232);//실수
            GTest.ConsolePrint("하하하");//문자
            GTest.ConsolePrint("zzzz", 1234);

            //얘는 무조건 명시적으로<> 적어줘야함.
            Inven<GameItem> NewGameItemInven = new Inven<GameItem>();
            GameItem NewItem = new GameItem();
            NewGameItemInven.ItemIn(NewItem);
            //게임 아이템을 넣어주는 인벤

            Inven<CashItem> NewCashItemInven = new Inven<CashItem>();
            CashItem NewCashItem = new CashItem();
            NewCashItemInven.ItemIn(NewCashItem);
            //캐시아이템을 넣어주는 인벤
        }
    }
}

 

3. Referance

class Player
{
    public int HP = 100;
    public int AT = 10;

    public bool IsDeath()
    {
        Console.WriteLine("플레이어 죽음");
        return HP <= 0;
    }

    public void TestFunc(Player _Player)
    {
        TestFuncPart1(_Player);
    }

    public void TestFuncPart1(Player _Player)
    {
        TestFuncPart2(_Player);
    }

    public void TestFuncPart2(Player _Player)
    {
        _Player.AT = 20;
    }
}

namespace _37Referance01
{
    internal class Program
    {
        static void ArrTest(int[] _ArrTest)
        {
            _ArrTest[0] = 9999;
        }


        static void ClassTest(Player _Test)
        {
            Console.WriteLine("공격력 테스트를 해볼까요");
            _Test.AT = 10000;
        }

        static void Main(string[] args)
        {
            //Player NewPlayer는 어떤 녀석을 가리키는 일 밖에 하지 못한다.
            //new Player();
            Player NewPlayer = new Player();
            NewPlayer.AT = 50;

            NewPlayer.TestFunc(null);

            NewPlayer = new Player();//NewPlayer의 AT는? ->10
            //새로 만들어지면 그 전의 녀석은 지워짐

            Player NewPlayer2 = NewPlayer;
            //NewPlayer2를 수정하면 new Player();가 수정됨
            //같은애를 가리키고 있느냐 아니냐로 달라지는것. 이름이 다르다고 다른것이 아님.

            NewPlayer2.AT = 999;
            //NewPlayer2의 AT를 999로 마꾸면 NewPlayer의 AT도 999로 바뀜

            ClassTest(NewPlayer);//AT는 10000이 되어서 나옴

            
            int[] ArrNumber = new int[10] {0, 1, 2, 3, 4, 5, 6, 7, 8 ,9 };
            ArrTest(ArrNumber);//int[0]의 값은 9999
            //레퍼런스형이다.

            Player NewPlayer3 = null;
            NewPlayer3.IsDeath();
            //null인 녀석은 함수를 불러올 수 없는것을 디버깅을 통해 알아낼 것
        }
    }
}

 

++디버깅

 

4. List

class Item
{

}

class MyList<T>
{
    int[] Arr = new int[0];
    int Capa = 0;
    int Count = 0;

    public void Add(T _Add)
    {
        if (Count + 1 >= Capa)
        {

        }
    }
}

namespace List
{
    internal class Program
    {
        static void Main(string[] args)
        {
            //내가 관리해달라고 요청하는것이 매번 바귀는것
            //그러므로 제네릭 클래스여야 한다.
            List<Item> NewList = new List<Item>();

            
            List<int> NewList2 = new List<int>();
            NewList2.Add(1000);

            //자료 : 넣어준 int

            for(int i = 0; i < NewList2.Count; i++)
            {
                Console.WriteLine((NewList2.Count + 1).ToString() + " Add");
                Console.WriteLine("Capacity : " + NewList2.Capacity);//배열의 크기
                Console.WriteLine("Count : " + NewList2.Count);//자료의 크기
                NewList2.Add(i);
            }

            //인덱스로 표현할 수 있다면 가장 유리한 자료구조.
            //탐색에는 유리하지 않다.
            //내부에 자료가 있는지 없는지 
            if (NewList2.Contains(8))
            {
                Console.WriteLine("내부에 8이 있습니다.");
            }

            if (NewList2.Contains(999999))
            {
                Console.WriteLine("내부에 8이 있습니다.");
            }
            else
            {
                Console.WriteLine("999999이 없습니다.");
            }

            //인덱서 혹은 연산자, 겹지정
            Console.WriteLine(NewList2[5]);

            Console.WriteLine(NewList2[999]);
            //OutofRange
            //자료의 개수로 판단하지 배열의 크기는 중요하지 않다.

            int[] Arr = NewList2.ToArray();

            NewList2.Remove(10);//10이 있다면 지운다.
            NewList2.RemoveAt(1);//1을 지운다.
            //NewList2.RemoveAll ->다른 리스트 혹은 배열을 넣어줬을 때 비교해서 중복되면 지운다.
            NewList2.RemoveRange(1, 10);//1번재부터 10개 지워라.
        }
    }
}

 

5. Node

class Zone
{
    public string Name = "None";
    public List<Zone> LinkZone = new List<Zone>();

    public Zone Update()
    {
        while (true)
        {
            Console.Clear();

            Console.WriteLine("이곳은 " + Name + "입니다.");
            Console.WriteLine("이동할 수 있는 장소 리스트.");

            for(int i= 0; i<LinkZone.Count; i++)
            {
                Console.WriteLine((i + 1).ToString() + ". " + LinkZone[i].Name);
            }

            int number = (int)Console.ReadKey().Key;
            number -= 49;

            return LinkZone[number];
        }
    }

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


namespace NodeEX
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Zone NewZone0 = new Zone("태초마을");
            Zone NewZone1 = new Zone("초보사냥터");
            Zone NewZone2 = new Zone("중급사냥터");
            Zone NewZone3 = new Zone("중급마을");
            Zone NewZone4 = new Zone("고급사냥터");

            NewZone0.LinkZone.Add(NewZone1);
            NewZone0.LinkZone.Add(NewZone2);

            NewZone1.LinkZone.Add(NewZone3);
            NewZone1.LinkZone.Add(NewZone0);
            NewZone2.LinkZone.Add(NewZone3);

            NewZone3.LinkZone.Add(NewZone4);

            Zone startZone = NewZone0;

            while (true)
            {
                startZone = startZone.Update();
            }
        }
    }
}