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

C++기초 7강: 클래스의 멤버변수와 함수

by oddsilk 2025. 1. 6.

안녕하세요, 여러분! 오늘은 클래스 내부의 멤버 변수와 함수에 대해 알아보겠습니다. 😊 이 개념은 객체 지향 프로그래밍에서 매우 중요한 기본 요소입니다. 우리가 앞으로 게임 캐릭터나 적처럼 객체를 설계하고 행동하게 만들 때 필수적인 기초라고 할 수 있습니다.


1️⃣ 멤버 변수와 함수란?

멤버 변수

멤버 변수는 클래스 안에 저장된 데이터를 말합니다. 예를 들어, 게임 캐릭터라면 체력, 이름, 공격력 같은 값들이 멤버 변수로 저장될 수 있습니다.

  • 쉽게 말해서: 캐릭터의 특성을 저장하는 그릇입니다.
  • 비유하자면: 캐릭터가 가진 가방 안에 "체력 물약", "무기", "아이템" 같은 것을 넣는다고 생각하면 됩니다. 이 가방이 바로 멤버 변수입니다.

멤버 함수

멤버 함수는 클래스가 수행할 수 있는 동작을 정의합니다. 예를 들어, 공격력을 계산하거나 체력을 감소시키는 기능들이 멤버 함수가 됩니다.

  • 쉽게 말해서: 캐릭터의 행동을 정의합니다.
  • 비유하자면: 캐릭터가 "공격하기", "아이템 사용하기", "달리기" 같은 행동을 하는 버튼이라고 보면 됩니다.

 

2️⃣ 예시: 캐릭터 클래스에 공격력 계산 함수 추가하기

이제 멤버 변수와 멤버 함수의 개념을 더 잘 이해하기 위해 예제를 만들어 보겠습니다. 여러분이 게임에서 사용할 "캐릭터" 클래스를 만들어 보죠!

요구사항

  1. 캐릭터의 이름과 기본 공격력(멤버 변수)을 저장합니다.
  2. 캐릭터의 공격력을 계산하여 출력하는 멤버 함수를 작성합니다.

3️⃣ 코드 예제

아래는 간단한 C++ 코드입니다. 이 코드는 캐릭터 클래스에서 이름과 기본 공격력을 저장하고, 공격력을 계산하여 출력합니다.

#include <iostream>
#include <string>

using namespace std;

// 캐릭터 클래스 정의
class Character 
{
private:
    string name; // 캐릭터 이름
    int baseAttackPower; // 기본 공격력

public:
    // 생성자: 캐릭터 초기화
    Character(string charName, int attackPower) 
    {
        name = charName;
        baseAttackPower = attackPower;
    }

    // 공격력 계산 함수
    int calculateAttackPower(int bonusPower) 
    {
        return baseAttackPower + bonusPower;
    }

    // 캐릭터 정보 출력 함수
    void displayCharacterInfo() 
    {
        cout << "캐릭터 이름: " << name << endl;
        cout << "기본 공격력: " << baseAttackPower << endl;
    }
};

int main() 
{
    // 캐릭터 객체 생성
    Character hero("용사", 50);

    // 캐릭터 정보 출력
    hero.displayCharacterInfo();

    // 공격력 계산 및 출력
    int bonus = 20;
    cout << "보너스 포함 공격력: " << hero.calculateAttackPower(bonus) << endl;

    return 0;
}

4️⃣ 코드 설명

  1. 멤버 변수
    • name: 캐릭터 이름을 저장합니다.
    • baseAttackPower: 기본 공격력을 저장합니다.
  2. 멤버 함수
    • calculateAttackPower: 보너스 공격력을 더해 최종 공격력을 계산합니다.
    • displayCharacterInfo: 캐릭터의 정보를 출력합니다.
  3. 생성자
    클래스가 생성될 때 멤버 변수(name, baseAttackPower)를 초기화합니다.

5️⃣ 실무에서 확장 가능성

  • 위 코드를 기반으로 캐릭터의 체력 관리 함수, 방어력 계산 함수, 아이템 적용 함수 등을 추가할 수 있습니다.
  • 언리얼 엔진에서는 이런 클래스를 Actor나 Pawn에 연결하여 실제 게임 캐릭터를 구현하게 됩니다.

 

6️⃣ 연습 과제

  1. calculateAttackPower 함수에 공격력을 무작위로 증가시키는 기능을 추가해 보세요!
    • 힌트: rand() 함수를 사용할 수 있습니다.
  2. Character 클래스에 방어력 멤버 변수와 방어력 계산 함수를 추가해 보세요.
#include <iostream>
#include <string>
#include <cstdlib> // rand() 함수 사용
#include <ctime>   // srand() 초기화

using namespace std;

// 캐릭터 클래스 정의
class Character 
{
private:
    string name;          // 캐릭터 이름
    int baseAttackPower;  // 기본 공격력
    int defense;          // 방어력

public:
    // 생성자: 캐릭터 초기화
    Character(string charName, int attackPower, int defensePower) 
    {
        name = charName;
        baseAttackPower = attackPower;
        defense = defensePower;
    }

    // 공격력 계산 함수: 무작위 보너스 포함
    int calculateAttackPower() 
    {
        int randomBonus = rand() % 11; // 0~10 사이의 무작위 보너스
        return baseAttackPower + randomBonus;
    }

