[C++] 객체지향 프로그래밍(OOP, Object-Oriented Programming)

강한·2024년 11월 19일

CPP

목록 보기
4/18
post-thumbnail

클래스 (Class)

클래스란 객체를 만들기 위한 설계도 또는 청사진 이라고 할 수 있다. 클래스는 데이터와 메서드를 정의하고, 이를 통해 객체를 생성하는 틀 역할을 한다.

객체 (Instance)

객체는 클래스를 사용해 실제로 만들어낸 실체이다. 클래스라는 설계도를 통해 만들어진 물건이라고 할 수 있다.

생성자 (Constructor)

생성자는 객체가 생성될 때 호출되는 함수로, 객체의 초기화 작업을 수행한다. 클래스의 이름과 동일한 이름을 가지며, 반환형이 없다. 생성자를 통해 객체의 초기 상태를 설정할 수 있다. 또한 매개변수를 가진 일반 생성자가 있다면 기본 생성자를 선언하지 않으면 기본 생성자로 객체를 생성할 수 없다. 생성자는 오버로딩이 가능하며 여러 생성자를 정의할 수 있다.

소멸자 (Destructor)

소멸자는 객체가 소멸될 때 호출되는 함수로, 객체가 사용했던 자원을 해제하는 작업을 수행한다. 주로 동적으로 할당된 메모리를 해제하거나, 파일을 닫는 등의 정리 작업에 사용된다. 소멸자는 ~ 기호와 함께 클래스 이름을 사용하여 정의한다. 소멸자는 매개변수를 가질 수 없고 객체가 스코프를 벗어나거나 delete로 삭제될 때 자동으로 호출된다. 소멸자는 오버로딩이 불가능하며, 클래스당 하나만 가질 수 있다.

오버로딩 (Overloading)

오버로딩은 같은 이름의 함수를 여러 개 정의하여 매개변수에 따라 다른 동작을 하게 만드는 방법이다. 함수의 매개변수의 타입이나 개수가 다르면 동일한 이름으로 여러 개의 함수를 정의할 수 있다.
함수 이름은 같지만 매개변수의 개수나 타입이 달라야하며, 컴파일러는 함수 호출 시 전달된 매개변수에 맞는 함수를 자동으로 선택한다. 주로 함수의 이름을 일관되게 유지하면서, 다양한 입력에 대해 다른 동작을 제공하고 싶을 때 사용한다.

오버라이딩과 굉장히 헷갈리는데 오버라이딩은 상속 관계에서 사용되니 상속에서 다루도록 하자.
같은 이름 오버로딩
재정의 오버라이딩

// 클래스
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);
}
profile
의지 강한 게임개발자

0개의 댓글