내일배움캠프 언리얼

객체 지향 프로그래밍(2)

lgbl 2025. 1. 22. 19:17
  • 다형성

  다형성은 하나의 타입으로 여러개의 객체를 가리킬 수 있는 특성이며 부모 클래스의 포인터로 자식 클래스의 객체를 가리킬 수 있어 자식 클래스들을 부모 클래스의 포인터 배열로 통합 관리가 가능하다.

 

예를들어 강아지와 고양이를 만들고 그 객체들이 울게 만들면 dog.soundplay, cat.soundplay 등등 객체가 만들어지면 만들어질 수록 적어야 할 것들이 늘어나지만 자식 객체에 부모 객체의 포인터 변수를 담게되면 

int main()
{
	Animal* dog = new Dog("강아지", "멍멍", 100);
	Animal* cat = new Cat("고양이", "야옹", 100);

	Animal* animals[2] = {dog, cat};
	for (int i = 0; i < 2; i++)
	{
		animals[i]->SoundPlay();
	}

	return 0;
}

  이러한 방식으로 반복문을 구현할 수 있게 된다. Animal 포인터 변수를 사용한다면, Dog와 Cat의 포인터를 공통된 자료형으로 취급이 가능하다.

 

  • 추상화

  추상화는 공통된 특징을 추출해 상위 개념으로 표현하는 것으로 부모 클래스에서 기능을 순수 가상함수로 선언하면 함수의 구현을 강제로 자식 클래스에게 위임할 수 있다.

추상화 된 클래스에서 공통된 인터페이스를 제공하면서 실제 구현부는 이를 상속받는 각각의 클래스에 맞는 방식으로 작성될 수 있다.

 

  예를들어 Animal에는 걷는다는 개념을 추상화하고 실제로 어떻게 걸을지는 각 동물 클래스가 구현하게끔 해본다. virtual 키워드를 붙이고 구현부를 0으로 표현한다면 순수 가상함수가 된다. 순수 가상함수는 함수의 선언만 있고 구현은 없는 함수로 순수 가상함수를 하나라도 가지고 있는 클래스는 추상 클래스가 된다.

 

  추상 클래스는 객체로 생성될 수 없으며 오로지 상속 용도로만 사용이 가능하다. 또한 추상 클래스를 상속받는 자식 클래스는 반드시 순수 가상함수를 구현해야만 하며 override 키워드를 통해 부모 클래스의 가상함수를 재정의 할 수 있다.

 

  부모 클래스의 멤버가 private이면 자식 클래스에서 접근할 수 없으니 자식 클래스만 접근이 가능한 protected를 사용해야한다.

 

#include <iostream>
using namespace std;

class Animal
{
protected:
	string name;
	string sound;
	int hp;

public:
	Animal(string _name, string _sound, int _hp)
	{
		name = _name;
		sound = _sound;
		hp = _hp;
	}

	void SoundPlay()
	{
		cout << name << ": " << sound << endl;
	} 

	virtual void Walk() = 0;
};

class Dog : public Animal
{
public:
	Dog(string _name, string _sound, int _hp) : Animal(_name, _sound, _hp)
	{
	}

	void Walk() override
	{
		cout << name << "가 터벅터벅 걷는다." << endl;
	}
};

class Cat : public Animal
{
public:
	Cat(string _name, string _sound, int _hp) : Animal(_name, _sound, _hp)
	{
	}

	void Walk() override
	{
		cout << name << "가 살금살금 걷는다." << endl;
	}
};

 

 

  • 인터페이스

인터페이스는 순수 가상함수만 가지는 추상 클래스이며 멤버 변수 또한 없다. 

class IAnimal
{
public:
	virtual void SoundPlay() = 0;
	virtual void Walk() = 0;
};

이와 같은 인터페이스는 I를 붙여주고, IAnimal을 만들어 SoundPlay, Walk의 가상함수를 저장하며 인터페이스만 지키게 되면 새로운 동물이 추가가 가능해진다.

'내일배움캠프 언리얼' 카테고리의 다른 글

WIL  (0) 2025.02.04
C++ 클래스(1)  (0) 2025.01.24
객체 지향 프로그래밍(1)  (3) 2025.01.21
10조 KPT 회고  (0) 2025.01.17
비전공자의 C++ 개발시점 6 (2025.01.02)  (2) 2025.01.02