작성
·
41
·
수정됨
0
강사님이 타이핑해주신 SetArmour함수에 궁금한 부분이 있어 질문합니다. PickupItem destory로 처리한 후 ArmourMap[ArmourType] = NewArmour;로 처리해주셨는데. 따로 Remove를 추가 안 하신 이유가 궁금합니다. 만약 이 흐름으로 진행된다면 59번 줄에서 false처리로 되어 큰 영향은 없어 보이지만 조금 의문이 들어 문의 남깁니다.
답변 3
0
0
안녕하세요!
첨부해주신 스크린샷을 보고 설명드리면, 해당 코드는 ArmourMap에서 같은 부위의 방어구가 있는지 확인합니다.
있을 경우:
PickupItem으로 만들어서 바닥에 떨어뜨리고, ArmourMap의 해당 key(슬롯)에 있는 방어구를 NewArmour로 교체합니다
없을 경우:
ArmourMap에 해당 방어구 타입에 대한 key/value가 존재하지 않기 때문에 ArmourMap.Add(ArmourType, NewArmour)로 새로운 key을 생성하여 NewArmour를 할당합니다
질문해주신 내용을 쉽게 설명드리자면, 기존에 같은 슬롯에 다른 방어구가 있는 상황에서 굳이 슬롯을 삭제했다가 다시 생성해서 NewArmour를 복사할 필요는 없습니다.
이미 존재하는 슬롯의 값만 변경하는 것(ArmourMap[ArmourType] = NewArmour)이 Remove() 후 Add()를 사용하는 것보다 성능상 더 효율적입니다.
void UDS1CombatComponent::SetArmour(ADS1Armour* NewArmour)
{
const EDS1ArmourType ArmourType = NewArmour->GetArmourType();
// 이미 같은 부위에 장착된 방어구가 있으면 PickupItem으로 떨군다.
if (ADS1Armour* EquippedArmourPart = GetArmour(ArmourType))
{
if (IsValid(EquippedArmourPart))
{
...
// 픽업 아이템 생성
}
ArmourMap[ArmourType] = NewArmour;
}
else
{
ArmourMap.Add(ArmourType, NewArmour);
}
}
그리고 if (ADS1Armour* EquippedArmourPart = GetArmour(ArmourType)) 구문에 의해서 해당 방어구타입에 대한 key(슬롯)가 존재한다는 것이 보장되기 때문에
ArmourMap[ArmourType] = NewArmour 구문은 안전합니다.
그럼 좋은 하루 되세요~
0
안녕하세요, 인프런 AI 인턴입니다. seo_0915님.
질문해주신 SetArmour
함수의 동작과 관련하여, ArmourMap
에서 특정 방어구를 제거하지 않는 이유에 대한 궁금증을 가지고 계신 것 같습니다. 이러한 상황은 일반적으로 현재 착용 중인 방어구를 다른 방어구로 교체할 때 자동으로 처리가 되기 때문입니다.
ArmourMap[ArmourType] = NewArmour
: 이 부분은 새로운 방어구를 추가하거나 교체하는 역할을 합니다. 기존의 방어구가 맵에 남아있는 것이 아니라, 맵의 해당 위치에 새로운 방어구가 덮어씌워지게 됩니다.
Remove
호출 필요성 부재: 대부분의 경우, Remove
함수는 특정 조건 하에 아이템을 회수 또는 제거할 수 있도록 구현됩니다. 그러나, 방어구 같은 경우, 기존의 것을 새 것으로 덮어쓰는 방식으로 처리되기 때문에 별도의 삭제가 필요하지 않을 수 있습니다.
이러한 설계는 작성하신 코드의 논리 흐름에서 존재하는 메커니즘에 따르는 것이며, false
처리 여부가 작동에 직접적인 영향을 미치지 않는 경우가 많습니다. 다만, 장기적으로 시스템의 안정성과 관리 효율성을 고려하여 메모리 관리 측면을 살펴보는 것이 좋습니다.
관련된 구현 방법이나 예제 코드 개편의 필요성을 느끼시면, 다른 유사한 질문 및 답변을 참조하실 수도 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.