티스토리 뷰
🟩 오늘의 목표
- 상점 시스템의 품절(Sold Out) 처리 방식을 개선하여 데이터 안정성을 확보한다.
- 클래스 상속 구조에서 부모 생성자 연쇄 호출과 다형성 원리를 심화 적용한다.
- 런타임 및 링킹 오류 등 빈번히 발생하는 디버깅 사례를 분석하고 해결한다.
- 39개의 프로젝트 파일을 유기적으로 관리하기 위한 방어적 프로그래밍 기법을 다진다.
🟧 1. 상점 시스템: 데이터 안정성 및 UX 개선
🟦 품절(Sold Out) 시스템 도입
기존에는 아이템 구매 시 vector::erase를 사용해 데이터를 물리적으로 삭제했으나, 이로 인해 인덱스가 앞당겨지면서 뒤쪽 번호 입력 시 '인덱스 참조 범위 초과' 오류가 발생하는 문제를 확인했다. 이를 해결하기 위해 ShopItem 구조체에 IsSoldOut 플래그를 추가했다. 데이터를 삭제하는 대신 상태값만 변경함으로써 인덱스를 고정하고 안정성을 확보했다. 이를 통해 데이터를 삭제하는 것보다 '상태(State)'를 관리하는 것이 데이터 일관성 면에서 훨씬 유리함을 학습했다.
🟦 리롤(Reroll) 기능 및 UI 동기화
골드를 소모하여 진열대 아이템을 무작위로 갱신하는 로직을 구현했다. 리롤 후 골드 차감이 화면에 즉시 반영되지 않던 버그를 해결하기 위해 UIHelper::UpdateStatus를 명시적으로 호출하여 데이터와 UI를 동기화했다. 또한 상점 재입장 시마다 목록이 바뀌지 않도록 CurrentStock.empty() 조건을 추가하여 리롤을 통해서만 목록이 갱신되도록 기획 의도를 반영했다.
🟧 2. 객체지향 프로그래밍(OOP) 심화 적용
🟦 부모 생성자 연쇄 호출
모든 몬스터가 플레이어 정보를 참조할 수 있도록 부모 클래스인 Monster 생성자에 Player* 인자를 추가하고 이를 멤버 변수 player_에 저장하도록 설계했다. Goblin, BossMonster 등 자식 클래스에서 부모 클래스의 생성자를 명시적으로 호출하도록 수정하여 C2512 및 C2665 컴파일 오류를 해결했다.
🟦 다형성(Polymorphism) 활용
Monster의 가상 함수(MonsterATK, TakeDamage, InitRandom)를 자식 클래스에서 각각 오버라이드했다. 동일한 인터페이스를 통해 다양한 몬스터의 동작을 다르게 구현함으로써 객체지향의 핵심인 다형성을 실무에 적용했다.
🟧 3. 주요 디버깅 및 예외 처리 사례
🟦 런타임 및 링킹 오류 해결
ItemDatabase에서 존재하지 않는 데이터를 std::map::at()으로 호출할 때 발생하는 std::out_of_range 오류를 방어하기 위해 find() 함수를 사용하는 로직을 도입했다. 또한 헤더에 선언만 하고 구현부를 작성하지 않아 발생한 LNK2019 오류는 Player.cpp에 실제 로직을 구현하여 해결했다.
🟦 전방 선언과 컴파일 오류
전방 선언만 된 클래스의 멤버 함수를 사용할 때 발생하는 C2027 오류를 해당 헤더파일 포함(include)을 통해 해결했다. 함수 인자 타입 불일치 문제는 적절한 타입 캐스팅과 설계 변경을 통해 데이터 흐름을 맞췄다.
🟫 오늘 느낀 점
물리적인 데이터 삭제보다 상태 관리가 시스템의 안정성을 얼마나 높여주는지 깊이 이해하게 되었으며, 복잡한 상속 구조일수록 생성자 호출 순서를 명확히 지켜야 함을 느꼈다.
'내일배움캠프 Unreal_7기 > 본캠프' 카테고리의 다른 글
| TIL - 29일차 (2) | 2026.01.08 |
|---|---|
| TIL - 28일차 (0) | 2026.01.07 |
| TIL - 26일차 (0) | 2026.01.05 |
| TIL - 25일차 (0) | 2026.01.02 |
| TIL - 24일차 (0) | 2025.12.31 |

