[CH2/02] solution

๊น€์—ฌ์šธยท2025๋…„ 6์›” 16์ผ
0

๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

๋ชฉ๋ก ๋ณด๊ธฐ
23/114

[CH2/02] OOP Summary

๐Ÿ“Ž [CH2/02] OOP Summary
๐Ÿ“Ž [Notion] OOP Summary

์š”๊ตฌ์‚ฌํ•ญ

๊ฐœ๋ฐœ ํ”„๋กœ์„ธ์Šค ๊ฐ€์ด๋“œ

  1. ๊ณตํ†ต ์†์„ฑ ์ฐพ์•„๋‚ด๊ธฐ

  2. ๊ธฐ๋ณธ ํด๋ž˜์Šค ์ •์˜
  • ํ•„์š”ํ•œ ๋ถ€๋ถ„ ๊ฐ€์ƒ ํ•จ์ˆ˜๋กœ ์ง€์ •
  • ์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜ -> ์ถ”์ƒ ํด๋ž˜์Šค, ํŒŒ์ƒ ํด๋ž˜์Šค์—์„œ ์žฌ์ •์˜
  1. ์„œ๋ธŒ ํด๋ž˜์Šค ์ •์˜
  • ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ์ƒ์† ๋ฐ›์€ ํด๋ž˜์Šค๋“ค์„ ์ •์˜, ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•ด ๋‹ค์–‘ํ•œ ํ–‰๋™ ๊ตฌํ˜„

ํ•„์ˆ˜ ๊ธฐ๋Šฅ

  1. Animal์ด๋ผ๋Š” ๊ธฐ๋ณธ ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  2. Animal ํด๋ž˜์Šค์—๋Š” makeSound()๋ผ๋Š” ์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  3. Animal ํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๋‹ค์–‘ํ•œ ๋™๋ฌผ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ) Dog, Cat, Cow
  4. ๊ฐ ํด๋ž˜์Šค์—์„œ makeSound() ํ•จ์ˆ˜๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ๋‹ค์–‘ํ•œ ๋™๋ฌผ์˜ ์†Œ๋ฆฌ๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  5. ๋ฉ”์ธ ํ•จ์ˆ˜์—์„œ Animal ํƒ€์ž…์˜ ํฌ์ธํ„ฐ ๋ฐฐ์—ด์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
  6. Dog, Cat, Cow ์ž๋ฃŒํ˜•์˜ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ , ๋ฐฐ์—ด์— ์ €์žฅํ•ด๋ด…๋‹ˆ๋‹ค.
  7. Animal ๋ฐฐ์—ด์„ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ๊ฐ ๋™๋ฌผ์˜ ์šธ์Œ์†Œ๋ฆฌ๋ฅผ ๋‚ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๋„์ „ ๊ธฐ๋Šฅ ๊ฐ€์ด๋“œ

  • ํ•„์ˆ˜ ๊ธฐ๋Šฅ ๊ฐ€์ด๋“œ์— ์žˆ๋Š” ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค๋ฉด,
    ์•„๋ž˜ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ๋ณด๊ณ  ์š”๊ตฌ์‚ฌํ•ญ๋Œ€๋กœ Zoo ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•ด์ฃผ์„ธ์š”!
class Zoo {
private:
    Animal* animals[10]; // ๋™๋ฌผ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ ๋ฐฐ์—ด
public:
    // ๋™๋ฌผ์„ ๋™๋ฌผ์›์— ์ถ”๊ฐ€ํ•˜๋Š” ํ•จ์ˆ˜
    // - Animal ๊ฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ›์•„ ํฌ์ธํ„ฐ ๋ฐฐ์—ด์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    // - ๊ฐ™์€ ๋™๋ฌผ์ด๋ผ๋„ ์—ฌ๋Ÿฌ ๋ฒˆ ์ถ”๊ฐ€๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    // - ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜: Animal* (์ถ”๊ฐ€ํ•  ๋™๋ฌผ ๊ฐ์ฒด)
    // - ๋ฐ˜ํ™˜๊ฐ’: ์—†์Œ
    void addAnimal(Animal* animal);

