이 코드 예제는 C++에서 클래스와 객체 지향 프로그래밍의 핵심 개념인 캡슐화, 접근 지정자, 그리고 객체 간의 상호작용을 설명하는 데 사용됩니다. 각 클래스의 구현과 예제를 분석하여 주석과 함께 자세히 설명해 보겠습니다.
Player0
클래스class Player0
{
int health;
int power;
};
설명:
Player0
클래스는 두 개의 멤버 변수 health
와 power
를 포함하고 있지만, 이 클래스는 기본적으로 private
접근 지정자를 사용합니다. 즉, 클래스 외부에서 이 변수들에 접근할 수 없습니다.주석:
private
접근 지정자를 사용합니다. private
멤버는 클래스 내부에서만 접근 가능하며, 외부에서는 접근할 수 없습니다.코드 예시:
{
// Player0 player0{ 100, 200 }; // 안 됨: 생성자가 없으며, 멤버가 private이므로 직접 초기화 불가능
// player0.health = 100; // 안 됨: health가 private 멤버이기 때문에 접근 불가
}
Player1
클래스class Player1
{
public: // 접근 지정자
int headlth;
int power;
};
설명:
Player1
클래스는 public
접근 지정자를 사용하여 headlth
와 power
멤버 변수에 대한 접근을 허용합니다. 클래스 외부에서도 이 변수들에 자유롭게 접근할 수 있습니다.주석:
public
접근 지정자를 사용하면 클래스 외부에서도 해당 멤버 변수에 접근할 수 있습니다. 이는 외부 코드가 멤버 변수의 값을 직접 변경할 수 있다는 의미입니다.코드 예시:
{
Player1 player1{ 100, 200 }; // 가능: 생성자가 자동 생성되며, 멤버 변수에 직접 접근 가능
player1.headlth = 200; // 가능: headlth가 public 멤버이기 때문에 접근 가능
}
Player2
클래스class Player2
{
public:
int health;
private:
int power;
};
설명:
Player2
클래스는 health
변수는 public
으로, power
변수는 private
으로 선언되어 있습니다. 따라서 health
는 클래스 외부에서 접근할 수 있지만, power
는 접근할 수 없습니다.주석:
public
과 private
접근 지정자를 혼합하여 사용할 수 있습니다. 이는 멤버 변수 또는 함수의 가시성을 세밀하게 조절할 수 있게 해줍니다.코드 예시:
{
Player2 player2;
// player2.power = 300; // 안 됨: power가 private 멤버이기 때문에 접근 불가
}
Player3
클래스class Player3
{
public:
int _health;
int _power;
string _name;
public:
void attack(Player3& target)
{
cout << "Attack " << _name << "->" << target._name << endl;
target.damaged(_power);
}
void damaged(int power)
{
_health -= power;
if (_health <= 0)
cout << "Died " << _name << endl;
}
};
설명:
Player3
클래스는 public
접근 지정자를 사용하여 모든 멤버 변수와 함수에 대한 접근을 허용합니다. 이 클래스는 다른 Player3
객체를 공격할 수 있는 attack
함수와, 공격을 받았을 때 체력을 감소시키는 damaged
함수를 포함합니다.주석:
public
으로 선언되어 있기 때문에, 클래스 외부에서 이 변수들에 직접 접근하고 수정할 수 있습니다. 이는 객체의 무결성을 위협할 수 있습니다.attack
함수는 다른 Player3
객체를 공격하고, damaged
함수는 공격을 받아 체력을 감소시키는 역할을 합니다. 객체 간의 상호작용이 직접적으로 구현되어 있습니다.코드 예시:
{
Player3 david{ 200, 100, "David" };
Player3 daniel{ 200, 100, "Daniel" };
daniel._health -= 300;
// daniel의 health가 0 이하가 됐음에도 죽었다는 메시지가 발생하지 않음
// 멤버 변수를 노출하게 되면 이렇게 객체의 무결성이 깨지는 상태가 발생할 가능성이 높아짐
}
daniel._health -= 300;
처럼 클래스 외부에서 멤버 변수를 직접 수정하면, damaged
함수가 호출되지 않아 객체의 상태가 예상과 다르게 변경될 수 있습니다. 이는 객체지향의 기본 원칙인 캡슐화가 지켜지지 않았기 때문입니다.Player4
클래스class Player4
{
private:
int _health;
int _power;
string _name;
public:
Player4(int health, int power, string name)
{
_health = health;
_power = power;
_name = name;
}
void attack(Player4& target)
{
cout << "Attack " << _name << "->" << target._name << endl;
target.damaged(_power);
}
void damaged(int power)
{
_health -= power;
if (_health <= 0)
cout << "Died " << _name << endl;
}
};
설명:
Player4
클래스는 멤버 변수를 private
으로 선언하여 외부에서 직접 접근할 수 없도록 합니다. 대신 생성자를 통해 초기화하며, attack
과 damaged
함수로만 객체의 상태를 변경할 수 있습니다.주석:
private
으로 선언하여 클래스 외부에서의 직접 접근을 제한하고, 객체의 무결성을 보호합니다. 객체의 상태는 오직 클래스 내부의 함수들을 통해서만 변경될 수 있습니다.코드 예시:
{
Player4 david{ 200, 100, "David" };
Player4 daniel{ 200, 100, "Daniel" };
// daniel._health -= 300; // 불가능하다: health가 private 멤버이기 때문에 직접 접근 불가
david.attack(daniel); // Attack David->Daniel
david.attack(daniel); // Died Daniel
}
Player4
클래스에서는 daniel._health -= 300;
과 같은 직접적인 변수 수정이 불가능하므로, 객체의 상태가 attack
과 damaged
함수에 의해 올바르게 관리됩니다. 이렇게 함으로써 객체의 무결성이 유지됩니다.이 코드 예제는 C++의 클래스와 객체 지향 프로그래밍의 중요한 개념을 다루고 있습니다. 캡슐화는 클래스의 중요한 원칙으로, 객체의 내부 상태를 보호하고, 객체의 상태가 외부로부터 안전하게 유지되도록 합니다. Player4
클래스는 이를 잘 보여주며, 객체의 무결성을 지키기 위해 멤버 변수를 private
으로 선언하고, 이를 수정하는 함수를 제공하는 것이 좋습니다.
반면에, Player3
클래스처럼 멤버 변수를 public
으로 노출시키는 것은 객체의 무결성을 위험에 빠뜨릴 수 있습니다. 이러한 문제를 피하기 위해서는 멤버 변수에 대한 직접적인 접근을 제한하고, 필요한 경우 적절한 함수를 통해서만 객체의 상태를 수정하도록 설계하는 것이 좋습니다. 이러한 설계 원칙을 따르면, 더 안전하고 유지보수하기 쉬운 코드를 작성할 수 있습니다.