๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ Development Study/๐Ÿ‘จ๐Ÿพ‍๐Ÿ’ป C++

์ƒ์„ฑ์ž/์†Œ๋ฉธ์ž

by eazuooz 2022. 8. 22.

 

Member function typical form for class C:
์ƒ์„ฑ์ž C::C();
์†Œ๋ฉธ์ž C::~C();
๋ณต์‚ฌ ์ƒ์„ฑ์ž C::C (const C&);
๋Œ€์ž… ์—ฐ์‚ฐ์ž C& operator= (const C&);
์ด๋™ ์ƒ์„ฑ์ž C::C (C&&);
์ด๋™ ๋Œ€์ž… ์—ฐ์‚ฐ์ž C& operator= (C&&);

๊ธฐ๋ณธ ์ƒ์„ฑ์ž

๊ธฐ๋ณธ ์ƒ์„ฑ์ž ๋Š” ํด๋ž˜์Šค์˜ ๊ฐœ์ฒด๊ฐ€ ์„ ์–ธ๋˜์—ˆ์ง€๋งŒ ์ธ์ˆ˜๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ƒ์„ฑ์ž์ž…๋‹ˆ๋‹ค .

ํด๋ž˜์Šค ์ •์˜์— ์ƒ์„ฑ์ž๊ฐ€ ์—†์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํด๋ž˜์Šค์— ์•”์‹œ์ ์œผ๋กœ ์ •์˜๋œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค . ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•œ ํ›„:

class Example {
  public:
    int total;
    void accumulate (int x) { total += x; }
};

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์žExample ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค . ๋”ฐ๋ผ์„œ ์ด ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋Š” ์ธ์ˆ˜ ์—†์ด ๊ฐ„๋‹จํžˆ ์„ ์–ธํ•˜์—ฌ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Example ex;

๊ทธ๋Ÿฌ๋‚˜ ํด๋ž˜์Šค์— ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ๋œ ๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ์œผ๋ฉด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๋” ์ด์ƒ ์•”์‹œ์  ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์œผ๋ฉฐ ๋” ์ด์ƒ ์ธ์ˆ˜ ์—†์ด ํ•ด๋‹น ํด๋ž˜์Šค์˜ ์ƒˆ ๊ฐ์ฒด ์„ ์–ธ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ ํด๋ž˜์Šค:

class Example2 {
  public:
    int total;
    Example2 (int initial_value) : total(initial_value) { };
    void accumulate (int x) { total += x; };
};

์—ฌ๊ธฐ์—์„œ type ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ์ž๋ฅผ ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค int. ๋”ฐ๋ผ์„œ ๋‹ค์Œ ๊ฐœ์ฒด ์„ ์–ธ์ด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค.

Example2 ex (100);   // ok: calls constructor

๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ:

Example2 ex;         // not valid: no default constructor

ํด๋ž˜์Šค๊ฐ€ ํ•˜๋‚˜์˜ ์ธ์ˆ˜๋ฅผ ์ทจํ•˜๋Š” ๋ช…์‹œ์  ์ƒ์„ฑ์ž๋กœ ์„ ์–ธ๋˜์—ˆ๊ณ  ์•„๋ฌด ๊ฒƒ๋„ ์ทจํ•˜์ง€ ์•Š๋Š” ์•”์‹œ์  ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ์ธ์ˆ˜ ์—†์ด ์ƒ์„ฑ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์ ์ ˆํ•œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ๋„ ํด๋ž˜์Šค์—์„œ ์„ ์–ธ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

// classes and default constructors
#include <iostream>
#include <string>
using namespace std;

class Example3 {
    string data;
  public:
    Example3 (const string& str) : data(str) {}
    Example3() {}
    const string& content() const {return data;}
};

int main () {
  Example3 foo;
  Example3 bar ("Example");

  cout << "bar's content: " << bar.content() << '\n';
  return 0;
}

์—ฌ๊ธฐ Example3์—๋Š” ๋นˆ ๋ธ”๋ก์œผ๋กœ ์ •์˜๋œ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž (์ฆ‰, ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ์ƒ์„ฑ์ž)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Example3() {}

