2024년 4월 30일 화요일 개발일지 / 팀 프로젝트 진행 상황과 클래스, 객체에 대해서

2024. 4. 30. 20:46나의 개발자 기록/본 캠프 개발 일지

2024년 4월 30일 화요일


팀 프로젝트 진행 상황

 

 

오늘은 9시부터 30분간 개인 공부를 하거나 본인이 해야 할 것이 있으면 준비하는 시간을 가졌습니다. 그다음 9시 30분에 어제 진행했던 내용들을 다시 확인해 보고, 기초 개인 과제 쪽의 추가 구현도 확인하면서 어떤 식으로 진행하면 좋을지에 대해서 이야기를 나눴습니다. 먼저 잘하시는 분 끼리는 좀 더 쪼개서 새로운 방향으로 길을 잡았고, 저와 다른 분은 추가 기능에 대해서 각자 만들어 보는 것으로 결정하게 됐습니다.

 

 

던전 입장 기능을 한 번 만들어보는 것인데, 단순 로직이 많다고는 하지만, 뭔가 생각한 대로 구현하기 힘든 부분이 많았습니다. 솔직히 이런 문제들을 많이 해보면서 익숙해져야 하는데, 뭔가 백지상태에서 지금까지 배웠던 내용들을 활용하는 부분이 많이 힘들었습니다. 현재 팀프로젝트에서 콜백함수를 사용해서 메뉴를 구성했는데, 아직 콜백함수가 뭔지 잘 모르는 것도 있고, 그냥 배웠던 것들의 응용 레벨이 현저하게 낮은 것 같습니다.

 

public string GetClearInfo(int index)
{
    StringBuilder sb = new StringBuilder();
    sb.AppendLine("축하합니다!!");
    sb.Append($"{DungeonList[index].Title} 던전을 클리어 하였습니다.");
    return sb.ToString();
}

public void Enter(Player player,int index)
{
    // Hp와 관련된 정의
    int defValve = player.Def - DungeonList[index].RecommendDef;
    int baseHpLoss = random.Next(20, 36);
    int hpLoss = baseHpLoss + defValve;

    // 보상과 관련된 정의
    int extraRewardPer = random.Next(player.Atk, player.Atk * 2 + 1);
    int extraReward = (int)(DungeonList[index].BasicReward * (extraRewardPer / 100.0f));
    int totalReward = DungeonList[index].BasicReward + extraReward;

    // 방어력으로 던전을 수행할 수 있을지 판단
    // 권장 방어력보다 낮다면
    if (player.Def < DungeonList[index].RecommendDef)
    {
        // 40% 확률로 던전 실패
        if (random.Next(1, 101) <= 40)
        {
            // 보상 없고, 체력 감소 절반
            player.Hp = player.Hp / 2;
        }
        else
        {

        }
    }
    // 권장 방어력 보다 높다면
    else
    {
        // 권장 방어력 +-에 따라 종료시 체력 소모 반영
        // 공격력으로 던전 클리어시 보상을 어느 정도 얻을지 계산됩니다.
        player.Hp -= hpLoss;
        player.Gold += totalReward;
    }
}

 

힌트를 듣고 어떻게든 몇 개는 구현을 하긴 했습니다만, 문제점이 데이터를 메뉴로 보내주는 데에 있어서 어떻게하면 좋을지 계속 생각도 해봤습니다. 그래도 답이 안 나와서 잘하시는 분께 부탁드려서 어떻게 하면 좋을지 물어봤고, 기존의 던전 구현은 실패하는 것과 성공하는 if문을 기준으로 만들면 된다고 하셨습니다.

 

 public string Enter(Player player,int index)
 {
     StringBuilder sb = new StringBuilder();
     // Hp와 관련된 정의
     
     if(player.CalculateDef < DungeonList[index].RecommendDef && random.Next(0, 10) < 4)
     {
         sb.AppendLine($"{DungeonList[index].Title}을 클리어하지 못했습니다.");
         sb.AppendLine("\n[탐험 결과]");
         sb.AppendLine($"체력 {player.Hp} -> {player.Hp / 2}");
         player.Hp /= 2;
     }
     else
     {
         int defValve = DungeonList[index].RecommendDef - player.CalculateDef;
         int baseHpLoss = random.Next(20 + defValve, 36 + defValve);
         int extraRewardPer = random.Next(player.CalculateAtk, player.CalculateAtk * 2);
         int extraReward = (int)(DungeonList[index].BasicReward * (extraRewardPer / 100.0f));
         int totalReward = DungeonList[index].BasicReward + extraReward;
         sb.AppendLine($"{DungeonList[index].Title}을 클리어하였습니다.");
         sb.AppendLine("\n[탐험 결과]");
         sb.AppendLine($"체력 {player.Hp} -> {player.Hp - baseHpLoss}");
         sb.AppendLine($"Gold {player.Gold} -> {player.Gold + totalReward}");
         player.Hp -= baseHpLoss;
         player.Gold += totalReward;
     }
     return sb.ToString();
 }

 

