[TIL] 2025-12-12 | 과제1 구현 및 입력 실패 처리, C++ 힙메모리

2025. 12. 12. 17:33·내배캠Unreal_TIL/C++
게임 개발자를 위한 C++ 문법 2-1 ing


1. WHY

  • 개념 전체적으로 정리, 과제1 진행하기

 

2. WHAT

  • 클래스 class: 객체를 만들어 내기 위한 틀, 만들어 낼 객체의 속성과 메서드의 집합을 담아놓은 것
  • 객체 object: 클래스로부터 만들어지는 실체, 클래스로 선언된 변수
  • 인스턴스 instance: 객체가 메모리에 할당된 상태, 런타임에 구동되는 객체, 객체와 같은 의미로 쓰이기도 함

 

  • 힙(동적) 메모리: new -> delete
//변수 동적 할당
void func1() {
    int* ptr = new int(10);  // 힙 메모리에 정수 10 할당
    cout << "Value: " << *ptr << endl;
    delete ptr;             // 메모리 해제
}

//배열 동적 할당
void func2() {
    int* arr = new int[5];  // 힙 메모리에 정수 배열 5개 할당
    for (int i = 0; i < 5; ++i) {
        arr[i] = i * 10;
        cout << "arr[" << i << "] = " << arr[i] << endl;
    }
    delete[] arr;  // 배열 메모리 해제
}

 

스마트 포인터는 다음 시간에



3. HOW

1단계 : 요구사항 분석 및 설계

정보 입력
int status[5] -> HP, MP, 공격력, 방어력, 레벨 저장
HP/MP 입력 받기 -> 50 이하 -> 다시 입력 -> while
공격/방어력 입력 받기 -> 0 이하 -> 다시 입력 -> while

스탯 관리 시스템
1. HP UP 2. MP UP 3. 공격력 UP 4. 방어력 UP 5. 현재 능력치 6. Level Up 0. 나가기
선택지 출력 -> int로 입력 받기 -> 선택지 실행

함수
void setPotion() //포션 지급 함수 -> 기본 5개 지급
void printSystem() //시스템 선택지 출력
void hpUp() //HP 강화 +20 //포션 -1 ->포션 갯수 체크
void mpUp() //MP 강화 +20 //포션 -1 ->포션 갯수 체크
void atkUp() //공격력 강화 2배
void defUp() //방어력 강화 2배
void printStatus() //상태 출력
void lvUp() //레벨업 //포션 각 +1

 

2단계 : 코드 작성 및 구현

#include <iostream>

using namespace std;

void setPotion(int count, int* p_HPPotion, int* p_MPPotion) { // 포션 지급 함수, 카운트 만큼 포션 증가
	*p_HPPotion += count;
	*p_MPPotion += count;
}
void printSystem() {
	cout << "1. HP UP" << endl;
	cout << "2. MP UP" << endl;
	cout << "3. 공격력 UP" << endl;
	cout << "4. 방어력 UP" << endl;
	cout << "5. 현재 능력치" << endl;
	cout << "6. Level UP" << endl;

	cout << "0. 나가기" << endl;
}
void hpUp(int& hp, int& po) {
	if (po < 1)
	{
		cout << "포션이 부족합니다." << endl; 
		return;
	}
	hp += 20;
	po--;
	cout << "* HP가 20 증가되었습니다. 포션이 1개 차감됩니다." << endl;
	cout << "현재 HP: " << hp << endl;
}
void mpUp(int& mp, int& po) {
	if (po < 1)
	{
		cout << "포션이 부족합니다." << endl; 
		return;
	}
	mp += 20;
	po--;
	cout << "* MP가 20 증가되었습니다. 포션이 1개 차감됩니다." << endl;
	cout << "현재 MP: " << mp << endl;
}
void atkUp(int& atk) {
	atk *=2;
	cout << "* 공격력이 2배로 증가되었습니다." << endl;
	cout << "현재 공격력: " << atk << endl;
}
void defUp(int& def) {
	def *= 2;
	cout << "* 방어력이 2배로 증가되었습니다." << endl;
	cout << "현재 방어력: " << def << endl;
}
void printStatus(int(&arr)[5], int& hpp, int& mpp) {
	cout << "* HP: " << arr[0] << ", MP: " << arr[1] << ", 공격력: " << arr[2] << ", 방어력: " << arr[3] << endl;
	cout << "* Lv: " << arr[4] << ", 남은 HP/MP 포션 수: " << hpp << "/" << mpp << endl;
}
void lvUp(int& lv, int& hpp, int& mpp) {
	lv++;
	setPotion(1, &hpp, &mpp);
	cout << "* 레벨업! HP/MP 포션이 지급됩니다." << endl;
	cout<<"남은 HP/MP 포션 수: " << hpp << "/" << mpp << endl; 
}
int main() {
	int status[5] = { 0,0,0,0,1 }; // HP,MP,공격력,방어력,레벨 초기화

	while (status[0] <= 50 || status[1] <= 50) { // HP와 MP를 입력
		cout << "HP와 MP를 입력해주세요: ";
		cin >> status[0] >> status[1];
		if (status[0] <= 50 || status[1] <= 50)
			cout << "HP나 MP의 값이 너무 작습니다. 다시 입력해주세요." << endl;
	}

	while (status[2] <= 0 || status[3] <= 0) { // 공격과 방어를 입력
		cout << "공격력과 방어력을 입력해주세요: ";
		cin >> status[2] >> status[3];
		if (status[2] <= 0 || status[3] <= 0)
			cout << "공격력이나 방어력의 값이 너무 작습니다. 다시 입력해주세요." << endl;
	}

	int HPPotion = 0; // 포션 갯수
	int MPPotion = 0;
	cout << "* 포션이 지급되었습니다. (HP, MP 포션 각 5개)" << endl;
	setPotion(5, &HPPotion, &MPPotion); // 포션 지급

	cout << "##############################################" << endl;

	cout << "스탯 관리 시스템" << endl;
	printSystem();
	while (true) {
		int num;
		cout << "번호를 선택해주세요: ";
		cin >> num;

		if (num == 0)
		{
			cout << "프로그램을 종료합니다." << endl;
			break;
		}
		else if (num == 1)
			hpUp(status[0], HPPotion);
		else if (num == 2)
			mpUp(status[1], MPPotion);
		else if (num == 3)
			atkUp(status[2]);
		else if (num == 4)
			defUp(status[3]);
		else if (num == 5)
			printStatus(status, HPPotion, MPPotion);
		else if (num == 6)
			lvUp(status[4], HPPotion, MPPotion);
		else
			cout << "잘못된 입력" << endl;
	}
	
	return 0;
}

 