์ด๊ฒƒ์€ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ Example3์ธ์ˆ˜ ์—†์ด ์ƒ์„ฑ๋˜๋„๋ก ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค( foo์ด ์˜ˆ์ œ์—์„œ ์„ ์–ธ๋œ ๊ฒƒ์ฒ˜๋Ÿผ). ์ผ๋ฐ˜์ ์œผ๋กœ ์ด์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ์ƒ์„ฑ์ž๋Š” ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๊ฐ€ ์—†๋Š” ๋ชจ๋“  ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์•”์‹œ์ ์œผ๋กœ ์ •์˜๋˜๋ฏ€๋กœ ๋ช…์‹œ์  ์ •์˜๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๊ฒฝ์šฐ Example3์—๋Š” ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Example3 (const string& str);

์ƒ์„ฑ์ž๊ฐ€ ํด๋ž˜์Šค์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์„ ์–ธ๋˜๋ฉด ์•”์‹œ์  ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ๊ฐ€ ์ž๋™์œผ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์†Œ๋ฉธ์ž

์†Œ๋ฉธ์ž๋Š” ์ƒ์„ฑ์ž ์˜ ๋ฐ˜๋Œ€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์†Œ๋ฉธ์ž ๋Š” ํด๋ž˜์Šค์˜ ์ˆ˜๋ช…์ด ์ข…๋ฃŒ๋  ๋•Œ ํด๋ž˜์Šค์— ํ•„์š”ํ•œ ์ •๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์žฅ์—์„œ ์ •์˜ํ•œ ํด๋ž˜์Šค๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด์ œ ๋งˆ์ง€๋ง‰ ์˜ˆ์ œ์˜ ํด๋ž˜์Šค๊ฐ€ ๋ฐ์ดํ„ฐ ๋ฉค๋ฒ„๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๋ฌธ์ž์—ด์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋™์  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฐ์ฒด์˜ ์ˆ˜๋ช…์ด ๋๋‚˜๋ฉด ์ž๋™์œผ๋กœ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ๋งค์šฐ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์†Œ๋ฉธ์ž ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค . ์†Œ๋ฉธ์ž๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค . ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.void. ๋˜ํ•œ ํด๋ž˜์Šค ์ด๋ฆ„์„ ์ž์ฒด ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์•ž์— ๋ฌผ๊ฒฐํ‘œ ๊ธฐํ˜ธ( ~)๊ฐ€ ๋ถ™์Šต๋‹ˆ๋‹ค.

// destructors
#include <iostream>
#include <string>
using namespace std;

class Example4 {
    string* ptr;
  public:
    // constructors:
    Example4() : ptr(new string) {}
    Example4 (const string& str) : ptr(new string(str)) {}
    // destructor:
    ~Example4 () {delete ptr;}
    // access content:
    const string& content() const {return *ptr;}
};

int main () {
  Example4 foo;
  Example4 bar ("Example");

  cout << "bar's content: " << bar.content() << '\n';
  return 0;
}

๊ตฌ์„ฑ ์‹œ Example4์— ๋Œ€ํ•œ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค string. ์†Œ๋ฉธ์ž๊ฐ€ ๋‚˜์ค‘์— ํ•ด์ œํ•˜๋Š” ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

๊ฐ์ฒด์˜ ์†Œ๋ฉธ์ž๋Š” ์ˆ˜๋ช…์ด ๋๋‚˜๋ฉด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์˜ ๊ฒฝ์šฐ ํ•จ์ˆ˜์˜ ๋์—์„œ ๋ฐœ์ƒ fooํ•ฉ๋‹ˆ๋‹ค .barmain

 

๋ณต์‚ฌ ์ƒ์„ฑ์ž

๊ฐœ์ฒด๊ฐ€ ์ž์ฒด ์œ ํ˜•์˜ ๋ช…๋ช…๋œ ๊ฐœ์ฒด๋ฅผ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋ฉด ๋ณต์‚ฌ๋ณธ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ณต์‚ฌ ์ƒ์„ฑ์ž ๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋ณต์‚ฌ ์ƒ์„ฑ์ž ๋Š” ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํด๋ž˜์Šค ์ž์ฒด์— ๋Œ€ํ•œ ์œ ํ˜• ์ฐธ์กฐ( ์ •๊ทœํ™”๋  ์ˆ˜ ์žˆ์Œ)์ด๊ณ  ์ด ์œ ํ˜•์˜ ๋‹จ์ผ ์ธ์ˆ˜๋กœ ํ˜ธ์ถœ๋  ์ˆ˜

