C++/๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (OOP)

[C++] ํ•จ์ˆ˜ ํ˜น์€ ๋ฉ”์†Œ๋“œ์—์„œ ๊ฐ์ฒด์˜ ๋ถˆํ•„์š”ํ•œ ๋ณต์‚ฌ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ

Chan Lee 2023. 12. 29. 15:38

๊ฐ์ฒด๋Š” ๊ฝค๋‚˜ ํฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—,

 

Pass by value ๋ฐฉ๋ฒ• ํ˜น์€ return ๊ฐ’์œผ๋กœ ํŠน์ • ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ๋ฉ”์†Œ๋“œ๋Š” 

ํฐ ์šฉ๋Ÿ‰์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿด ๋•Œ, pass by reference ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

// main.cpp

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

using namespace std;

int main() {
  Player ricky("Ricky", 100, 0);
  Player super_enemy = create_super_enemy();
  Player ricky2 = another_hero(ricky);

  return 0;
}
// Practice.cpp

#include "Practice.h"
#include <iostream>
#include <string>

using namespace std;

Player::Player(string name_val, int health_val, int xp_val)
    : name{name_val}, health{health_val}, xp{xp_val} {}

Player::Player(const Player &original_hero)
    : name{original_hero.name}, health{original_hero.health},
      xp{original_hero.xp} {}

string Player::get_name() { return name; }
int Player::get_health() { return health; }
int Player::get_xp() { return xp; }

Player::~Player() { cout << "Destructor called for " << name << endl; }

Player create_super_enemy() {
  Player enemy("SUPER ENEMY", 100000, 0);
  return enemy;
}

Player another_hero(Player &source) {
  Player hero2(source.get_name() + "_", source.get_health(), source.get_xp());
  return hero2;
}
// Practice.h
#ifndef PRACTICE_H
#define PRACTICE_H

#include <iostream>
#include <string>

using namespace std;

class Player {
private:
  string name{};
  int health{};
  int xp{};

public:
  // Overloaded Constructors
  Player(string name_val = "None", int health_val = 0, int xp_val = 0);
  Player(const Player &original_hero);
  string get_name();
  int get_health();
  int get_xp();

  // Destructor
  ~Player();
};

#endif // PRACTICE_H

Player another_hero(Player &source);
Player create_super_enemy();

 

Player ๊ฐ์ฒด์˜ ์†Œ๋ฉธ์ž๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ๋ฅผ ํ™•์ธํ•œ๋‹ค๋ฉด ์ดํ•ด๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.

 

์ถœ๋ ฅ ๊ฒฐ๊ณผ

 

Destructor (์†Œ๋ฉธ์ž)๊ฐ€ Player์˜ reference๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” another_hero ํ•จ์ˆ˜๋กœ ์ธํ•ด์„œ ์ƒ์„ฑ๋œ ricky2 ๊ฐ์ฒด์—์„œ 1๋ฒˆ,

 

create_super_enemy() ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ๋˜์–ด์„œ ์ €์žฅ๋œ super_enemy ๊ฐ์ฒด์—์„œ 2๋ฒˆ,

 

์ฒ˜์Œ์— ์ผ๋ฐ˜์ ์ธ ์ƒ์„ฑ๋œ ricky ๊ฐ์ฒด์—์„œ๊นŒ์ง€ ์ด 3๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ํ™•์ธ๋ฉ๋‹ˆ๋‹ค.

 

 

๋งŒ์•ฝ pass by value๋กœ another_hero ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

 

 

Ricky ์ด๋ฆ„ ์†์„ฑ์„ ๊ฐ€์ง„ ๊ฐ์ฒด๊ฐ€ ๋‘๋ฒˆ ๋ณด์ด์ฃ ?

 

๊ฐ€์žฅ ๋จผ์ € ์†Œ๋ฉธ๋œ Ricky๋ผ๋Š” name ์†์„ฑ์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋Š” Ricky_ ์ด๋ฆ„ ์†์„ฑ์„ ๊ฐ€์ง„ ricky2 ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด

์ผ์‹œ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ  ricky2 ๊ฐ์ฒด๋กœ ๋ณต์‚ฌ๋œ ๋’ค, ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์ข…๋ฃŒ์™€ ํ•จ๊ป˜ ์Šคํƒ์—์„œ ์ œ๊ฑฐ๋˜๋ฉด์„œ ์†Œ๋ฉธํ•˜๋Š” ๊ฒƒ ์ž…๋‹ˆ๋‹ค.