Introduce
OOP(Object-oriented programming)의 개념을 이해하고 객체, 상속자, 소멸자의 개념을 학습합니다.
class는 일종의 설계도와 같은 역할을 합니다. C에서 struct(구조체)와 거의 동일한 개념인데, 설계도에 필요한 멤버 변수와 멤버 함수들을 미리 정의해놓고, 필요에 따라 설계도를 바탕으로 객체(Object)를 만들어 사용합니다.
#include <iostream>
using namespace std;
class Knight
{
public: // 접근 지정자
int _hp; // 멤버 변수
int _attack;
int _posX;
int _posY;
public:
void Move(int x, int y); // 멤버 함수
void Attack();
void Die()
{
_hp = 0;
cout << "Dead" << endl;
}
};
int main()
{
Knight k1; // 객체 생성
k1.Move(2, 3);
k1.Attack();
k1.Die();
return 0;
}
void Knight::Move(int x, int y) //멤버 함수 정의
{
_posX = x;
_posY = y;
cout << "Move" << endl;
}
void Knight::Attack()
{
cout << "Attack" << _attack << endl;
}
Knight 클래스에는 4가지 멤버 변수, 3가지 멤버 함수가 존재합니다. 이들은 접근 지정자라는 것을 통해 접근 범위 또한 지정할 수 있습니다. 이것은 추후 상속(inheritance)에 관련해서 자세히 할 것입니다. 멤버 함수의 특징으로는 함수내에서 별도의 선언 없이 바로 멤버 변수를 사용할 수 있다는 것 입니다. 사실 멤버 변수를 사용할 때 this -> 가 생략되어 있기 때문입니다. this는 Knight * 즉 Knight 클래스 자기 자신을 가리키는 포인터입니다. 이를 통해 this -> _hp로 사용되어 멤버함수에서 멤버 변수를 접근할 수 있습니다.
생성자(Constructor)
클래스를 정의한 후 클래스 객체를 생성하게 되면 메모리에 할당됩니다. 이때 클래스의 멤버 변수는 초기화되지 않은 상태이므로 사용할 수 없습니다. C++에서는 객체의 생성과 동시에 멤버 변수를 초기화해주는 멤버 함수인 생성자(constructor)를 제공합니다. 생성자는 크게 3가지 종류의 생성자로 분류할 수 있습니다.
기본 생성자
위 예시에서는 별도의 생서자를 정의하지 않았는데도 컴파일이 문제없이 빌드가 되었습니다. C++에서는 생성자에 대한 정의를 하지 않으면, 컴파일러에서 기본 생성자가 자동으로 만들어줍니다. 생성자의 함수이름은 class 이름과 무조건 동일해야하는데, 매개변수의 타입과 개수에 따라 동일한 이름의 생성자를 여러가지 버전으로 만들 수 있습니다. 컴파일러는 기본 생성자외, 다른 생성자는 자동으로 만들어 주지않습니다. 이것으로 인해 생각지 못한 오류들이 발생합니다. 이를 주의해서 사용해야 합니다.
기타 생성자
기본 생성자에서 매개변수를 받으면서 멤버변수를 초기화하는 생성자입니다.
복사 생성자
자기 자신의 참조값을 매개변수를 받으면서 객체를 복사하는 기능을 하는 생성자입니다.
#include <iostream>
using namespace std;
class Knight
{
public:
int _hp;
int _attack;
int _posX;
int _posY;
public:
// 기본 생성자.
Knight()
{
cout << "Knight() Constructor" << endl;
_hp = 100;
_attack = 10;
_posX = 0;
_posY = 0;
}
// 기타 생성자 (매개변수 있다.)
Knight(int hp)
{
cout << "Knight (int hp) Constructor" << endl;
_hp = hp;
_attack = 10;
_posX = 0;
_posY = 0;
}
// 복사 생성자
Knight(const Knight &Knight)
{
_hp = Knight._hp;
_attack = Knight._attack;
_posX = Knight._posX;
_posY = Knight._posY;
}
~Knight() { cout << "Knight() Destructor" << endl; }
void Move(int x, int y);
void Attack();
void Die()
{
_hp = 0;
cout << "Dead" << endl;
}
};
int main()
{
Knight k1;
k1.Move(2, 3);
k1.Attack();
k1.Die();
Knight k2(50);
Knight k3(k1);
return 0;
}
void Knight::Move(int x, int y)
{
_posX = x;
_posY = y;
cout << "Move" << endl;
}
void Knight::Attack()
{
cout << "Attack " << _attack << endl;
}
======================실행 결과==========================
Knight() Constructor
Move
Attack 10
Dead
Knight (int hp) Constructor
Knight() Destructor
Knight() Destructor
Knight() Destructor
소멸자(Destructor)
생성자와 반대되는 개념으로 프로그램이 끝날때 class를 소멸시켜주는 역할을 합니다. 생성자와 다르게 오직 하나만 선언 가능 합니다.
// Destructor 선언. (Destructor오진 하나만 선언 가능.)
~Knight() { cout << "Knight() Destructor" << endl; }
위의 실행결과를 보면 Knight 객체 3개가 만들어졌고 종료될때 역시 3개의 객체가 소멸자에 의해 소멸되는 것을 찍어볼 수 있습니다.
'Language > C++' 카테고리의 다른 글
[C++] OOP(객체지향)의 특성 - 캡슐화(encapsulation) (0) | 2022.06.06 |
---|---|
[C++] OOP(객체지향)의 특성 - 상속성(inheritance) (0) | 2022.06.06 |
[C++] 참조 (0) | 2022.06.05 |
[C++] 포인터 실습 (0) | 2022.06.05 |
[C++] 포인터 (0) | 2022.06.05 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!