์žˆ๋Š” ์ƒ์„ฑ์ž์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํด๋ž˜์Šค ์˜ ๊ฒฝ์šฐ ๋ณต์‚ฌ ์ƒ์„ฑ์ž ๋Š” ๋‹ค์Œ ์„œ๋ช…์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.constMyClass

MyClass::MyClass (const MyClass&);

ํด๋ž˜์Šค์— ์ •์˜๋œ ์‚ฌ์šฉ์ž ์ •์˜ ๋ณต์‚ฌ ๋‚˜ ์ด๋™ ์ƒ์„ฑ์ž(๋˜๋Š” ํ• ๋‹น)๊ฐ€ ์—†์œผ๋ฉด ์•”์‹œ์  ๋ณต์‚ฌ ์ƒ์„ฑ์ž ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์ด ๋ณต์‚ฌ ์ƒ์„ฑ์ž๋Š” ๋‹จ์ˆœํžˆ ์ž์ฒด ๋ฉค๋ฒ„์˜ ๋ณต์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ:

class MyClass {
  public:
    int a, b; string c;
};

์•”์‹œ์  ๋ณต์‚ฌ ์ƒ์„ฑ์ž ๋Š” ์ž๋™์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๊ฐ€์ •๋œ ์ •์˜๋Š” ๋‹ค์Œ ๊ณผ ๋Œ€๋žต์ ์œผ๋กœ ๋™์ผํ•œ ์–•์€ ๋ณต์‚ฌ ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

MyClass::MyClass(const MyClass& x) : a(x.a), b(x.b), c(x.c) {}

์ด ๊ธฐ๋ณธ ๋ณต์‚ฌ ์ƒ์„ฑ์ž ๋Š” ๋งŽ์€ ํด๋ž˜์Šค์˜ ์š”๊ตฌ ์‚ฌํ•ญ์— ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–•์€ ๋ณต์‚ฌExample4 ๋Š” ํด๋ž˜์Šค ์ž์ฒด์˜ ๋ฉค๋ฒ„๋งŒ ๋ณต์‚ฌํ•˜๋ฉฐ , ์ด๋Š” ์ €์žฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํฌ์ธํ„ฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ„์—์„œ ์ •์˜ํ•œ ํด๋ž˜์Šค์™€ ๊ฐ™์€ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์˜ˆ์ƒํ•œ ๊ฒƒ๊ณผ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ํด๋ž˜์Šค์˜ ๊ฒฝ์šฐ ์–•์€ ๋ณต์‚ฌ ๋ฅผ ์ˆ˜ํ–‰ ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํฌ์ธํ„ฐ ๊ฐ’์ด ๋ณต์‚ฌ๋˜์ง€๋งŒ ๋‚ด์šฉ ์ž์ฒด๋Š” ๋ณต์‚ฌ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‘ ๊ฐ์ฒด(๋ณต์‚ฌ๋ณธ๊ณผ ์›๋ณธ)๊ฐ€ ๋‹จ์ผ string๊ฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๊ณ (๋‘˜ ๋‹ค ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ์Œ) ์–ด๋–ค ์‹œ์ (ํŒŒ๊ดด ์‹œ)์—์„œ ๋‘ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ๋ธ”๋ก์„ ์‚ญ์ œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋Ÿฐํƒ€์ž„์— ํ”„๋กœ๊ทธ๋žจ์ด ์ถฉ๋Œํ•˜๋Š” ์›์ธ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‹ค์Œ ์‚ฌ์šฉ์ž ์ •์˜๋ฅผ ์ •์˜ํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๊นŠ์€ ๋ณต์‚ฌ ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ณต์‚ฌ ์ƒ์„ฑ์ž :

// copy constructor: deep copy
#include <iostream>
#include <string>
using namespace std;

class Example5 {
    string* ptr;
  public:
    Example5 (const string& str) : ptr(new string(str)) {}
    ~Example5 () {delete ptr;}
    // copy constructor:
    Example5 (const Example5& x) : ptr(new string(x.content())) {}
    // access content:
    const string& content() const {return *ptr;}
};

