"깊이"가 다른 게임개발자 허민영

유저에서 게임까지, 철학에서 코딩까지, 본질을 보는 게임개발

카테고리 없음

TIL 250213 팀 프로젝트 아이템 장착 메서드 최적화

허민영 2025. 2. 13. 23:24

오늘은 EquipEquipItem 메서드를 최적화하면서 불필요한 코드 제거, 성능 향상, 가독성 개선을 진행하였다. 기존 코드와 개선된 코드의 차이점을 정리했다.

 

기존코드

public void EquipEquipItem(ref int itemIndex)
{
  if (itemIndex >= 0 && itemIndex < equipItemList.Count)
  {
    EquipItem item = equipItemList[itemIndex];
    bool isEquipped = item.IsEquiped;
    if (isEquipped == false)
      {
        bool isTypeEquipped = false;
        foreach (var equippedItem in isEquippedList)
        {
          if (equippedItem.Type == item.Type)
            {
              isTypeEquipped = true;
              break;
            }
        }
        if (!isTypeEquipped)
        {
          item.IsEquiped = true;
          isEquippedList.Add(item);
          //int prevMaxHP = TotalMaxHP;
          HP = TotalMaxHP;
          //int prevMaxMP = MaxMP;
          MP = TotalMaxMP;
        }
        else
        {
          Console.WriteLine($"이미 {item.Type} 타입의 아이템이 장착되어 있습니다.");
        }
      }
      else
      {
        foreach (var equippedItem in isEquippedList)
          {
            if (equippedItem == item)
              {
                isEquippedList.Remove(equippedItem);
				item.IsEquiped = false;
				//int prevMaxHP = TotalMaxHP;
				HP = TotalMaxHP;
				//int prevMaxMP = MaxMP;
				MP = TotalMaxMP;
				break;
			  }
			}
		  }
		}
		else
		{
		  Console.WriteLine("소유한 아이템이 아닙니다.");
		}
	  }
    }

 

개선 전 코드의 문제점

  1. 불필요한 인덱스 검증 (itemIndex 범위 체크)
    기존 코드에서는 itemIndex가 equipItemList의 범위를 벗어나지 않는지 검사하는 코드가 존재하였으나, 메서드를 호출하는 시점에서 이미 유효한 인덱스라는 가정이 가능하다면 이러한 체크는 불필요하다.
  2. 중복된 isEquipped 상태 체크
    기존 코드에서는 isEquipped 상태를 별도로 저장하고 조건문에서 여러 번 사용하였다. 하지만 최적화된 코드에서는 단순히 if (!item.IsEquiped) 조건을 사용하여 불필요한 변수를 줄였다.
  3. 같은 타입의 아이템이 이미 장착되어 있는지 확인하는 로직 개선
    기존 코드에서는 isTypeEquipped 변수를 사용하여 foreach 문 안에서 플래그를 설정하고 이를 다시 확인하는 방식이었다. 최적화된 코드에서는 foreach 문 내에서 바로 return하여 불필요한 변수를 줄였다.
  4. 장착 해제 로직의 비효율성
    기존 코드에서는 장착 해제 시 foreach 문을 순회하며 isEquippedList에서 해당 아이템을 찾았으나, 이는 List<T>의 Remove() 메서드를 사용하면 단순화할 수 있다.
  5. 체력 및 마나 초기화 코드 중복 제거
    기존 코드에서는 HP = TotalMaxHP, MP = TotalMaxMP를 여러 번 호출하였으나, 이를 공통적인 위치에서 한 번만 호출하도록 수정하였다.

최적화된 코드

public void EquipEquipItem(int itemIndex) //아이템 장착 로직 구현
{
    EquipItem item = equipItemList[itemIndex];

    if (!item.IsEquiped) //아이템이 장착되지 않았다면
    {
        foreach (var equippedItem in isEquippedList)
        {
            if (equippedItem.Type == item.Type)
            {
                Console.WriteLine($"이미 {item.Type} 타입의 아이템이 장착되어 있습니다.");
                return;
            }
        }
        item.IsEquiped = true;
        isEquippedList.Add(item); 
    }
    else //장착 해제
    {
        item.IsEquiped = false;  // 장착 상태를 false로 변경
        isEquippedList.Remove(item); // 장착아이템리스트에서 제거
    }
    HP = TotalMaxHP;
    MP = TotalMaxMP;
}

최적화된 코드의 장점

  1. 가독성 향상
    중복된 bool 변수를 제거하고 if 문을 단순화하여 코드를 더 읽기 쉽게 변경하였다.
  2. 성능 최적화
    foreach 루프 내부에서 return을 추가하여 불필요한 연산을 줄였다.
    또한 List<T>의 Remove() 메서드를 활용하여 특정 아이템을 찾고 제거하는 과정을 단순화하였다.
  3. 중복 코드 제거
    체력 및 마나 변경 로직을 코드 블록의 마지막에 한 번만 실행하도록 하여 유지보수성을 높였다.

배운 점

  • 불필요한 변수를 줄이면 가독성과 성능이 개선된다.
  • 조건문 내에서 바로 return을 하면 불필요한 bool 체크를 없앨 수 있다.
  • 리스트에서 특정 요소를 제거할 때 Remove()를 활용하면 foreach 없이 바로 삭제할 수 있다.
  • 반복되는 코드(예: 체력 및 마나 초기화)는 한 곳에서 실행하는 것이 좋다.

이번 최적화를 통해 더 짧고, 더 빠르고, 더 유지보수하기 쉬운 코드를 만들 수 있었다.