[TIL] 2025-12-19 | 과제4 구현

2025. 12. 19. 21:12·내배캠Unreal_TIL/C++
게임 개발자를 위한 C++ 문법 과제 4

 

1. WHY

  • 지금까지 학습한 C++의 기본 개념과 프로그래밍 기술을 활용하여 실용적인 프로그램을 설계하고 구현

 

2. WHAT

  • 메모리나 문자열 등의 길이를 구할 때는 size_t를 사용
  • 들여쓰기 정리 단축키 ctrl+k+f
  • vec.empty() -> 비었는지 bool값 반환
  • 빈 벡터 반환 -> return {};
  • map.count(키) -> 키가 있으면 1 없으면 0 반환

 

3. HOW

실제 현업을 하다보면 처음부터 코드를 구현하는 상황보다는, 이미 누군가 구현한 코드를 파악하고
이를 수정하거나 기능을 추가해야 하는 경우가 많습니다.

아예 새로 코드를 구현하는 경우에는 본인의 스타일대로 구현하면 되므로 간단하지만,
기존의 코드를 분석하고 구조를 유지한 채로 기능을 수정하거나 추가하는 경우엔 고려할 게 많습니다.

이번 과제에서는 아래 3가지 정도는 항상 고려하면서 진행하는걸 권장 드립니다.
- 어떤 의도로 코드를 구현했는지
- 수정을 해야 한다면, 기존 코드의 수정을 최소화 하면서 수정할 수 있는 방안이 있는지
- 객체지향 프로그래밍 언어라면 SOLID 원칙을 잘 준수하고 있는지

이번에 해볼 과제는 다음과 같은 순서로 진행 됩니다.
- 제공된 연금술 공방의 물약 관리 프로그램 코드를 분석
- 제공된 코드를 활용해서 간단한 물약 이름 검색 기능을 추가한다.
- 물약 지급/공병 반환 기능(도전 기능)을 추가한다.

 

  • 물약 이름 검색 기능

처음에는 void로 해서 검색이 안될 때 해당 내용 출력하고 검색이 되면 검색된 레시피 출력하려고 했다.

근데 그러면 너무 의도와 벗어나는 것 같아 주어진 함수 형식을 최대한 유지하고자 했다.

반환 값이 포션레시피 객체라서 검색이 안될 때 어떤 값을 반환해야할지 몰랐다.

그래서 튜터님과 동료에게 물어보고 생성자로 빈 값을 반환하는 걸로 결정.~

기본 생성자를 추가했다. 그리고 빈 값인지 판별할 isValid()와 레시피를 출력할 displayRecipe()를 구현했다.

 

  • 물약 재료 검색 기능

반환 값을 새로운 workshop에 넣을까 했지만...

그러면 클래스의 용도와 벗어난거 같아서 그냥 따로 벡터에 저장해서 해당되는 결과를 출력했다.

 

 

필수기능 다하고 도전 기능 하려니까 이거 다시 뜯어 고쳐야 하구나~! 🥲

find할 때 포인터로 넘겨서 PotionRecipe에서 따로 빈 값 체크 할 필요가 없어졌다!

 

크게 어렵지 않게 완료!

 

코드가 길어져서 파일을 분리했다.

하나하나 복붙해서 파일을 나눴는데...

더 편하게 할 수 없을까.. vs 기능을 찾아봐야겠다.

 

4. RESULT

  • 과제 4

https://github.com/yoonseo4343/NBC_Cpp_P4

 

GitHub - yoonseo4343/NBC_Cpp_P4: 내일배움캠프 언리얼7기 과제 4

내일배움캠프 언리얼7기 과제 4. Contribute to yoonseo4343/NBC_Cpp_P4 development by creating an account on GitHub.

github.com

 

  • 미니 실습 2-4
#include <iostream>
#include <vector>
#include <string>
using namespace std;

// 아이템 관리와 파일 저장을 모두 처리
class InventoryManager
{
private:
    vector<string> items;

public:
    // 아이템 목록 관리 - O
    void addItem(const string& itemName)
    {
        items.push_back(itemName);
        cout << "[Manager] " << itemName << "을/를 인벤토리에 추가했습니다." << endl;
    }

    // 아이템 목록 관리 - O
    void removeItem(const string& itemName)
    {
        // 실제 삭제 로직 생략
        cout << "[Manager] " << itemName << "을/를 인벤토리에서 제거했습니다." << endl;
    }

    // 파일 저장 - X
    //void saveToFile(const string& filename)
    //{
    //    // 실제 파일 입출력 로직 생략
    //    cout << "[Manager] 아이템 목록을 " << filename << "(으)로 저장 완료." << endl;
    //}