    // ๋™๋ฌผ์›์— ์žˆ๋Š” ๋ชจ๋“  ๋™๋ฌผ์˜ ํ–‰๋™์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜
    // - ๋ชจ๋“  ๋™๋ฌผ ๊ฐ์ฒด์— ๋Œ€ํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ์†Œ๋ฆฌ๋ฅผ ๋‚ด๊ณ  ์›€์ง์ด๋Š” ๋™์ž‘์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    // - ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜: ์—†์Œ
    // - ๋ฐ˜ํ™˜๊ฐ’: ์—†์Œ
    void performActions();

    // Zoo ์†Œ๋ฉธ์ž
    // - Zoo ๊ฐ์ฒด๊ฐ€ ์†Œ๋ฉธ๋  ๋•Œ, ๋™๋ฌผ ๋ฒกํ„ฐ์— ์ €์žฅ๋œ ๋ชจ๋“  ๋™๋ฌผ ๊ฐ์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ฉ๋‹ˆ๋‹ค.
    // - ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋™์  ํ• ๋‹น๋œ Animal ๊ฐ์ฒด๋ฅผ `delete` ํ•ฉ๋‹ˆ๋‹ค.
    // - ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜: ์—†์Œ
    // - ๋ฐ˜ํ™˜๊ฐ’: ์—†์Œ
    ~Zoo();
};
  • ๋™๋ฌผ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” createRandomAnimal()ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜์„ธ์š” ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์•„๋ž˜ ์ฝ”๋“œ ์Šค๋‹ˆํŽซ์„ ์ฐธ์กฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!
#include <cstdlib>
#include <ctime>

// ๋žœ๋ค ๋™๋ฌผ์„ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜
// - 0, 1, 2 ์ค‘ ํ•˜๋‚˜์˜ ๋‚œ์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ๊ฐ Dog, Cat, Cow ๊ฐ์ฒด ์ค‘ ํ•˜๋‚˜๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
// - ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” Animal ํƒ€์ž…์˜ ํฌ์ธํ„ฐ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
// - ์ž…๋ ฅ ๋งค๊ฐœ๋ณ€์ˆ˜: ์—†์Œ
// - ๋ฐ˜ํ™˜๊ฐ’: Animal* (์ƒ์„ฑ๋œ ๋™๋ฌผ ๊ฐ์ฒด์˜ ํฌ์ธํ„ฐ)
Animal* createRandomAnimal();

์ฝ”๋“œ

๐Ÿ“„ Animal.h

#pragma once

class Animal
{
public:
	virtual ~Animal()
	{

	}
	virtual void makeSound() = 0;	// ์ˆœ์ˆ˜ ๊ฐ€์ƒ ํ•จ์ˆ˜
};

class Dog : public Animal	
// private๋กœ ํ•˜๋ฉด Animal์—์„œ ๋“ค์–ด์˜ฌ ๋•Œ private์ฒ˜๋Ÿผ ๋“ค์–ด์™€์„œ ์ž์‹ํด๋ž˜์„œ์—์„œ makeSound() ์“ธ ์ˆ˜ ์—†์Œ
{
	void makeSound() override;	// override๋Š” ์•ˆ์จ๋„ ๋˜๋Š”๋ฐ ์˜คํƒ€๋‚˜๋ฉด ์•Œ๋ ค์ฃผ๋‹ˆ๊นŒ ์“ฐ๋Š”๊ฒŒ ์ข‹์Œ
};

class Cat :public Animal
{
	void makeSound() override;
};

class Cow : public Animal
{
	void makeSound() override;
};

โœจ Animal.cpp

#include "Animal.h"
#include <iostream>

using namespace std;

void Dog::makeSound()
{
	cout << "๋ฉ!๋ฉ!" << endl;
}

void Cat::makeSound()
{
	cout << "์•ผ์˜น~" << endl;

}

void Cow::makeSound()
{
	cout << "์Œ๋ฉ”~" << endl;
}

๐Ÿ“„ Zoo.h

