내배캠 TIL

[내배캠 TIL 251211] C++ Class 활용한 예제 2

xodn246 2025. 12. 15. 20:49

 앞선 글에서는 클래스를 main.cpp 내부에 구현해서 활용하여 예제를 해결했다. 이번에는 클래스를 헤더파일을 활용해 구성한 뒤 별도의 cpp 파일에서 함수를 구현해 main.cpp에 라이브러리 형태로 호출하는 방법을 이용해 간단한 예제를 풀어볼것이다.

 

Player 클래스를 선언 후 Player를 상속받는 Warrior 클래스를 제작해 main 함수에서 불러와 정보를 출력하는 예제이다.

 

Player.h

#ifndef  Player_H_
#define Player_H_

#include<string>
using namespace std;

class Player {
public:
    Player(string nickname);

    virtual void attack() = 0;
    void printPlayerStatus();

    // getter 함수
    string getJobName();
    string getNickname();
    int getLevel();
    int getHP();
    int getMP();
    int getPower();
    int getDefence();
    int getAccuracy();
    int getSpeed();

    // setter 함수
    void setNickname(string nickname);
    void setHP(int HP);
    void setMP(int MP);
    void setPower(int power);
    void setDefence(int defence);
    void setAccuracy(int accuracy);
    void setSpeed(int speed);

protected:
	string job_name;
	string nickname;
	int level;
	int HP;
	int MP;
	int power;
	int defence;
	int accuracy;
	int speed;
};
#endif

 

Player.cpp

#include <iostream>
#include "Player.h"

Player::Player(string nickname) {
    this->nickname = nickname;
    HP = 50;
    MP = 50;
    level = 1;
    power = 5;
    defence  = 5;
    accuracy = 5;
    speed = 10;
}

void Player::printPlayerStatus() {
    cout << "------------------------------------" << endl;
    cout << "* 현재 능력치" << endl;
    cout << "닉네임: " << nickname << endl;
    cout << "Lv. " << level << endl;
    cout << "HP: " << HP << endl;
    cout << "MP: " << MP << endl;
    cout << "공격력: " << power << endl;
    cout << "방어력: " << defence << endl;
    cout << "정확도: " << accuracy << endl;
    cout << "속도: " << speed << endl;
    cout << "------------------------------------" << endl;
}

string Player::getJobName() {
    return Player::job_name;
}
string Player::getNickname() {
    return Player::nickname;
}
int Player::getLevel() {
    return Player::level;
}
int Player::getHP() {
    return Player::HP;
}
int Player::getMP() {
    return Player::MP;
}
int Player::getPower() {
    return Player::power;
}
int Player::getDefence() {
    return Player::defence;
}
int Player::getAccuracy() {
    return Player::accuracy;
}
int Player::getSpeed() {
    return Player::speed;
}

void Player::setNickname(string nickname) {
    Player::nickname = nickname;
}
void Player::setHP(int HP) {
    Player::HP = HP;
}
void Player::setMP(int MP) {
    Player::MP = MP;
}
void Player::setPower(int power) {
    Player::power = power;
}
void Player::setDefence(int defence) {
    Player::defence = defence;
}
void Player::setAccuracy(int accuracy) {
    Player::accuracy = accuracy;
}
void Player::setSpeed(int speed) {
    Player::speed = speed;
}

 

Warrior.h

#ifndef  Warrior_H_
#define Warrior_H_

#include "Player.h"
#include <string>

class Warrior : public Player {
 public:
    Warrior(string nickname);
    void attack() override;
};
#endif

 

Warrior.cpp

#include <iostream>
#include "Player.h"
#include "Warrior.h"

Warrior::Warrior(string nickname) :  Player(nickname) {
    job_name = "전사";
    cout << "전사 전직" << endl;
    HP = 100;
}

void Warrior::attack() {
    std::cout << "파워 스트라이크!" << endl;
}

 

main.cpp

#include <iostream>
#include "Player.h"
#include "Warrior.h"
#include "Magician.h"
#include "Thief.h"
#include "Archer.h"

using namespace std;

int main() {
    string jobs[] = { "전사", "마법사", "도적", "궁수" };
    int job_choice = 0;
    string nickname;

    Player* player = nullptr;

    cout << "* 닉네임을 입력해주세요: ";
    cin >> nickname;

    cout << "<전직 시스템>" << endl;
    cout << nickname << "님, 환영합니다!" << endl;
    cout << "* 원하시는 직업을 선택해주세요." << endl;

    for (int i = 0; i < 4; i++) {
        cout << (i + 1) << ". " << jobs[i] << endl;
    }

    cout << "선택: ";
    cin >> job_choice;

    switch (job_choice) {
    case 1:
        player = new Warrior(nickname);
        break;
    case 2:
        player = new Magician(nickname);
        break;
    case 3:
        player = new Thief(nickname);
        break;
    case 4:
        player = new Archer(nickname);
        break;
    default:
        cout << "잘못된 입력입니다." << endl;
        return 1;
    }

    player->attack();
    player->printPlayerStatus();

    if (player != nullptr)
        delete player;

    return 0;
}

 

 해당 게시글에서는 Warrior 만 보여주고있으나 같은 방법으로 Magician, Thief, Archer 등 다양한 직업 클래스를 만들어 해당 클래스에 대한 내용도 출력 할 수 있도록 만들 수 있다. 이렇게 클래스를 헤더파일과 cpp 파일로 나누어 구성해주면 main.cpp 파일을 더욱 깔끔하게 작성하고 안전하게 보호 할 수 있다.