int main () {
  Example5 foo ("Example");
  Example5 bar = foo;

  cout << "bar's content: " << bar.content() << '\n';
  return 0;
}

์ด ๋ณต์‚ฌ ์ƒ์„ฑ์ž ๊ฐ€ ์ˆ˜ํ–‰ ํ•˜๋Š” ์ „์ฒด ๋ณต์‚ฌ๋Š” ์›๋ž˜ ๊ฐœ์ฒด์˜ ๋ณต์‚ฌ๋ณธ์„ ํฌํ•จํ•˜๋„๋ก ์ดˆ๊ธฐํ™”๋œ ์ƒˆ ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ์ €์žฅ์†Œ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‘ ๊ฐœ์ฒด(๋ณต์‚ฌ๋ณธ ๋ฐ ์›๋ณธ)์—๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์œ„์น˜์— ์ €์žฅ๋œ ์ฝ˜ํ…์ธ ์˜ ๊ณ ์œ ํ•œ ๋ณต์‚ฌ๋ณธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์‚ฌ ์ƒ์„ฑ์ž

๊ฐ์ฒด๋Š” ์ดˆ๊ธฐํ™”๋  ๋•Œ ๊ตฌ์„ฑ ์‹œ ๋ณต์‚ฌ๋  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ํ• ๋‹น ์ž‘์—…์—์„œ๋„ ๋ณต์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ์ด์  ๋ณด๊ธฐ:

MyClass foo;
MyClass bar (foo);       // object initialization: copy constructor called
MyClass baz = foo;       // object initialization: copy constructor called
foo = bar; 

๊ตฌ์„ฑ ์‹œ ๋“ฑํ˜ธ ๋ฅผ baz์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊ธฐํ™” ๋˜์ง€๋งŒ ํ• ๋‹น ์ž‘์—…์ด ์•„๋‹™๋‹ˆ๋‹ค! (๋น„๋ก ํ•˜๋‚˜์ฒ˜๋Ÿผ ๋ณด์ผ ์ˆ˜ ์žˆ์Œ): ๊ฐœ์ฒด ์„ ์–ธ์€ ํ• ๋‹น ์ž‘์—…์ด ์•„๋‹ˆ๋ผ ๋‹จ์ผ ์ธ์ˆ˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ตฌ๋ฌธ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ํ• ๋‹น ์€ ํ• ๋‹น ์ž‘์—…์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์„ ์–ธ๋œ ๊ฐœ์ฒด๊ฐ€ ์—†์ง€๋งŒ ๊ธฐ์กด ๊ฐœ์ฒด์— ๋Œ€ํ•ด ์ž‘์—…์ด ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. . ๋ณต์‚ฌ ํ• ๋‹น ์—ฐ์‚ฐ์ž ๋Š” ํด๋ž˜์Šค ์ž์ฒด์˜ ๊ฐ’์ด๋‚˜ ์ฐธ์กฐ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ ํ•˜๋Š” ์˜ค๋ฒ„ ๋กœ๋“œ ์ž…๋‹ˆ๋‹ค . ๋ฐ˜ํ™˜ ๊ฐ’์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์— ๋Œ€ํ•œ ์ฐธ์กฐ ์ž…๋‹ˆ๋‹ค(ํ•„์ˆ˜๋Š” ์•„๋‹ˆ์ง€๋งŒ). ์˜ˆ๋ฅผ ๋“ค์–ด ํด๋ž˜์Šค ์˜ ๊ฒฝ์šฐ

foofoo

operator=*thisMyClass์‚ฌ๋ณธ ํ• ๋‹น ์—๋Š” ๋‹ค์Œ ์„œ๋ช…์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

MyClass& operator= (const MyClass&);

๋ณต์‚ฌ ํ• ๋‹น ์—ฐ์‚ฐ์ž ๋„ ํŠน์ˆ˜ ํ•จ์ˆ˜ ์ด๋ฉฐ ํด๋ž˜์Šค์— ์‚ฌ์šฉ์ž ์ •์˜ ๋ณต์‚ฌ ๋‚˜ ์ด๋™ ํ• ๋‹น(๋˜๋Š” ์ด๋™ ์ƒ์„ฑ์ž)์ด ์ •์˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์•”์‹œ์ ์œผ๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค .

