클래스란 객체를 만들기 위한 설계도 또는 청사진 이라고 할 수 있다. 클래스는 데이터와 메서드를 정의하고, 이를 통해 객체를 생성하는 틀 역할을 한다.
객체는 클래스를 사용해 실제로 만들어낸 실체이다. 클래스라는 설계도를 통해 만들어진 물건이라고 할 수 있다.
생성자는 객체가 생성될 때 호출되는 함수로, 객체의 초기화 작업을 수행한다. 클래스의 이름과 동일한 이름을 가지며, 반환형이 없다. 생성자를 통해 객체의 초기 상태를 설정할 수 있다. 또한 매개변수를 가진 일반 생성자가 있다면 기본 생성자를 선언하지 않으면 기본 생성자로 객체를 생성할 수 없다. 생성자는 오버로딩이 가능하며 여러 생성자를 정의할 수 있다.
소멸자는 객체가 소멸될 때 호출되는 함수로, 객체가 사용했던 자원을 해제하는 작업을 수행한다. 주로 동적으로 할당된 메모리를 해제하거나, 파일을 닫는 등의 정리 작업에 사용된다. 소멸자는 ~ 기호와 함께 클래스 이름을 사용하여 정의한다. 소멸자는 매개변수를 가질 수 없고 객체가 스코프를 벗어나거나 delete로 삭제될 때 자동으로 호출된다. 소멸자는 오버로딩이 불가능하며, 클래스당 하나만 가질 수 있다.
오버로딩은 같은 이름의 함수를 여러 개 정의하여 매개변수에 따라 다른 동작을 하게 만드는 방법이다. 함수의 매개변수의 타입이나 개수가 다르면 동일한 이름으로 여러 개의 함수를 정의할 수 있다.
함수 이름은 같지만 매개변수의 개수나 타입이 달라야하며, 컴파일러는 함수 호출 시 전달된 매개변수에 맞는 함수를 자동으로 선택한다. 주로 함수의 이름을 일관되게 유지하면서, 다양한 입력에 대해 다른 동작을 제공하고 싶을 때 사용한다.
오버라이딩과 굉장히 헷갈리는데 오버라이딩은 상속 관계에서 사용되니 상속에서 다루도록 하자.
같은 이름 오버로딩
재정의 오버라이딩
// 클래스
class Player{
public:
// 기본 생성자(Constructor)
Player()
{
hp = 0;
attack = 0;
cout << "생성자" << '\n';
}
// 기타 생성자, 일반 생성자 (Parameterized Constructor)
Player(int hp, int attack)
{
this->hp = hp;
this->attack = attack;
cout << "기타 생성자" << '\n';
}
// 복사 생성자 (Copy Constructor)
Player(const Player& other)
{
this->hp = other.hp;
this->attack = attack.attack;
cout << "복사 생성자" << '\n';
}
// 소멸자(Destructor)
~Player()
{
cout << "소멸자" << '\n';
}
// 멤버 함수
void Attack() {
cout << "Attack" << '\n';
}
// 오버로딩
void Attack(int attack) {
cout << attack << "Damage만큼 Attack" << '\n';
}
public:
// 멤버 변수
int hp;
int attack;
}
int main() {
// 객체
Player p1;
p1.hp = 100;
p1.attack = 10;
p1.Attack();
Player p2(100, 10);
p2.attack(p1.attack);
}