반응형
[lv3/C++] 클래스와 객체
객체지향 프로그래밍의 뿌리 클래스와 객체를 알아보자. 객체라는 단어를 사전에서 찾아보면 실제 세계에 존재하거나 생각할 수 있는 것이라고 나온다. 객체지향 이론에서는 개념이나 논리와 같은 무형적인 것들도 객체로 간주하는데 프로그램을 배울 때는 개념 잡기가 힘들다. 클래스는 쉽게 말해 객체를 찍어낼 수 있는 틀이라고 할 수 있다. 과거 한 교수님은 붕어빵 틀에 빗대어 가르치시곤 했는데 지금까지도 기억나는 것을 보니 잘 빗대어 가르치셨다고 생각되지만 붕어빵 예시는 들지 않겠다.
스무고개라는 어릴적 놀이를 기억하는지 모르겠지만, 우리는 스무고개를 할 때 어떤 것의 특징을 묻는다. 주제가 인물이라면 나이가 몇인지, 무슨 일을 하는지, 어떤 것을 먹는지 등을 물어보고 정답을 맞출 것이다. 객체지향 언어에서도 마찬가지로 객체를 설계할 때 그 객체가 갖는 속성이나 행동들을 클래스로 정의하게 된다. 잘 설계된 클래스는 개별적인 속성들을 가진 객체를 쉽게 만들 수 있는데, 예를 들어 비슷한 속성을 가진 2개의 객체를 만든다고 하면 { 24, 한국, 홍길동, ENTP }, { 30, 한국, 전우치, ENFJ }를 클래스로 설계할 수 있을 것이다.
class 인물 {
public :
int 나이;
int 국가;
string 이름;
string MBTI;
void 먹기(string 음식);
}
class 클래스이름
{
접근 지정자 : // private, protected, public
멤버변수
멤버함수
}
다른 예시로 몬스터 클래스를 정의하고 객체를 두개 생성하여 사용하는 방법을 확인해보자.
#include <iostream>
using namespace std;
class Monster {
private : // 접근지정자 private : 클래스 자신 및 친구(friend)라 선언한 클래스만 접근 가능
int health; // 멤버변수 체력
public : // 모든 클래스 접근 가능
void setHealth(int h) { // 체력 설정
health = h;
}
int getHealth() { // 현재 체력 가져오기
return health; // 체력 반환
}
void hit(int damage) { // 체력 깍기
health -= damage;
cout << damage << "의 데미지를 받았습니다. 현재 체력 : " << health << endl;
if (health <= 0) {
cout << "죽음" << endl;
}
}
};
int main()
{
Monster MonsterA; // MonsterA 객체 생성
Monster MonsterB; // MonsterB 객체 생성
MonsterA.setHealth(100); // MonsterA 객체 체력 설정
MonsterB.setHealth(50); // MonsterB 객체 체력 설정
cout << "MonsterA H = " << MonsterA.getHealth() << endl;
cout << "MonsterB H = " << MonsterB.getHealth() << endl;
MonsterA.hit(50); // MonsterA 객체 체력 50 깍기
cout << "MonsterA H = " << MonsterA.getHealth() << endl;
cout << "MonsterB H = " << MonsterB.getHealth() << endl;
MonsterB.hit(50); // MonsterB 객체 체력 50 깍기
cout << "MonsterA H = " << MonsterA.getHealth() << endl;
cout << "MonsterB H = " << MonsterB.getHealth() << endl;
return 0;
}
위 예시에서 A의 체력과 B의 체력을 유심히 살펴보면 알 수 있듯이 같은 클래스로 객체를 생성해도 각각 다른 값을 가지고 있게된다.
반응형
'Programming > C, C++' 카테고리의 다른 글
C++ 오류 해결 Error:C4996, strcpy, strncpy 사용시 에러 발생 (0) | 2022.11.16 |
---|---|
LV3 C++ 접근지정자 (0) | 2022.09.21 |
LV2 C++ 인라인(Inline) 함수 (0) | 2022.09.13 |
LV2 C++ 재귀(recursion) 호출 (0) | 2022.09.13 |
LV2 C++ 값에 의한 호출(Call by Value)과 참조에 의한 호출(Call by Reference) (0) | 2022.09.13 |