๊ทธ๋Ÿฌ๋‚˜ ์•”์‹œ์  ๋ฒ„์ „์€ ๋งŽ์€ ํด๋ž˜์Šค์— ์ ํ•ฉํ•œ ์–•์€ ๋ณต์‚ฌExample5 ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ์—์„œ์™€ ๊ฐ™์ด ์ €์žฅ์†Œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋Š” ํด๋ž˜์Šค์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ์ด ๊ฒฝ์šฐ ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๋ฅผ ๋‘ ๋ฒˆ ์‚ญ์ œํ•  ์œ„ํ—˜์ด ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ• ๋‹น ์ด์ „์— ๊ฐ์ฒด๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜์ง€ ์•Š์•„ ํ• ๋‹น ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ๋ณต์‚ฌ ํ• ๋‹น ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์ด์ „ ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ „์ฒด ๋ณต์‚ฌ ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค .

Example5& operator= (const Example5& x) {
  delete ptr;                      // delete currently pointed string
  ptr = new string (x.content());  // allocate space for new string, and copy
  return *this;
}

๋˜๋Š” ๋ฉค๋ฒ„๊ฐ€ ์ผ์ •ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋™์ผํ•œ ๊ฐ์ฒด string๋ฅผ ๋‹ค์‹œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .string

Example5& operator= (const Example5& x) {
  *ptr = x.content();
  return *this;
}

๋Œ€์ž… ์—ฐ์‚ฐ์ž

๋ณต์‚ฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋™๋„ ๊ฐœ์ฒด์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ๊ฐœ์ฒด์— ๊ฐ’์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ณต์‚ฌ์™€ ๋‹ฌ๋ฆฌ ์ฝ˜ํ…์ธ ๋Š” ์‹ค์ œ๋กœ ํ•œ ๊ฐœ์ฒด(์†Œ์Šค)์—์„œ ๋‹ค๋ฅธ ๊ฐœ์ฒด(๋Œ€์ƒ)๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์†Œ์Šค๋Š” ํ•ด๋‹น ์ฝ˜ํ…์ธ ๋ฅผ ์žƒ์–ด๋ฒ„๋ฆฌ๊ณ  ๋Œ€์ƒ์ด ์ธ๊ณ„ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ด๋™์€ ๊ฐ’์˜ ์†Œ์Šค๊ฐ€ ์ด๋ฆ„ ์—†๋Š” ๊ฐœ์ฒด ์ธ ๊ฒฝ์šฐ์—๋งŒ ๋ฐœ์ƒ ํ•ฉ๋‹ˆ๋‹ค .

์ด๋ฆ„ ์—†๋Š” ๊ฐœ์ฒด ๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ์ผ์‹œ์ ์ธ ๊ฐœ์ฒด์ด๋ฏ€๋กœ ์ด๋ฆ„๋„ ์ง€์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ช…๋ช…๋˜์ง€ ์•Š์€ ๊ฐœ์ฒด ์˜ ์ผ๋ฐ˜์ ์ธ ์˜ˆ๋Š” ํ•จ์ˆ˜ ๋˜๋Š” ์œ ํ˜• ๋ณ€ํ™˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’์ž…๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ๊ฐ’์„ ํ• ๋‹นํ•˜๊ธฐ ์œ„ํ•ด ์ด์™€ ๊ฐ™์€ ์ž„์‹œ ๊ฐ์ฒด์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์‚ฌ๋ณธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด๋Š” ๋‹ค๋ฅธ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ํ•ด๋‹น ๊ฐ’์„ ๋Œ€์ƒ ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ์ฒด. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋Š” ์ด๋™ ์ƒ์„ฑ์ž ์™€ ์ด๋™ ํ• ๋‹น ์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค . ์ด๋™ ์ƒ์„ฑ์ž

๋Š” ๋ช…๋ช…๋˜์ง€ ์•Š์€ ์ž„์‹œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑ ์‹œ ๊ฐœ์ฒด๊ฐ€ ์ดˆ๊ธฐํ™”๋  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ด๋™ ํ• ๋‹น ์€ ๊ฐœ์ฒด์— ์ด๋ฆ„ ์—†๋Š” ์ž„์‹œ ๊ฐ’์ด ํ• ๋‹น๋  ๋•Œ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.\