#pragma once
#include "Animal.h"

class Zoo 
{
public:   
    void addAnimal(Animal* animal);
    void performActions();
    ~Zoo();

private:
    Animal* animals[10]; // ๋™๋ฌผ ๊ฐ์ฒด๋ฅผ ์ €์žฅํ•˜๋Š” ํฌ์ธํ„ฐ ๋ฐฐ์—ด
    int animalCount = 0;
};

โœจ Zoo.cpp

#include "Zoo.h"
#include <iostream>

using namespace std;

void Zoo::addAnimal(Animal* animal)
{
	animals[animalCount] = animal;
	animalCount++;
}

void Zoo::performActions()
{
	for (int i = 0; i < animalCount; i++)
	{
		animals[i]->makeSound();
	}
}
Zoo::~Zoo()	// ์†Œ๋ฉธ์ž๋Š” ๋ฐ˜ํ™˜์ž๋ฃŒํ˜• ์•ˆ์จ๋„ ๋จ
// Animal.h ์—๋„ ์†Œ๋ฉธ์ž ๋งŒ๋“ค์–ด์ค˜์•ผ ํ•จ
{
	for (int i = 0; i < animalCount; i++)
	{
	delete animals[i];
	}
}

โœจ main.cpp

#include "Animal.h"
#include "Zoo.h"
#include <cstdlib>  // ๋žœ๋ค ๋™๋ฌผ์„ ์ƒ์„ฑ
#include <ctime>    // ๋žœ๋ค ๋™๋ฌผ์„ ์ƒ์„ฑ
#include <iostream>

using namespace std;

Animal* createRandomAnimal()
{
    int randInt = rand() % 3;   // 0, 1, 2 ์ค‘ ํ•˜๋‚˜

    if (randInt == 0)
    {
        return new Dog;
    }
    else if (randInt == 1)
    {
        return new Cat;
    }
    else
    {
        return new Cow;
    }
}

int main()
{
    srand(time(0));

    const int SIZE = 3;
    Animal* animals[SIZE] = {}; // nullptr๋กœ ์ดˆ๊ธฐํ™”

    // ๊ฐ•์•„์ง€, ๊ณ ์–‘์ด, ์†Œ - ์Šคํƒ์— ์ƒ์„ฑ
    Dog myDog;
    Cat myCat;
    Cow myCow;

    // ๋ฐฐ์—ด์— ๋„ฃ๊ธฐ
    // ํƒ€์ž…์ด ptr์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์†Œ๊ฐ’์œผ๋กœ ๋ฐ›์•„์•ผ ํ•จ
   /* 
    animals[0] = &myDog;
    animals[1] = &myCat;
    animals[2] = &myCow;

    for (int i = 0; i < SIZE; i++)
    {
        animals[i]->makeSound();  //Animal.cpp์—์„œ void๋กœ ๋งŒ๋“ค์—ˆ์Œ: return x -> cout์œผ๋กœ ์ถœ๋ ฅ ๋ถˆ๊ฐ€๋Šฅ
    }
    */

    // ๋™๋ฌผ์› ๋งŒ๋“ ๋‹ค
    Zoo myZoo;

    // ๋™๋ฌผ ์ถ”๊ฐ€ - ptr๋กœ ์ค˜์•ผํ•˜๋ฏ€๋กœ ์ฃผ์†Œ๊ฐ’ ์ค€๋‹ค
    /*
    myZoo.addAnimal(&myCow);
    myZoo.addAnimal(&myDog);    
    myZoo.addAnimal(&myCat);
    */

    // ๋™๋ฌผ ๋žœ๋คํ•˜๊ฒŒ ์ถ”๊ฐ€
    myZoo.addAnimal(createRandomAnimal());
    myZoo.addAnimal(createRandomAnimal());
    myZoo.addAnimal(createRandomAnimal());
    myZoo.addAnimal(createRandomAnimal());
    myZoo.addAnimal(createRandomAnimal());

    myZoo.performActions(); 

    return 0;
}

0๊ฐœ์˜ ๋Œ“๊ธ€