    // 파일 로드
    //void loadFromFile(const string& filename)
    //{
    //    // 실제 파일 입출력 로직 생략
    //    cout << "[Manager] 아이템 목록을 " << filename << "(으)로부터 불러오기 완료." << endl;
    //}
    // 아이템 모두 조회
    const vector<string>& getItems() const {
        return items;
    }
};
class FileIO {
public:
    void saveToFile(const string& filename)
    {
        // 실제 파일 입출력 로직 생략
        cout << "[Manager] 아이템 목록을 " << filename << "(으)로 저장 완료." << endl;
    }
    void loadFromFile(const string& filename)
    {
        // 실제 파일 입출력 로직 생략
        cout << "[Manager] 아이템 목록을 " << filename << "(으)로부터 불러오기 완료." << endl;
    }
};
int main()
{
    InventoryManager manager;
    manager.addItem("HP Potion");
    manager.addItem("Sword of Light");
    FileIO fileManager;
    fileManager.saveToFile("savegame.dat"); // 저장 클래스 분리

    for (string it : manager.getItems()) {
        cout << it << endl;
    }

    return 0;
}

 

  • 도전 실습 2-4
#include <iostream>
#include <string>
using namespace std;

class IDamageFormula
{
public:
    virtual int calculate(int baseAttack) const = 0;
};

class NormalDamageFormula : public IDamageFormula
{
public:
    int calculate(int baseAttack) const override
    {
        return baseAttack;
    }
};
class FireDamageFormula : public IDamageFormula {
public:
    int calculate(int baseAttack) const override {
        return baseAttack * 1.5;
    }
};
class Character
{
private:
    int baseAttackPower;
    IDamageFormula* formula;

public:
    Character(int basePower, IDamageFormula* formula)
        : baseAttackPower(basePower)
    {
        this->formula = formula;
    }

    void attack() const
    {
        int finalDamage = formula->calculate(baseAttackPower);
        cout << "최종 데미지: " << finalDamage << endl;
    }
};


int main()
{
    int basePower = 100;

    //NOTE: 예제 간결화를 위해 로컬 변수를 사용했어요.
    // 실무에서 Character의 생명주기가 formula보다 길다면,
    // 동적할당 + 스마트 포인터 사용을 고려하세요.

    NormalDamageFormula normalFormula;
    Character normalChar(basePower, &normalFormula);
    cout << "--- 일반 캐릭터 공격 ---" << endl;
    normalChar.attack(); // 예상 출력: 100

    FireDamageFormula fireFormula;
    Character fireChar(basePower, &fireFormula);
    cout << "\n--- 불 속성 캐릭터 공격 ---" << endl;
    fireChar.attack();

    return 0;
}

 

 

 

5. 참고

https://en-percent.tistory.com/88  들여쓰기 자동 정렬 ctrl+k, ctrl+f << 와 너무 편해요

 

VScode 들여쓰기 넓이 조절, 들여쓰기 자동 정렬

나는 평상시 이미 기본적인 틀을 구성되어 있는 코드를 만지고 있다 회사 웹페이지도 마찬가지로 이미 스타일과 로직이 설계된 코드를 만지다보니 굳이 들여쓰기나 공백을 신경 쓸 필요가 없었

en-percent.tistory.com

https://goguri.tistory.com/1503

 

유용한 Visual Studio 단축키.

# 프로젝트 & 파일 & 창 생성 및 열기 새 프로젝트 생성 Ctrl + Shift + N 새 파일 추가 Ctrl + Shift + A 여러 유형(txt, html, ...) 새 파일 만들기 Ctrl + N 현재 문서 닫기 Ctrl + F4 기존 프로젝트 열기 Ctrl + Shift +

goguri.tistory.com


의존성 주입(Dependency Injection, DI)이란?

객체가 사용할 의존 객체를 스스로 생성하지 않고, 외부에서 주입받는 것

오늘 나

'내배캠Unreal_TIL > C++' 카테고리의 다른 글

[TIL] 2025-12-23 | C++ 하면서 사소한 것들  (0) 2025.12.23
[TIL] 2025-12-22 | C++ 디자인패턴 - 싱글톤, 데코레이터, 옵저버 정리  (0) 2025.12.22
[C++] STL 총정리  (0) 2025.12.18
[TIL] 2025-12-18 | 과제3 구현 및 vector 동작 원리 이해  (0) 2025.12.18
[TIL] 2025-12-17 | C++ 예외 처리, 연산자 오버로드, 객체지향적 설계  (0) 2025.12.17
'내배캠Unreal_TIL/C++' 카테고리의 다른 글
  • [TIL] 2025-12-23 | C++ 하면서 사소한 것들
  • [TIL] 2025-12-22 | C++ 디자인패턴 - 싱글톤, 데코레이터, 옵저버 정리
  • [C++] STL 총정리
  • [TIL] 2025-12-18 | 과제3 구현 및 vector 동작 원리 이해
윤윤씨
윤윤씨
🎮 내일배움캠프 Unreal 7기
  • 윤윤씨
    컴퓨터온열맛사지
    윤윤씨
  • 전체
    오늘
    어제
    • 분류 전체보기 (62)
      • 내배캠Unreal_TIL (62)
        • C++ (23)
        • UE (31)
        • 팀프로젝트 (7)
      • etc (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
    • Solved.ac
    • YouTube
  • 태그

    스테이트머신
    챌린지
    오토마타
    STL
    디자인패턴
    언리얼과제
    gas
    머티리얼
    프로그래머스
    코드카타
    ta
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.6
윤윤씨
[TIL] 2025-12-19 | 과제4 구현
상단으로

티스토리툴바