본문 바로가기
개발이야기/C++

C++기초 6강: 클래스와 객체

by oddsilk 2024. 12. 13.

1. 학습 목표

  • 클래스와 객체의 개념을 이해한다.
  • 클래스와 객체를 C++로 작성하고 사용할 수 있다.
  • 게임 개발에서 클래스와 객체가 왜 중요한지 알 수 있다.

2. 클래스와 객체란 무엇인가?

1) 클래스(Class)란?

  • 클래스는 설계도라고 생각하면 됩니다.
  • 예: 게임에서 캐릭터(Player)의 설계도를 만들어 놓고, 여러 캐릭터를 생성합니다.

2) 객체(Object)란?

  • 객체는 클래스를 기반으로 만들어진 실제 사물입니다.
  • 클래스 = 설계도 → 객체 = 설계도를 바탕으로 만든 건물
  • 예: "Player"라는 클래스를 기반으로 '철수', '영희' 캐릭터를 생성할 수 있습니다.


3. 왜 클래스와 객체가 중요한가?

  • 게임 개발에서는 많은 캐릭터, 아이템, 환경 등이 등장합니다.
  • 각 요소를 클래스로 설계하고, 객체로 만들어야 효율적이고 체계적으로 관리할 수 있습니다.

4. C++ 코드로 배우는 클래스와 객체

1) 클래스 정의

  • 클래스를 정의하려면 class 키워드를 사용합니다.
#include <iostream>
using namespace std;

// Player 클래스 정의
class Player 
{
public:  // 접근 제어자 (Public: 누구나 접근 가능)
    string name; // 이름
    int health;  // 체력

    // 클래스 함수: 행동 정의
    void Attack()
    {
        cout << name << "이(가) 공격합니다!" << endl;
    }
};

 

2) 객체 생성

  • 클래스를 정의한 후, 이를 바탕으로 객체를 생성합니다.
int main() 
{
    // Player 객체 생성
    Player player1; // 객체 선언
    player1.name = "철수"; // 이름 설정
    player1.health = 100;  // 체력 설정

    // 행동 호출
    cout << "플레이어 이름: " << player1.name << endl;
    cout << "플레이어 체력: " << player1.health << endl;
    player1.Attack();

    return 0;
}

 

 

5. 실행 결과

코드를 실행하면 다음과 같은 결과를 볼 수 있습니다:

 

플레이어 이름: 철수
플레이어 체력: 100
철수이(가) 공격합니다!

 

6. 게임 개발에 어떻게 활용할까?

  1. 캐릭터 클래스 만들기
    • 플레이어, 적, NPC 등을 클래스로 정의하고 각자 객체를 생성.
  2. 다양한 속성과 행동 추가
    • 예: 공격력, 방어력, 움직임 등.
  3. 복잡한 시스템 구현
    • 클래스 간 협력(플레이어와 적의 상호작용 등).

7. 실습 문제

  1. Enemy 클래스를 만들어보세요.
    • 속성: 이름(name), 체력(health), 공격력(attackPower)
    • 행동: Attack 함수(출력: "[이름]이(가) [공격력] 데미지로 공격합니다!")
  2. main 함수에서 Enemy 객체를 생성하고, 속성을 설정한 뒤 행동을 호출하세요.

 

실습 문제 풀이: Enemy 클래스 작성

코드 설명

  1. Enemy 클래스를 정의합니다.
  2. 속성(name, health, attackPower)과 행동(Attack 함수)을 추가합니다.
  3. main 함수에서 Enemy 객체를 생성하고, 속성을 설정한 후 행동을 호출합니다.
#include <iostream>
using namespace std;

// Enemy 클래스 정의
class Enemy 
{
public: 
    string name;        // 적 이름
    int health;         // 체력
    int attackPower;    // 공격력

    // 적의 행동: 공격
    void Attack() 
    {
        cout << name << "이(가) " << attackPower << " 데미지로 공격합니다!" << endl;
    }
};