나중에 던전에 여러가지 추가 요소가 있겠지만, 개인 과제에 있던 내용들은 하나의 함수에 담아서 해결하면 되기 때문에 너무 어렵게 생각하지 말라고 하시더군요. 이 작업이 끝나고 GitHub에 Commit 후, PR을 진행했고, 그다음에는 이번에도 똑같이 휴식하기와 레벨업 기능을 각자 구현해 보는 방향으로 잡게 되었습니다. 휴식하기나 레벨업은 헷갈리기는 하지만 던전 기능보다는 어렵지 않았기 때문에 시간을 좀 투자하니 괜찮은 코드로 만들 수 있었습니다.


C# 체크리스트 Day6 클래스와 객체

 

 

어제는 C# 체크리스트 Day5 배열과 리스트에 대해서 이성언 튜터님께서 강의를 해주셨는데, 그 내용까지 쓴다면 너무 길어질 것 같고, C# 문법에 대해서는 전체적으로 저의 블로그에 다시 정리하면서 복습할 예정이기 때문에 굳이 쓰진 않았습니다. 하지만 오늘 강의해주신 클래스와 객체에 대해서는 좀 어려운 면이 없지 않아 있어서 복습할 겸 TIL에 내용을 정리해서 남겨볼까 합니다.

 

Class(클래스)란?

 

 

- 클래스는 객체를 생성하기 위한 템플릿 또는 설계도 역할을 한다.

- 클래스는 속성동작을 가진다.

- 속성은 필드로, 동작은 메서드로 표현된다.

- 객체를 생성하기 위해서는 클래스를 사용하여 인스턴스를 만들어야 한다.

- 예) 붕어빵틀로 비유하면, 클래스는 붕어빵을 만들기 위한 틀이라고 할 수 있다.

 

Object(객체)란?

 

- 객체는 클래스의 인스턴스이다. 클래스의 실체화된 형태라고 할 수 있다.

- 객체는 클래스로부터 생성되며, 각 객체는 독립적인 상태를 가지고 있다. 즉, 객체마다 고유한 데이터를 가질 수 있다.

- 붕어빵 틀로 비유하면, 객체는 붕어빵이라고 할 수 있다. 붕어빵 틀로 만들어진 실제 붕어빵이 객체라고 볼 수 있다.

 

값 형식과 참조 형식

 

메모리에는 코드 영역과 데이터 영역, 힙 영역, 스택 영역이 있고, "int num = 1;"의 경우 앞의 int num은 스택 공간에 호출되고, 할당 된 데이터는 스택 공간에 받아진다. 이를 값 형식 또는 값 타입이라고 불린다.

 

"Apple apple = new Apple();"의 경우 앞의 Apple apple은 스택 공간에 호출되고, 할당된 new Apple();은 힙 공간에 할당되는데, 이때 할당된 주소값을 Apple apple이 받는 것이 참조 형식이라고 불린다.

 

튜터님께서 설명해주신 예시

 

 

- 사과라는 클래스 안에 달콤함, 부드러움, 색깔, 품종 등등 있고, 이것을 객체화를 시킨다면 각각의 주소가 다른 객체가 만들어진다.

- 자전거라는 클래스에 안장, 바퀴, 핸들, 등등이 있고 이것을 객체화를 시킨다면 각각의 주소가 다른 객체가 만들어진다. 


앞으로 해야하는 것들

 

휴식 기능과 레벨업 기능

 

기초 개인 과제의 필수와 추가 구현의 대부분이 완성되었고, 각각의 내용들을 쪼개서 노션 페이지에다가 정리도 하고, 원래는 GitHub Desktop을 이용해서 Merge를 했었는데, 잘하시는 분이 PR(Pull Request)을 하는 게 좋다고 하셔서 저희는 PR로 진행을 하게 됐습니다. 그렇게 dev에다 각자 맡은 역할을 병합했고, 마지막으로 내일 할 것들에 대한 이야기를 하면서 각자 TIL을 작성했습니다.

 

일단 저 같은 경우에는 이번 조의 팀 중에서 C# 다루는 게 익숙하지 않았기 때문에 주말이나 본 캠프가 끝난 9시 이후에 개인 공부를 좀 더 해야 할 것 같습니다. 이번에 본 캠프를 계속하면서 느꼈던 점은 제가 아직 많이 부족하고, 배워야 할 것이 많다는 점과 소통하는 개발자가 되려면 여러 가지 면으로 소통을 자주 하고 모르는 것이 있으면 질문을 해야 되는데, 선뜻 그렇게 하지 못하는 게 문제라고 생각합니다. 그래서 팀 협업을 위해서 소통도 열심히 하고, 개인 공부도 열심히 해서 소통하는 개발자가 되도록 노력하겠습니다!