경일게임아카데미 프로그래밍반 28기 9일차 수업 (2021. 04. 20)
접근자, 설정자 (Getter, Setter)
#pragma once
#include <iostream>
using namespace std;
class Player
{
private:
int _hp;
int _atk;
public:
Player();
~Player();
// 접근자
int getPlayerHP() { return _hp; }
int getPlayerAtk() { return _atk; }
// 설정자
void setPlayerHP(int hp) { _hp = hp; }
void output()
{
cout << "플레이어 체력 : " << _hp << endl;
}
};
#include "210420 1. Player.h"
Player::Player()
{
_hp = 100;
_atk = 10;
}
Player::~Player()
{
}
Player의 클래스는 위와 같다.
해당 코드에는 없지만, Enemy 클래스 또한 위와 동일하게 구성되어 있다.
이 두 개의 클래스를 이용하여 접근자-설정자 예제를 든다.
아래는 또 다른 예제이다.
#include <iostream>
#include "210420 1. Player.h"
#include "210420 2. Enemy.h"
int main()
{
// 사용하기 위해 동적할당
Player* pl = new Player;
Enemy* em = new Enemy;
// 접근자, 설정자를 통한 예제
int tempHp = pl->getPlayerHP();
// tempHp에는 getPlayerHp 접근자 return hp로 인해 tempHp는 100이 된다.
int tempAtk = em->getEnemyAtk();
// tempAtk에는 getEnemyAtk 접근자 return Atk로 인해 tempAtk는 10이 된다.
pl->output();
// pl의 output은 pl의 체력을 출력한다. tempHp의 체력을 출력하는 것이 아니다.
pl->setPlayerHP(tempHp - tempAtk);
// pl의 setPlayerHp 설정자를 통해 값을 가져오지만 매개변수 (tempHp - tempAtk) = (100 - 10)의 값인 90이 setPlayerHp로 반환된다
pl->output();
// pl의 체력은 21행의 코드로 인해 90이 된다.
pl->setPlayerHP(pl->getPlayerHP() - em->getEnemyAtk());
pl->output();
em->setEnemyHp(em->getEnemyHP() - pl->getPlayerAtk());
em->output();
// 위와같이 사용해도 무관하다. 자세한 설명은 생략한다. (짤)
// 다 사용했으니 종료
delete pl;
delete em;
}
// 해당 부분은 위에 설명한 주석과 유사하므로 자세한 설명은 생략한다.
pl->setPlayerHP(pl->getPlayerHP() - em->getEnemyAtk());
pl->output();
em->setEnemyHp(em->getEnemyHP() - pl->getPlayerAtk());
em->output();
C++ 표준 템플릿 라이브러리 (Standard Template Library - STL) 이하 STL
STL이란?
C++을 위한 라이브러리로서 C++ 표준 라이브러리의 많은 부분에 영향을 끼쳤다. 이것은 알고리즘, 컨테이너, 함수자 그리고 반복자라고 불리는 네가지의 구성 요소를 제공한다.
출처 : 위키백과
예제
메인함수
cout << endl;
mainGame5 mg;
/*
template<typename T>
inline void mainGame::output(T t)
output(T t)로 인해 mg.output의 데이터 타입이 무엇이 와도 다 사용이 가능하다!
*/
mg.output(7);
mg.output(3.14f);
mg.output("점심 뭐먹지?");
mainGame5 클래스
#pragma once
#include <iostream>
using namespace std;
class mainGame5
{
public:
mainGame5();
~mainGame5();
template<typename T>
void output(T t);
};
template<typename T>
inline void mainGame5::output(T t)
{
cout << t << endl;
}
mainGame5 클래스에 선언한 템플릿으로 인해 메인함수에서 선언한 output 데이터 타입들이 무엇이 와도 다 사용가능하다.
template<typename T>
inline void mainGame5::output(T t)
{
cout << t << endl;
}
STL 컨테이너의 종류
스택, 큐, 리스트, 벡터, 맵 등 여러 종류가 있다.
VectorTest 클래스를 이용한 Vector 예제
VectorTest.h
#pragma once
#include <iostream>
#include <vector>
using namespace std;
class VectorTest
{
private:
// 벡터
// 배열 형식으로 이루어져있다
// 늘었다 줄었다 하는 가변형 배열이라 생각하면 쉽다.
// 삽입 삭제를 많이하면 느려지며 데이터 8천개 이하에서는 속도가 빠르다.
vector<int> _vNum;
vector<int>::iterator _viNum;
// iterator = 이터레이터, 반복자 == 디자인패턴
public:
VectorTest();
~VectorTest();
};
VectorTest.cpp
#include "210420 4. VectorTest.h"
VectorTest::VectorTest()
{
// 차곡차곡 데이터를 넣을땐
// Push_back()
_vNum.push_back(1);
_vNum.push_back(2);
for (int i = 0; i < 5; i++)
{
_vNum.push_back(i * 100);
}
// 자료를 차례로 뺄때
// pop_back()
_vNum.pop_back();
_vNum.pop_back();
// 중간에 삽입하려면 insert()
_vNum.insert(_vNum.begin() + 3, 777);
_vNum.insert(_vNum.end() - 2, 22);
// begin은 Vector의 맨 앞자리 =(제일 처음), 777은 '값'
// end는 Vecotr의 맨 뒷자리 =(제일 끝), 22는 '값'
// 중간에 데이터를 삭제하려면 erase()
_vNum.erase(_vNum.begin() + 2);
_vNum.erase(_vNum.end() - 1);
// begin과 end는 위와 같다.
// 싹다 날리고 싶으면 clear()
// _vNum.clear()
// 컨테이너의 자료 갯수를 반환해주는 size()
cout << "지금 벡터 갯수는 : " << _vNum.size() << endl;
for (int i = 0; i < _vNum.size(); i++)
{
cout << _vNum[i] << endl;
}
}
VectorTest::~VectorTest()
{
}
위와 같이 선언 후, 메인 함수에서는 VectorTest vT;만 실행하면 된다.
그럼 헤더(.h)파일과 .cpp 파일을 살펴보자.
헤더 파일을 살펴보자
헤더에 있는 iterator의 자세한 설명은 아래 링크를 통해 참고하자.
https://eehoeskrap.tistory.com/263
<블로그 내용 일부 발췌>
이터레이터란?
즉, 포인터와 상당히 비슷하며, 컨테이너에 저장되어 있는 원소들을 참조할 때 사용한다.
추상적으로 말하자면, 반복자란 컨테이너에 저장되어 있는 모든 원소들을 전체적으로 훑어 나갈 때 사용하는, 일종의 포인터와 비슷한 객체라고 할 수 있다.
알고리즘 마다 각기 다른 방식으로 컨테이너를 훑어가기 때문에, 반복자에도 여러가지 종류가 있게 된다.
.Cpp 파일을 살펴보자.
차곡 차곡 데이터를 넣을땐 Phsh_back()을 사용한다.
차례대로 데이터를 제거할땐 pop_back()을 사용한다.
중간에 데이터를 삽입하려면 insert()를 사용한다
중간에 데이터를 삭제하려면 erase()를 사용한다.
모든 데이터를 다 삭제하고싶으면 clear()를 사용한다.
컨테이너의 자료 갯수를 반환할 때에는 특정 숫자를 입력하지 말고 size를 이용한다.
기타
사용자가 _vNum을 7개 선언을 하고 값을 입력하고 클리어 할시 사이즈는 0이겠지만, 공간은 아직도 7개가 남아있다.
'학원 > 경일게임아카데미' 카테고리의 다른 글
14. 열번째 수업과제 [벡터를 이용한 상점과 인벤토리 기능 구현] (0) | 2022.12.15 |
---|---|
13. 열번째 수업 (1) | 2022.12.14 |
11. 여덟번째 수업 (0) | 2022.12.12 |
10. 일곱번째 수업 (0) | 2022.12.09 |
9. 여섯번째 수업과제 [0을 움직여라 게임 제작] (0) | 2022.12.04 |