MyClass fn();            // function returning a MyClass object
MyClass foo;             // default constructor
MyClass bar = foo;       // copy constructor
MyClass baz = fn();      // move constructor
foo = bar;               // copy assignment
baz = MyClass();         // move assignment 

์— ์˜ํ•ด ๋ฐ˜ํ™˜๋œ fn๊ฐ’๊ณผ ๋กœ ๊ตฌ์„ฑ๋œ ๊ฐ’ MyClass์€ ๋ชจ๋‘ ์ด๋ฆ„์ด ์ง€์ •๋˜์ง€ ์•Š์€ ์ž„์‹œ ๊ฐ’์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์ด๋ฆ„ ์—†๋Š” ๊ฐœ์ฒด๋Š” ์ˆ˜๋ช…์ด ๋งค์šฐ ์งง๊ณ  ์ด๊ฒƒ์ด ๋” ํšจ์œจ์ ์ธ ์ž‘์—…์ผ ๋•Œ ๋‹ค๋ฅธ ๊ฐœ์ฒด์— ์˜ํ•ด ํš๋“๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์‚ฌ๋ณธ์„ ๋งŒ๋“ค ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋™ ์ƒ์„ฑ์ž์™€ ์ด๋™ ํ• ๋‹น์€ ํด๋ž˜์Šค ์ž์ฒด ์— ๋Œ€ํ•œ rvalue ์ฐธ์กฐ

์œ ํ˜•์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉค๋ฒ„์ž…๋‹ˆ๋‹ค .

MyClass (MyClass&&);             // move-constructor
MyClass& operator= (MyClass&&);  // move-assignment 

rvalue ์ฐธ์กฐ ๋Š” ๋‘ ๊ฐœ์˜ ์•ฐํผ์ƒŒ๋“œ( )๊ฐ€ ์žˆ๋Š” ์œ ํ˜•์„ ๋”ฐ๋ผ ์ง€์ • ๋ฉ๋‹ˆ๋‹ค &&. ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ์„œ rvalue ์ฐธ์กฐ ๋Š” ์ด ์œ ํ˜•์˜ ์ž„์‹œ ์ธ์ˆ˜์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๋™ ๊ฐœ๋…์€ new ๋ฐ delete๋กœ ์ €์žฅ์†Œ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฐœ์ฒด์™€ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ์ €์žฅ์†Œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐœ์ฒด์— ๊ฐ€์žฅ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐœ์ฒด์—์„œ ๋ณต์‚ฌ์™€ ์ด๋™์€ ์‹ค์ œ๋กœ ๋‹ค๋ฅธ ์ž‘์—…์ž…๋‹ˆ๋‹ค.
- A์—์„œ B๋กœ ๋ณต์‚ฌ๋Š” ์ƒˆ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ B์— ํ• ๋‹น๋œ ๋‹ค์Œ A์˜ ์ „์ฒด ๋‚ด์šฉ์ด B์— ํ• ๋‹น๋œ ์ด ์ƒˆ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณต์‚ฌ ๋จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
- A์—์„œ B๋กœ ์ด๋™ํ•˜๋Š” ๊ฒƒ์€ A์— ์ด๋ฏธ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ์Šคํ† ๋ฆฌ์ง€๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  B๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ํฌ์ธํ„ฐ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

// move constructor/assignment
#include <iostream>
#include <string>
using namespace std;

class Example6 {
    string* ptr;
  public:
    Example6 (const string& str) : ptr(new string(str)) {}
    ~Example6 () {delete ptr;}
    // move constructor
    Example6 (Example6&& x) : ptr(x.ptr) {x.ptr=nullptr;}
    // move assignment
    Example6& operator= (Example6&& x) {
      delete ptr; 
      ptr = x.ptr;
      x.ptr=nullptr;
      return *this;
    }
    // access content:
    const string& content() const {return *ptr;}
    // addition:
    Example6 operator+(const Example6& rhs) {
      return Example6(content()+rhs.content());
    }
};


int main () {
  Example6 foo ("Exam");
  Example6 bar = Example6("ple");   // move-construction
  
  foo = foo + bar;                  // move-assignment

  cout << "foo's content: " << foo.content() << '\n';
  return 0;
}