    // 방어력 계산 함수
    int calculateDefensePower() 
    {
        return defense + 5; // 방어력을 5 증가시켜 반환
    }

    // 캐릭터 정보 출력 함수
    void displayCharacterInfo() 
    {
        cout << "캐릭터 이름: " << name << endl;
        cout << "기본 공격력: " << baseAttackPower << endl;
        cout << "기본 방어력: " << defense << endl;
    }
};

int main() 
{
    // 랜덤 시드 초기화 (무작위 값 생성을 위해 필요)
    srand(static_cast<unsigned int>(time(0)));

    // 캐릭터 객체 생성
    Character hero("용사", 50, 30);

    // 캐릭터 정보 출력
    hero.displayCharacterInfo();

    // 무작위 보너스 포함 공격력 출력
    cout << "보너스 포함 공격력: " << hero.calculateAttackPower() << endl;

    // 방어력 계산 및 출력
    cout << "방어력 (5 추가): " << hero.calculateDefensePower() << endl;

    return 0;
}

실행 결과 예시

랜덤 보너스 값은 매번 다르게 출력됩니다. 아래는 실행 결과의 한 예시입니다:

코드 복사
캐릭터 이름: 용사 기본 공격력: 50 기본 방어력: 30 보너스 포함 공격력: 55 방어력 (5 추가): 35

연습 확장

  1. 특수 능력 추가: 캐릭터 클래스에 "치명타 확률"을 추가하고, 치명타가 발생하면 공격력을 두 배로 반환하도록 코드를 수정해 보세요.
  2. 적 클래스 생성: 적(Enemy) 클래스를 만들어 용사와 적이 서로 싸우는 기능을 추가해 보세요.
#include <iostream>
#include <string>
#include <cstdlib> // rand() 함수 사용
#include <ctime>   // srand() 초기화

using namespace std;

// 캐릭터 클래스 정의
class Character 
{
protected:
    string name;          // 캐릭터 이름
    int health;           // 체력
    int baseAttackPower;  // 기본 공격력
    int defense;          // 방어력
    float criticalChance; // 치명타 확률 (0.0 ~ 1.0)

public:
    // 생성자: 캐릭터 초기화
    Character(string charName, int hp, int attackPower, int defensePower, float critChance) 
    {
        name = charName;
        health = hp;
        baseAttackPower = attackPower;
        defense = defensePower;
        criticalChance = critChance;
    }

    // 공격력 계산 함수 (치명타 적용)
    int calculateAttackPower() 
    {
        int attackPower = baseAttackPower;
        if (static_cast<float>(rand()) / RAND_MAX < criticalChance) 
        {
            cout << name << "의 치명타 발생! 공격력이 두 배로 증가합니다!" << endl;
            attackPower *= 2; // 치명타로 공격력 두 배
        }
        return attackPower;
    }

    // 방어력 적용 후 데미지 받기
    void takeDamage(int damage) 
    {
        int reducedDamage = damage - defense;
        if (reducedDamage < 0) 
            reducedDamage = 0;

        health -= reducedDamage;
        cout << name << "이(가) " << reducedDamage << " 데미지를 받았습니다! 남은 체력: " << health << endl;
    }

    // 캐릭터 정보 출력
    void displayCharacterInfo() 
    {
        cout << "캐릭터 이름: " << name << endl;
        cout << "체력: " << health << endl;
        cout << "기본 공격력: " << baseAttackPower << endl;
        cout << "방어력: " << defense << endl;
        cout << "치명타 확률: " << criticalChance * 100 << "%\n" << endl;
    }

    // 캐릭터가 살아 있는지 확인
    bool isAlive() 
    {
        return health > 0;
    }
};

// 적 클래스 정의 (캐릭터 클래스 상속)
class Enemy : public Character 
{
public:
    Enemy(string charName, int hp, int attackPower, int defensePower, float critChance)
        : Character(charName, hp, attackPower, defensePower, critChance) 
    {
    }
};

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

    // 플레이어와 적 객체 생성
    Character hero("용사", 100, 20, 5, 0.2f); // 치명타 확률 20%
    Enemy enemy("슬라임", 50, 10, 2, 0.1f);  // 치명타 확률 10%

    // 캐릭터 정보 출력
    hero.displayCharacterInfo();
    enemy.displayCharacterInfo();

    // 전투 루프
    while (hero.isAlive() && enemy.isAlive()) 
    {
        // 플레이어가 적을 공격
        cout << "\n" << hero.name << "의 공격!" << endl;
        int heroAttack = hero.calculateAttackPower();
        enemy.takeDamage(heroAttack);

        if (!enemy.isAlive()) 
        {
            cout << enemy.name << "이(가) 쓰러졌습니다! 전투에서 승리했습니다!" << endl;
            break;
        }

        // 적이 플레이어를 공격
        cout << "\n" << enemy.name << "의 공격!" << endl;
        int enemyAttack

결론

멤버 변수와 함수는 객체의 특성과 행동을 정의하는 데 필수적입니다. 이 기본기를 잘 익히면 복잡한 게임 로직도 차근차근 구현할 수 있습니다. 다음 시간에는 이 개념을 활용해 클래스 간 상호작용을 배우도록 하겠습니다. 그럼, 즐거운 코딩 시간 되세요! 😄