3단계 : 테스트 및 디버깅

예외 처리 테스트
잘못된 선택지 입력 테스트

> 잘못된 선택지 입력 시 false > false == 0 > 프로그램 종료(0번)로 인식 > 입력 실패 처리 추가

if (cin.fail()) {
    cin.clear();             // fail 상태 복구
    cin.ignore(1000, '\n');  // 잘못된 입력 버퍼 비우기
    cout << "번호를 입력해주세요.\n";
    continue;
}
if (!(cin >> num)) {
	cout << "출력오류\n";
}

 

4. RESULT

https://github.com/yoonseo4343/NBC_Cpp_P1

#include <iostream>

using namespace std;

void setPotion(int count, int* p_HPPotion, int* p_MPPotion) { // 포션 지급 함수, 카운트 만큼 포션 증가
	*p_HPPotion += count;
	*p_MPPotion += count;
}
void printSystem() {
	cout << "1. HP UP" << endl;
	cout << "2. MP UP" << endl;
	cout << "3. 공격력 UP" << endl;
	cout << "4. 방어력 UP" << endl;
	cout << "5. 현재 능력치" << endl;
	cout << "6. Level UP" << endl;

	cout << "0. 나가기" << endl;
}
void hpUp(int& hp, int& po) {
	if (po < 1)
	{
		cout << "포션이 부족합니다." << endl; 
		return;
	}
	hp += 20;
	po--;
	cout << "* HP가 20 증가되었습니다. 포션이 1개 차감됩니다." << endl;
	cout << "현재 HP: " << hp << endl;
}
void mpUp(int& mp, int& po) {
	if (po < 1)
	{
		cout << "포션이 부족합니다." << endl; 
		return;
	}
	mp += 20;
	po--;
	cout << "* MP가 20 증가되었습니다. 포션이 1개 차감됩니다." << endl;
	cout << "현재 MP: " << mp << endl;
}
void atkUp(int& atk) {
	atk *=2;
	cout << "* 공격력이 2배로 증가되었습니다." << endl;
	cout << "현재 공격력: " << atk << endl;
}
void defUp(int& def) {
	def *= 2;
	cout << "* 방어력이 2배로 증가되었습니다." << endl;
	cout << "현재 방어력: " << def << endl;
}
void printStatus(int(&arr)[5], int& hpp, int& mpp) {
	cout << "* HP: " << arr[0] << ", MP: " << arr[1] << ", 공격력: " << arr[2] << ", 방어력: " << arr[3] << endl;
	cout << "* Lv: " << arr[4] << ", 남은 HP/MP 포션 수: " << hpp << "/" << mpp << endl;
}
void lvUp(int& lv, int& hpp, int& mpp) {
	lv++;
	setPotion(1, &hpp, &mpp);
	cout << "* 레벨업! HP/MP 포션이 지급됩니다." << endl;
	cout<<"남은 HP/MP 포션 수: " << hpp << "/" << mpp << endl; 
}
int main() {
	int status[5] = { 0,0,0,0,1 }; // HP,MP,공격력,방어력,레벨 초기화

	while (status[0] <= 50 || status[1] <= 50) { // HP와 MP를 입력
		cout << "HP와 MP를 입력해주세요: ";
		cin >> status[0] >> status[1];
		if (status[0] <= 50 || status[1] <= 50)
			cout << "HP나 MP의 값이 너무 작습니다. 다시 입력해주세요." << endl;
	}

	while (status[2] <= 0 || status[3] <= 0) { // 공격과 방어를 입력
		cout << "공격력과 방어력을 입력해주세요: ";
		cin >> status[2] >> status[3];
		if (status[2] <= 0 || status[3] <= 0)
			cout << "공격력이나 방어력의 값이 너무 작습니다. 다시 입력해주세요." << endl;
	}

	int HPPotion = 0; // 포션 갯수
	int MPPotion = 0;
	cout << "* 포션이 지급되었습니다. (HP, MP 포션 각 5개)" << endl;
	setPotion(5, &HPPotion, &MPPotion); // 포션 지급

	cout << "##############################################" << endl;

	cout << "스탯 관리 시스템" << endl;
	printSystem();
	while (true) {
		int num;
		cout << "번호를 선택해주세요: ";
		cin >> num;

		if (cin.fail()) {
			cin.clear();             // fail 상태 복구
			cin.ignore(1000, '\n');  // 잘못된 입력 버퍼 비우기
			cout << "번호를 입력해주세요.\n";
			continue;
		}

		if (num == 0)
		{
			cout << "프로그램을 종료합니다." << endl;
			break;
		}
		else if (num == 1)
			hpUp(status[0], HPPotion);
		else if (num == 2)
			mpUp(status[1], MPPotion);
		else if (num == 3)
			atkUp(status[2]);
		else if (num == 4)
			defUp(status[3]);
		else if (num == 5)
			printStatus(status, HPPotion, MPPotion);
		else if (num == 6)
			lvUp(status[4], HPPotion, MPPotion);
		else
			cout << "잘못된 입력" << endl;
	}
	
	return 0;
}

 

 