์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ด๋ฏธ ๋ฐ˜ํ™˜ ๊ฐ’ ์ตœ์ ํ™” ๋กœ ์•Œ๋ ค์ง„ ์ด๋™ ๊ตฌ์„ฑ ํ˜ธ์ถœ์ด ๊ณต์‹์ ์œผ๋กœ ํ•„์š”ํ•œ ๋งŽ์€ ๊ฒฝ์šฐ๋ฅผ ์ตœ์ ํ™” ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์ฃผ๋ชฉํ• ๋งŒํ•œ ๊ฒƒ์€ ํ•จ์ˆ˜์—์„œ ๋ฐ˜ํ™˜๋œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ ์ด๋™ ์ƒ์„ฑ์ž ๋Š” ์‹ค์ œ๋กœ ํ˜ธ์ถœ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. rvalue ์ฐธ์กฐ

๋Š” ๋ชจ๋“  ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ์œ ํ˜•์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋™ ์ƒ์„ฑ์ž ์ด์™ธ์˜ ์šฉ๋„์—๋Š” ๊ฑฐ์˜ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . Rvalue ์ฐธ์กฐ๋Š” ๊นŒ๋‹ค๋กญ๊ณ  ๋ถˆํ•„์š”ํ•œ ์‚ฌ์šฉ์€ ์ถ”์ ํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ค์šด ์˜ค๋ฅ˜์˜ ์›์ธ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•”์‹œ์  ๊ตฌ์„ฑ์›

์œ„์—์„œ ์„ค๋ช…ํ•œ 6๊ฐœ์˜ ํŠน์ˆ˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ๋Š” ํŠน์ • ์ƒํ™ฉ์—์„œ ํด๋ž˜์Šค์— ๋Œ€ํ•ด ์•”์‹œ์ ์œผ๋กœ ์„ ์–ธ๋œ ๋ฉค๋ฒ„์ž…๋‹ˆ๋‹ค.

 

๋ฉค๋ฒ„ ํ•จ์ˆ˜ ์•”์‹œ์ ์œผ๋กœ ์ •์˜๋จ: ๊ธฐ๋ณธ ์ •์˜:
๊ธฐ๋ณธ ์ƒ์„ฑ์ž ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค
ํ๋ฌผ ์†Œ๊ฐ๋กœ ์†Œ๋ฉธ์ž๊ฐ€ ์—†๋‹ค๋ฉด ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๋Š”๋‹ค
๋ณต์‚ฌ ์ƒ์„ฑ์ž ์ด๋™ ์ƒ์„ฑ์ž์™€ ์ด๋™ ํ• ๋‹น์ด ์—†๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๊ตฌ์„ฑ์›์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๊ณผ์ œ ๋ณต์‚ฌ ์ด๋™ ์ƒ์„ฑ์ž์™€ ์ด๋™ ํ• ๋‹น์ด ์—†๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๊ตฌ์„ฑ์›์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.
์ด๋™ ์ƒ์„ฑ์ž ์†Œ๋ฉธ์ž, ๋ณต์‚ฌ ์ƒ์„ฑ์ž ๋ฐ ๋ณต์‚ฌ ๋˜๋Š” ์ด๋™ ํ• ๋‹น์ด ์—†๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๊ตฌ์„ฑ์›์„ ์ด๋™
๊ณผ์ œ ์ด๋™ ์†Œ๋ฉธ์ž, ๋ณต์‚ฌ ์ƒ์„ฑ์ž ๋ฐ ๋ณต์‚ฌ ๋˜๋Š” ์ด๋™ ํ• ๋‹น์ด ์—†๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ๊ตฌ์„ฑ์›์„ ์ด๋™

