오늘은 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("소유한 아이템이 아닙니다.");
}
}
}
개선 전 코드의 문제점
- 불필요한 인덱스 검증 (itemIndex 범위 체크)
기존 코드에서는 itemIndex가 equipItemList의 범위를 벗어나지 않는지 검사하는 코드가 존재하였으나, 메서드를 호출하는 시점에서 이미 유효한 인덱스라는 가정이 가능하다면 이러한 체크는 불필요하다. - 중복된 isEquipped 상태 체크
기존 코드에서는 isEquipped 상태를 별도로 저장하고 조건문에서 여러 번 사용하였다. 하지만 최적화된 코드에서는 단순히 if (!item.IsEquiped) 조건을 사용하여 불필요한 변수를 줄였다. - 같은 타입의 아이템이 이미 장착되어 있는지 확인하는 로직 개선
기존 코드에서는 isTypeEquipped 변수를 사용하여 foreach 문 안에서 플래그를 설정하고 이를 다시 확인하는 방식이었다. 최적화된 코드에서는 foreach 문 내에서 바로 return하여 불필요한 변수를 줄였다. - 장착 해제 로직의 비효율성
기존 코드에서는 장착 해제 시 foreach 문을 순회하며 isEquippedList에서 해당 아이템을 찾았으나, 이는 List<T>의 Remove() 메서드를 사용하면 단순화할 수 있다. - 체력 및 마나 초기화 코드 중복 제거
기존 코드에서는 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;
}
최적화된 코드의 장점
- 가독성 향상
중복된 bool 변수를 제거하고 if 문을 단순화하여 코드를 더 읽기 쉽게 변경하였다. - 성능 최적화
foreach 루프 내부에서 return을 추가하여 불필요한 연산을 줄였다.
또한 List<T>의 Remove() 메서드를 활용하여 특정 아이템을 찾고 제거하는 과정을 단순화하였다. - 중복 코드 제거
체력 및 마나 변경 로직을 코드 블록의 마지막에 한 번만 실행하도록 하여 유지보수성을 높였다.
배운 점
- 불필요한 변수를 줄이면 가독성과 성능이 개선된다.
- 조건문 내에서 바로 return을 하면 불필요한 bool 체크를 없앨 수 있다.
- 리스트에서 특정 요소를 제거할 때 Remove()를 활용하면 foreach 없이 바로 삭제할 수 있다.
- 반복되는 코드(예: 체력 및 마나 초기화)는 한 곳에서 실행하는 것이 좋다.
이번 최적화를 통해 더 짧고, 더 빠르고, 더 유지보수하기 쉬운 코드를 만들 수 있었다.