5. NEXT

구글 가이드 맞추기..

 

 

6. 참고

https://blog.naver.com/techref/223795571598

 

Mouse Without Borders 다운로드 사용법 : 무료로 여러 PC를 연결하는 방법

하나의 키보드와 마우스로 여러 대의 컴퓨터를 자유롭게 제어할 수 있다면 얼마나 편리할까요? 듀얼 컴퓨터...

blog.naver.com

하나의 키보드와 마우스로 여러 대의 컴퓨터 제어하는 방법


Is-a, Has-a의 개념 차이 > Is-a: 상속 관계 > Has-a: 포함 관계 

class Base final {
};

> 상속을 못함

 

class Base {
public:
    virtual void func();
};

class Child : public Base {
public:
    void func() final;  // 여기서 override는 가능
};

class GrandChild : public Child {
public:
    void func();  // ❌ Child에서 final 했기 때문에 override 불가
};

> 상속받은 클래스에서 해당 가상 함수를 더 이상 override 못하게 막음

 

Adventurer* p = new Warrior();
p->attack();   // Warrior 버전이 호출

> p는 Adventurer* 타입이지만 vptr이 Warrior의 vtable을 가리키고 있으므로 Warrior의 attack()이 호출됨.

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

[TIL] 2025-12-16 | C++ STL, vector, map, sort(), find(), Iterator  (2) 2025.12.16
[TIL] 2025-12-15 | C++ 스마트 포인터, 템플릿  (0) 2025.12.15
[C++] Google C++ Style Guide, 구글 코드 컨벤션  (1) 2025.12.11
[TIL] 2025-12-11 | C++ 객체지향 프로그래밍, 상속과 다형성  (0) 2025.12.11
[TIL] 2025-12-10 | C++ 포인터와 레퍼런스, 클래스와 생성자 익히기, 멤버 초기화 리스트  (0) 2025.12.10
'내배캠Unreal_TIL/C++' 카테고리의 다른 글
  • [TIL] 2025-12-16 | C++ STL, vector, map, sort(), find(), Iterator
  • [TIL] 2025-12-15 | C++ 스마트 포인터, 템플릿
  • [C++] Google C++ Style Guide, 구글 코드 컨벤션
  • [TIL] 2025-12-11 | C++ 객체지향 프로그래밍, 상속과 다형성
윤윤씨
윤윤씨
🎮 내일배움캠프 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-12 | 과제1 구현 및 입력 실패 처리, C++ 힙메모리
상단으로

티스토리툴바