int main() 
{
    // Enemy 객체 생성
    Enemy enemy1;
    enemy1.name = "고블린";    // 적의 이름 설정
    enemy1.health = 50;       // 적의 체력 설정
    enemy1.attackPower = 10;  // 적의 공격력 설정

    // 객체 정보 출력
    cout << "적 이름: " << enemy1.name << endl;
    cout << "적 체력: " << enemy1.health << endl;
    cout << "적 공격력: " << enemy1.attackPower << endl;

    // 적의 행동 호출
    enemy1.Attack();

    return 0;
}

코드 실행 결과

적 이름: 고블린
적 체력: 50
적 공격력: 10
고블린이(가) 10 데미지로 공격합니다!

 

확장 실습

  1. 적을 여러 명 만들어보기
    • Enemy 객체를 두 개 이상 만들어 각각 다른 이름, 체력, 공격력을 설정해보세요.
  2. Player와 Enemy 간 상호작용
    • Player 클래스와 Enemy 클래스 간의 전투 시스템을 간단히 구현해보세요.
    • 예: Enemy가 공격하면 Player의 체력이 줄어드는 코드 작성.
  3. 랜덤 공격력
    • 공격력을 랜덤 값으로 설정하려면 <cstdlib> 라이브러리를 사용해보세요.

 

 

확장 실습: Player와 Enemy 간 전투 시스템

코드 설명

  1. Player 클래스와 Enemy 클래스를 정의합니다.
  2. 두 클래스의 객체를 생성하여 서로 공격하는 간단한 전투를 구현합니다.
  3. 공격 시 체력이 감소하도록 상호작용을 만듭니다.
#include <iostream>
#include <cstdlib>  // 랜덤 값 사용을 위해 포함
#include <ctime>    // srand 시드 초기화를 위해 포함
using namespace std;

// Player 클래스 정의
class Player 
{
public:
    string name;
    int health;

    Player(string playerName, int playerHealth) 
    {
        name = playerName;
        health = playerHealth;
    }

    void TakeDamage(int damage) 
    {
        health -= damage;
        cout << name << "이(가) " << damage << " 데미지를 입었습니다! 남은 체력: " << health << endl;
    }

    bool IsAlive() 
    {
        return health > 0;
    }
};

// Enemy 클래스 정의
class Enemy 
{
public:
    string name;
    int health;
    int attackPower;

    Enemy(string enemyName, int enemyHealth, int enemyAttackPower) 
    {
        name = enemyName;
        health = enemyHealth;
        attackPower = enemyAttackPower;
    }

    void Attack(Player &target) 
    {
        cout << name << "이(가) " << target.name << "을(를) 공격합니다!" << endl;
        target.TakeDamage(attackPower);
    }

    bool IsAlive() 
    {
        return health > 0;
    }
};

int main() 
{
    // 랜덤 시드 초기화
    srand(static_cast<unsigned int>(time(0)));

    // Player와 Enemy 객체 생성
    Player player1("용사", 100); 
    Enemy enemy1("고블린", 50, rand() % 15 + 5); // 공격력 5~20 랜덤

    cout << "전투 시작!" << endl;

    // 전투 루프
    while (player1.IsAlive() && enemy1.IsAlive()) 
    {
        // 플레이어가 적을 공격
        int playerAttack = rand() % 20 + 10; // 플레이어 공격력 10~30 랜덤
        cout << player1.name << "이(가) " << enemy1.name << "을(를) 공격합니다! 데미지: " << playerAttack << endl;
        enemy1.health -= playerAttack;

        if (enemy1.health > 0) 
        {
            cout << enemy1.name << "의 남은 체력: " << enemy1.health << endl;
        } 
        else 
        {
            cout << enemy1.name << "이(가) 쓰러졌습니다!" << endl;
            break;
        }

        // 적이 플레이어를 공격
        enemy1.Attack(player1);

        if (!player1.IsAlive()) 
        {
            cout << player1.name << "이(가) 쓰러졌습니다! 게임 오버!" << endl;
            break;
        }

        cout << "-------------------------" << endl;
    }

    if (player1.IsAlive()) 
    {
        cout << "전투에서 승리했습니다!" << endl;
    }

    return 0;
}

 

 


8. 요약

  • 클래스는 설계도, 객체는 설계도를 바탕으로 만든 실제 물건이다.
  • 게임 개발에서 클래스와 객체는 캐릭터, 아이템, 환경 등을 체계적으로 관리하는 데 필수적이다.

추가 학습 자료