๋ชจ๋“  ํŠน์ˆ˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ๊ฐ€ ๋™์ผํ•œ ๊ฒฝ์šฐ์— ์•”์‹œ์ ์œผ๋กœ ์ •์˜๋˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. ์ด๋Š” ์ฃผ๋กœ C ๊ตฌ์กฐ ๋ฐ ์ด์ „ C++ ๋ฒ„์ „๊ณผ์˜ ํ•˜์œ„ ํ˜ธํ™˜์„ฑ ๋•Œ๋ฌธ์ด๋ฉฐ ์‹ค์ œ๋กœ ์ผ๋ถ€์—๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹คํ–‰์Šค๋Ÿฝ๊ฒŒ๋„ ๊ฐ ํด๋ž˜์Šค๋Š” ์ด๋Ÿฌํ•œ ๋ฉค๋ฒ„ ์ค‘ ๊ธฐ๋ณธ ์ •์˜๊ฐ€ ์žˆ๋Š” ๋ฉค๋ฒ„ ๋˜๋Š” ๋ฐ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ๊ฐ ์‚ญ์ œ๋˜๋Š” ๋ฉค๋ฒ„๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ default์žˆ์Šต๋‹ˆ๋‹ค delete. ๊ตฌ๋ฌธ์€ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

function_declaration = default;
function_declaration = delete;
// default and delete implicit members
#include <iostream>
using namespace std;

class Rectangle {
    int width, height;
  public:
    Rectangle (int x, int y) : width(x), height(y) {}
    Rectangle() = default;
    Rectangle (const Rectangle& other) = delete;
    int area() {return width*height;}
};

int main () {
  Rectangle foo;
  Rectangle bar (10,20);

  cout << "bar's area: " << bar.area() << '\n';
  return 0;
}

์—ฌ๊ธฐ์—์„œ Rectangle๋‘ ๊ฐœ์˜ int์ธ์ˆ˜๋กœ ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜ ๊ธฐ๋ณธ ๊ตฌ์„ฑ (์ธ์ˆ˜ ์—†์Œ)์œผ๋กœ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ํ•จ์ˆ˜๊ฐ€ ์‚ญ์ œ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฐ์ฒด์—์„œ ๋ณต์‚ฌ ์ƒ์„ฑ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค . Rectangle๋”ฐ๋ผ์„œ ๋งˆ์ง€๋ง‰ ์˜ˆ์˜ ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ •ํ•˜๋ฉด ๋‹ค์Œ ๋ช…๋ น๋ฌธ์ด ์œ ํšจํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Rectangle baz (foo);

๊ทธ๋Ÿฌ๋‚˜ ๋ณต์‚ฌ ์ƒ์„ฑ์ž๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜ํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ ์œ ํšจํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Rectangle::Rectangle (const Rectangle& other) = default;

๋ณธ์งˆ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Rectangle::Rectangle (const Rectangle& other) : width(other.width), height(other.height) {}

ํ‚ค์›Œ๋“œ ๋Š” ๊ธฐ๋ณธ ์ƒ์„ฑ์ždefault ์™€ ๋™์ผํ•œ ๋ฉค๋ฒ„ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜์ง€ ์•Š์ง€๋งŒ (์ฆ‰, ๊ธฐ๋ณธ ์ƒ์„ฑ์ž ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ์ƒ์„ฑ์ž๋ฅผ ์˜๋ฏธํ•จ) ์‚ญ์ œ๋˜์ง€ ์•Š์œผ๋ฉด ์•”์‹œ์ ์œผ๋กœ ์ •์˜๋˜๋Š” ์ƒ์„ฑ์ž์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋ฆฌ๊ณ  ๋ฏธ๋ž˜์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ํ•˜๋‚˜์˜ ๋ณต์‚ฌ/์ด๋™ ์ƒ์„ฑ์ž ๋˜๋Š” ํ•˜๋‚˜์˜ ๋ณต์‚ฌ/์ด๋™ ํ• ๋‹น์„ ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ํ•˜์ง€๋งŒ ๋‘˜ ๋‹ค ์ •์˜ํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค๋Š” ๋ช…์‹œ์ ์œผ๋กœ ์ •์˜ ํ•˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ํŠน์ˆ˜ ๋ฉค๋ฒ„ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜ ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

'๐Ÿ“ Development Study > ๐Ÿ‘จ๐Ÿพโ€๐Ÿ’ป C++' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋‹คํ˜•์„ฑ  (0) 2022.08.22
์ƒ์† / ํ”„๋ Œ๋“œ  (0) 2022.08.22
ํด๋ž˜์Šค(2)  (0) 2022.08.19
ํด๋ž˜์Šค(1)  (0) 2022.08.19
๊ธฐํƒ€ ๋ฐ์ดํ„ฐ ํƒ€์ž…  (0) 2022.08.19

๋Œ“๊ธ€