학원/경일게임아카데미

12. 아홉번째 수업

셩잇님 2022. 12. 12. 23:14
반응형

경일게임아카데미 프로그래밍반 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

 

[C++] 반복자 (Iterator)

C++ 반복자(Iterator) C++ 라이브러리는 반복자를 제공하는데 이것을 사용하면 라이브러리의 방식대로 자료구조를 액세스 할 수 있다. 따라서 라이브러리가 효과적으로 동작한다는 것을 보장 할 수

eehoeskrap.tistory.com

 

<블로그 내용 일부 발췌>

이터레이터란?
즉, 포인터와 상당히 비슷하며, 컨테이너에 저장되어 있는 원소들을 참조할 때 사용한다.
추상적으로 말하자면, 반복자란 컨테이너에 저장되어 있는 모든 원소들을 전체적으로 훑어 나갈 때 사용하는, 일종의 포인터와 비슷한 객체라고 할 수 있다.
알고리즘 마다 각기 다른 방식으로 컨테이너를 훑어가기 때문에, 반복자에도 여러가지 종류가 있게 된다.

 


 

.Cpp 파일을 살펴보자.

차곡 차곡 데이터를 넣을땐 Phsh_back()을 사용한다.
차례대로 데이터를 제거할땐 pop_back()을 사용한다.
중간에 데이터를 삽입하려면 insert()를 사용한다
중간에 데이터를 삭제하려면 erase()를 사용한다.
모든 데이터를 다 삭제하고싶으면 clear()를 사용한다.
컨테이너의 자료 갯수를 반환할 때에는 특정 숫자를 입력하지 말고 size를 이용한다.

 


 

기타

사용자가 _vNum을 7개 선언을 하고 값을 입력하고 클리어 할시 사이즈는 0이겠지만, 공간은 아직도 7개가 남아있다.

반응형