안녕하세요, 여러분! 오늘은 클래스 내부의 멤버 변수와 함수에 대해 알아보겠습니다. 😊 이 개념은 객체 지향 프로그래밍에서 매우 중요한 기본 요소입니다. 우리가 앞으로 게임 캐릭터나 적처럼 객체를 설계하고 행동하게 만들 때 필수적인 기초라고 할 수 있습니다.
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️⃣ 코드 설명
- 멤버 변수
- name: 캐릭터 이름을 저장합니다.
- baseAttackPower: 기본 공격력을 저장합니다.
- 멤버 함수
- calculateAttackPower: 보너스 공격력을 더해 최종 공격력을 계산합니다.
- displayCharacterInfo: 캐릭터의 정보를 출력합니다.
- 생성자
클래스가 생성될 때 멤버 변수(name, baseAttackPower)를 초기화합니다.
5️⃣ 실무에서 확장 가능성
- 위 코드를 기반으로 캐릭터의 체력 관리 함수, 방어력 계산 함수, 아이템 적용 함수 등을 추가할 수 있습니다.
- 언리얼 엔진에서는 이런 클래스를 Actor나 Pawn에 연결하여 실제 게임 캐릭터를 구현하게 됩니다.
6️⃣ 연습 과제
- calculateAttackPower 함수에 공격력을 무작위로 증가시키는 기능을 추가해 보세요!
- 힌트: rand() 함수를 사용할 수 있습니다.
- 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
연습 확장
- 특수 능력 추가: 캐릭터 클래스에 "치명타 확률"을 추가하고, 치명타가 발생하면 공격력을 두 배로 반환하도록 코드를 수정해 보세요.
- 적 클래스 생성: 적(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
결론
멤버 변수와 함수는 객체의 특성과 행동을 정의하는 데 필수적입니다. 이 기본기를 잘 익히면 복잡한 게임 로직도 차근차근 구현할 수 있습니다. 다음 시간에는 이 개념을 활용해 클래스 간 상호작용을 배우도록 하겠습니다. 그럼, 즐거운 코딩 시간 되세요! 😄
'개발이야기 > C++' 카테고리의 다른 글
C++기초 6강: 클래스와 객체 (0) | 2024.12.13 |
---|---|
C++기초 5강: 함수: 코드의 조각을 만들고 재활용하기 (0) | 2024.12.13 |
C++기초 4강: 데이터타입과 기초문법 총정리 (1) | 2024.12.10 |
C++기초: 3강 - 첫번째 프로그램 만들기 (0) | 2024.12.03 |
C++기초: 2강-컴파일과 실행의 과정 이해 (0) | 2024.12.02 |