ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2024.1.3
    TIL 2024. 1. 3. 20:57

    어제는 강의 듣다가 함수 빼보고 클래스 만들고 뒤엎고 했습니다.

    튜터님께 정말 죄송하게도.. 퇴근하시기 2분 전에 가게 되어서.. 정말 죄송합니다 ㅠㅠ

    그래서 오늘은 이럴꺼면 빨리가서 물어보는게 낫다 생각이 들어서 어제 마무리 작업하다가 계속 안되던 것을 질문하러 바로 갔습니다.

    제가 생각했던 것과 다르게 진행되는게 맞았습니다.

    글로 잘 설명할 수 있을지는 모르겠지만 우선 잊기 전에 정리해보겠습니다.


     

    개인과제

    static void Main(string[] args)
    {
        Menu menu = new Menu();
        State state = new State();
        Inventory inventory = new Inventory();
        Store store = new Store();
        ItemList itemList = new ItemList();
    
        //서로 연결시켜주기
        menu.getClass(state, inventory, store);
        inventory.getClass(itemList, state);
        store.getClass(state, itemList);
    }

    다 묶어버림.

     

    필수사항

    1. 게임 시작 화면 : 어제와 크게 다를 것 없이 완성. 추가적으로는 다른 클래스 받기 위해서 getClass 추가.

    2. 상태보기 : 얘 때문에 클래스끼리 연결했다고 볼 수 있음. 클래스 내부 내용은 어제와 크게 다를 것 없이 완성. 단, 다른 클래스에서 나오는 변경할 부분들 때문에 new State()를 다른 클래스 내에서 사용 불가.

    3. 인벤토리

    3-1. 장착 관리

    itemlist.sellitems[i].name = "[E]" + itemlist.sellitems[i].name;
    
    if (itemlist.sellitems[i].name.Contains("갑옷") || itemlist.sellitems[i].name.Contains("망토"))
    {
        state.PlusDepence = itemlist.sellitems[i].stats;
        state.Depence += state.PlusDepence;
        state.checkDepence = true;
    }
    else
    {
        state.PlusStrike = itemlist.sellitems[i].stats;
        state.Strike += state.PlusStrike;
        state.checkStrike = true;
    }

    Contain() 함수를 이용해서 방어력과 공격력 올리는 부분을 나눴음.

    단, 한글을 검색할 때 4글자 이상이면 안됨.

    내일은 추가적인 부분으로 [E]가 있으면 해제하는 것 추가할 예정. 현재 벗기는거 불가.

     

    4. 상점 : 상점보다는 상점 아이템 만드는게 하이라이트..

    class Item
    {
        State state = new State();
        
        Random random1 = new Random();
    
        public string name="";
        public int stats=0;
        public string gold="";
        public string comment="";
    }
    
    class ItemList
    {
        public Item[] items;
    }

    지금 봤는데 Item에.. new State가 있.. 에휴..

    이전에 만든 Item의 경우 필드에 있는 요소들이 다 배열로 구성되어 있었는데 튜터님이 보신 결과 Item보다는 ItemList 즉, 여러 개의 Items 이므로 Item 한 개를 만들기 위해서는 배열을 빼야한다고 하셨다. 또한 한 개씩 만들 때 아이템을 관리하기 편하다고 하셨는데 이렇게 만들고 계속 다른 기능 추가하다가 아이템 구매 시 인벤토리에 넣는 것과 아이템 판매하는 것이 매우 편해졌다고 느껴졌다.

     

    Class Item은 이름, 스텟, 골드, 설명을 한번에 만들고 Class ItemList에서는 Item을 여러 개를 만들 수 있도록 설정해두었다.

    여기서, 좀 더 생각해보면 ItemList에 Item을 종속시키면 편하지 않을까 라고 생각이 들기는 한다.

    근데, 내가 생각할 때 종속을 하는 이유는 부모 클래스를 확장시켜서 한다던가, 자식 클래스가 부모 클래스에서 사용하는 것이 많고 부모 클래스는 자식 클래스에게 바라는게 없다면 사용하는 것이 맞지 않을까 생각한다.

    왜냐하면 부모 클래스가 자식 클래스의 내용이 필요해서 가져오게 되면 OverFlow가 생긴다.

    자식 클래스는 부모 클래스를 선언하지 않고 그냥 가져올 수 있지만, 부모 클래스는 자식 클래스를 선언해야 한다. 이 과정에서 OverFlow가 발생할 수 있다.

    그렇다면 서로 필요하다면 종속되지 않고 서로 선언해주면 되는 것 아닌가? 싶지만 이것도 OverFlow가 발생한다.

    A 클래스에서 new B를하면 시스템이 B 클래스로 이동하는데 B 클래스 안에서도 new A가 있기 때문에 다시 A로 가고 이걸 반복하는 것이다.

    그래서 고민한 결과! 그냥 한 개씩 선언하고 외부에서 끌어오자! 그래서 위에 묶어버린 이유다.

     

    잘 가고 있는게 맞는지 튜터님께 문의한 결과 :

    이렇게 할 경우 클래스끼리 서로 강하게 연결되어있게 된다.

    즉, 객체 지향프로그램의 특징인 캡슐화 : 관련된 데이터를 하나의 단위로 묶어서 안정성을 높이는 것이 약해지게 된다.

    그래서 연결을 하는 것은 맞지만 약하게 연결을 해야한다가 키 포인트가 될 것 같다.

    ClassChain chain = new ClassChain();
    
    Menu menu = chain.getMenu();
    State state = chain.getState();
    Inventory inventory = chain.getInventory();
    Store store = chain.getStore();
    ItemList itemList = chain.getItemList();
    
    class ClassChain
    {
        Menu menu = new Menu();
        State state = new State();
        Inventory inventory = new Inventory();
        Store store = new Store();
        ItemList itemList = new ItemList();
    }

    강하게 연결된 부분을 약하게 하기 위해서 한개의 클래스를 만드는 것을 해결방법으로 제시해주셨다.

    근데 말씀하신게 이게 맞는지 모르겠다.

    한다리 건너 만든 건 맞는데.. 저렇게 get으로 클래스들 정의한 다음에 다른 클래스들이 만들어진 클래스 쓸 수 있게 만든 getClass에 그냥 넣었는데 맞나..?
    우선 다른 방법이 있는지 좀 더 고민해보고 맞는지 여쭤보러 가봐야할 것 같다.

     

    선택사항

     

    1. 아이템 정보를 클래스 / 구조체로 활용해보기 : Class Item, Class ItemList를 이용해서 관리 중

    2. 아이템 정보를 배열로 관리하기 : Class ItemList에서 Item[]을 이용해서 관리 중

    3. 아이템 추가하기 : Store에서 판매할 수 있게 Make함수 사용.

    3-1. 나만의 새로운 아이템을 추가하기 : 플레이어가 따로 추가가 가능하게 만든다는 것인지 잘 모르겠음. 이건 아직도 모르겠음.

    4. 아이템 판매하기 : 추가 완료인 줄 알았으나 지금 큰 오류 발견.. ㅠ

     

    수정사항

    Item sellitem = new Item();
    sellitem.name = itemlist.items[selectItem - 1].name;
    sellitem.stats = itemlist.items[selectItem - 1].stats;
    sellitem.comment = itemlist.items[selectItem - 1].comment;
    sellitem.goldInt = itemlist.items[selectItem - 1].goldInt;
    itemlist.items[selectItem - 1].gold = "구매완료";
    itemlist.Sellitem(sellitem);
    
    public void Sellitem(Item item)
    {
        int i = 0;
        while (true)
        {
            if (sellitems[i]==null)
            {
                sellitems[i] = item;
                sellitemsGold[i] = item.goldInt * 85;
                sellitemsGold[i] = sellitemsGold[i] / 100;
                break;
            }
            else
            {
                i++;
            }
        }
    }
    
    public void InventoryItemSellList()
    {
        int itemLength = sellitems.Length;
        for (int i = 0; i < itemLength; i++)
        {
            else if (sellitems[i].name.Contains("갑옷") || sellitems[i].name.Contains("망토"))
            {
                sellitems[i].gold = (sellitemsGold[i] + "G").ToString();
            }
        }
    }

    우선 오류는 두가지로

    첫번째는 상점에서 아이템 판매창과 상점창을 왔다갔다 했을 때 판매 금액이 줄어드는 것.

    이건 판매창에서 기존 골드 가격을 받아서 0.85를 계산해서 다시 골드에 넣었기 때문에일어난 것으로 기존에 만들어둔 배열을 이용하려고 했으나 왜인지 계속 안되서 새로운 배열을 생성. 근데 이 이유가 두번째 오류랑 연관이 있어보임.

    두번째 오류는 구매완료로 바꿨는데 판매창에서 다시 상점창으로 이동 시 구매완료가 없어지고 0.85로 계산된 골드가 등장.

    items 객체를 구매완료로 수정 후 계속 건들지 않았는데 구매완료가 사라져서 정말 머리가 아팠다.

    왜 도대체 왜!! 그런가 했더니 그 이유는 Sellitem 함수에 있었다.

    Sellitem 함수에서 매개변수 item을 받아서 이것을 sellitems에 넣었는데 이게 같은 객체의 Item을 sellitems와 items가 공유하고 있었다. 따라서 items가 변경하지 않더라도 sellitems에서 변경하게 되면 같이 변경되는 것이였다.

    그래서 해결 방법은 새로운 객체를 만들어서 판매된 Item의 정보를 받아서 그것을 sellitems에 연결하는 것이다.

    그래서 Item sellitem을 만들어서 해결해주었다.

    내가 이겼어! 내가 이겼어!내가 이겼어!내가 이겼어!내가 이겼어!

     

    5. 장착 개선 : 내일 추가 예정

    6. 던전입장 기능 추가 : 내일 추가 예정

    7. 휴식기능 추가 : 내일 추가 예정

    8. 레벨업 기능 추가 : 던전 입장 만들어지고 나면 시간이 될지 모르겠지만 우선 추가 예정

    9. 게임 저장하기 추가 : 이건 추가할 수 있을지 모르겠음.


     

    Class

    부모 클래스에 있는 변수를 자식 클래스가 사용이 가능함.

    단, 사용한 변수에 값은 부모 클래스로 올라가지 않음.

    abstract class Item
    {
        public string[] name = new string[6];
        public int[] stats = new int[6];
        public string[] gold = new string[6];
        public string[] comment = new string[6];
        
        public abstract void Make();
    }

    그래서 추상 클래스로 부모 클래스 Item을 만들어서 ItemName 함수에서 만드는 변수 name 값이 Item에 있는 name으로 들어갈 것이다라고 생각했지만 크나큰 오류였다.

    또한, ItemName의 부모 클래스 Item과 ItemStats의 부모 클래스 Item이 같다고 생각을 했었기 때문에 class 안 코드를 작성하게 되었는데 두 Item은 이름만 같을 뿐 서로 다른 클래스이기 때문에 어찌되었던 ItemStats의 name은 ItemName이 생성한 name과 다르다.

    그래서 class의 필드에 있는 요소들을 하나씩 정리해서 합치는 것이 아니라 필드를 한 번에 만드는 것만 가능하다.

    그래서 한 일은 Item의 자녀 클래스에 있던 내용을 Item으로 가져와서 만드는 것이였다.

     

    Item을 만들어서 관리하기 위해서 배열을 사용했다.

    이렇게 되면 Item은 총 6개의 아이템을 한 번에 관리하게 되는 것이다.

    Class Item은 상점에서 나오는 아이템 뿐만 아니라 인벤토리에 들어가는 아이템들, 이후 던전을 만들게 되면 드랍되는 아이템들을 관리하기 위해서 만들었기 때문에 현재 Item 클래스는 나의 의도에 적합하지 않다.

    그리고 튜터님께서도 배열을 사용하게 되면 아이템 한개씩 관리가 어렵고, Item보다는 ItemList에 더 적합하다고도 말씀해주셨다.

    그렇다면 해야할 것은 배열을 지우는 것이다.

    배열을 지우게 되면 한개의 아이템만이 생성이 된다. 그러면 보다 수월하게 아이템 관리가 가능할 것이며 아이템 생성 갯수를 조절하는 것이 수월할 것이다.

    한개씩 만든 아이템은 Class ItemList를 만들어서 합쳐주면 된다.

     


     

    과제 제출일자는 금요일까지입니다. 내일은 계속 완성해야하니 하다가 또 새로운 제 생각과 다른 점이 있다면 추가적으로 적겠지만 그렇지는 않을거 같다는 생각이 듭니다.

    그냥 제 생각대로 작동햇으면 좋겠네요 ㅠㅠ

    'TIL' 카테고리의 다른 글

    2024.1.5  (0) 2024.01.05
    2023.1.4  (2) 2024.01.04
    2024.1.2-class  (1) 2024.01.02
    2023.12.29 - 주석 단축키, 조건문, 배열, 컬렉션  (1) 2023.12.29
    2023.12.28  (0) 2023.12.28
Designed by Tistory.