메이플스토리월드 :: 인벤토리 구현 09

chooha·2026년 7월 28일

메이플스토리월드

목록 보기
9/15

📝 개발일지 - 정렬 후 자투리 수량이 맨 앞에 오던 문제

👨‍💻 오늘의 개발 작업

인벤토리 정렬(Sort) 버튼을 눌렀을 때 같은 아이템을 최대한 합치면서 재배치하도록 구현함. 기능 자체는 동작했지만, 실제 플레이 화면 스크린샷을 보니 같은 아이템 중 수량이 적은 자투리 슬롯이 맨 앞에 와 있는 걸 발견함


💡 오늘의 기록

1. 문제 상황 파악

파란 포션을 여러 번 사용/획득해 99, 99, 98개로 세 칸에 나뉜 상태에서 정렬 버튼을 눌렀더니, 정렬은 되는데 자투리(98개)가 있는 슬롯이 맨 앞 칸에 오고 꽉 찬 칸(99개)들이 그 뒤에 오는 걸 스크린샷으로 확인함. 기대한 건 꽉 찬 슬롯이 먼저 오고 자투리가 맨 뒤로 가는 것이었음

2. 원인이 된 코드

InventoryContainer.SortSlots가 병합 후 마지막에 한 번 더 정렬하는 비교 함수

table.sort(self.slots, function(a, b)
	if a.itemCnt <= 0 then return false end
	if b.itemCnt <= 0 then return true end
	return a.itemId < b.itemId
end)

3. 원인 분석

이 비교 함수는 itemId가 같으면 "동등하다"고만 판단함. 그런데 Lua의 table.sort는 불안정 정렬(unstable sort) 이라, 비교 함수가 "동등"하다고 판단한 원소들끼리는 원래 순서가 보장되지 않음. 그래서 같은 파란 포션이라도 99/99/98 세 슬롯 사이의 상대 순서는 정렬 전 배열 상태에 따라 우연히 결정되고 있었던 것 — 지금까지 자투리가 뒤로 갔던 건 우연이었을 뿐, 코드가 그렇게 보장하고 있던 게 아니었음

4. 해결

같은 아이템일 때 수량 내림차순이라는 2차 정렬 기준을 추가해, 비교 함수가 사실상 완전한 순서(total order)를 만들도록 수정함

local function CompareSlot(a, b)
	if a.itemCnt <= 0 then return false end
	if b.itemCnt <= 0 then return true end
	if a.itemId ~= b.itemId then
		return a.itemId < b.itemId
	end
	return a.itemCnt > b.itemCnt -- 같은 아이템이면 꽉 찬 슬롯이 앞, 자투리 수량은 뒤로 밀림
end

📚 성과와 개선 효과

  • ✅ 불안정 정렬의 함정 이해: "같다고 판단되는 원소가 있다"는 건 그 원소들 사이의 순서가 미정의라는 뜻이고, 결과를 예측 가능하게 하려면 비교 함수 자체가 사실상 모든 경우의 우선순위를 정해줘야 한다는 걸 체감함
  • ✅ 실제 사용자 화면(스크린샷) 기반 버그 발견: 로그나 콘솔이 아니라 실제 플레이 결과물을 눈으로 보고서야 잡아낸 버그라, 기능 구현 후 실제 화면으로 검증하는 과정의 중요성을 재확인함

0개의 댓글