8์žฅ

8.3 ๊ฐ์ฒด์˜ ๋ผ์ดํ”„ ์‚ฌ์ดํด

๐ŸŒ• 8.3.1 ๊ฐ์ฒด ์ƒ์„ฑ - ์ƒ์„ฑ์ž ์—ฌ๋Ÿฌ๊ฐœ ์ œ๊ณตํ•˜๊ธฐ.

์ƒ์„ฑ์ž์—์„œ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ํ˜ธ์ถœ ์œ„์น˜์— ๋”ฐ๋ผ ๋™์ž‘ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง„๋‹ค

TestClass::TestClass(std::string name)
// โฌ‡๏ธ ์ดˆ๊ธฐํ™” ๋ฆฌ์ŠคํŠธ์—์„œ ์ƒ์„ฑ์ž ํ˜ธ์ถœ = ์œ„์ž„์ƒ์„ฑ์ž. ๊ฐ™์€ ์ธ์Šคํ„ด์Šค์˜ ์ƒ์„ฑ์ž ํ˜ธ์ถœ.
: TestClass::TestClass()
{
    TestClass::TestClass(); // ์ž„์‹œ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ์ธํŠธํ„ด์Šค์˜ ์ƒ์„ฑ์ž๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค.
}

๐ŸŒ• 8.3.1 ๊ฐ์ฒด ์ƒ์„ฑ - ๋””ํดํŠธ ์ƒ์„ฑ์ž ์ž‘์„ฑ ๋ฐฉ๋ฒ•

๋””ํดํŠธ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์‹œ, ์Šคํƒ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ์™€ ํž™ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ฐจ์ด๊ฐ€ ์กด์žฌํ•œ๋‹ค.

//---------[STACK]----------
// ์Šคํƒ ๊ฐ์ฒด์—์„œ ๋””ํดํŠธ ์ƒ์„ฑ์ž ํ˜ธ์ถœ์‹œ ()๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
TestClass tc(); // โŒ. TestClass๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” tc()๋ผ๋Š” ํ•จ์ˆ˜๋กœ ์ธ์‹.
tc.getName();   // ์ปดํŒŒ์ผ ์—๋Ÿฌ ๋ฐœ์ƒ ์ง€์ . ํ•จ์ˆ˜๋ฅผ ๊ฐ์ฒด์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ๋กœ ํŒ๋‹จ.

//---------[HEAP]----------
// ํž™ ๊ฐ์ฒด์—์„œ๋Š” ํด๋ž˜์Šค()ํ˜•ํƒœ๋กœ๋„ ๋””ํดํŠธ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•˜๋‹ค.
auto smartPtr = make_unique<TestClass>();   // โญ•๏ธ
TestClass* tc1 = new TestClasss();          // โญ•๏ธ
TestClass* tc1 = new TestClasss;            // โญ•๏ธ

๐ŸŒ• 8.3.1 ๊ฐ์ฒด ์ƒ์„ฑ - ์ƒ์„ฑ์ž ์ด๋‹ˆ์…œ๋ผ์ด์ €.

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

์ด๋•Œ ์ƒ์„ฑ์ž ์ด๋‹ˆ์…œ๋ผ์ด์ €๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ฑฐ๋‚˜ ์ƒ์„ฑ์ž๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•˜๋Š” ๋ฉค๋ฒ„๋“ค์ด ์žˆ๋‹ค.

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

class Testclass
{
    private:
        int val1;
        int val2;
}
// โญ•๏ธ. val1์— 1์ด ๋Œ€์ž…๋˜๊ณ , val2์— val1๊ฐ’์ด ๋Œ€์ž…๋จ.
Testclass::Testclass()
: val1(1), val2(val1) {}

// โŒ. ํด๋ž˜์Šค์— ์ •์˜๋œ ์ˆœ์„œ์ธ val1โ†’val2๋กœ ์ดˆ๊ธฐํ™”๋จ. val1์—๋Š” ์“ฐ๋ ˆ๊ธฐ๊ฐ’์ด ๋“ค์–ด๊ฐ„๋‹ค.
Testclass::Testclass()
: val2(1), val1(val2) {}

๐ŸŒ• 8.3.1 ๊ฐ์ฒด ์ƒ์„ฑ - ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ์ƒ์„ฑ์ž ์ •๋ฆฌ.

์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑ์‚ฌ ์ค‘ ๋””ํดํŠธ์ƒ์„ฑ์ž์™€ ๋ณต์‚ฌ์ƒ์„ฑ์ž๋Š” ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋•Œ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์€ ๊ฐ๊ฐ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋‘๊ฐœ๋‹ค ์„ž์–ด์„œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๊ฒฝ์šฐ์˜์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๊ณ  ๋ณต์žกํ•˜๋‹ค. ๊ฐ๊ฐ ์ƒ๊ฐํ•˜๋ฉด ์‹ฌํ”Œํ•จ.

๐ŸŒ– 8.3.3 ๊ฐ์ฒด์— ๋Œ€์ž…ํ•˜๊ธฐ

c++์—์„œ ๋ณต์ œ(copy)๋Š” ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™” ํ•  ๋•Œ ์ ์šฉ๋˜๋Š” ํ‘œํ˜„์ด๋‹ค. ์ด๋ฏธ ํ• ๋‹น๋œ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)์— ๋ฎ์–ด์“ธ ๋•Œ๋Š” ๋Œ€์ž…(assign)์ด๋ผ๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

๐ŸŒ– 8.3.3 ๊ฐ์ฒด์— ๋Œ€์ž…ํ•˜๊ธฐ - ๋Œ€์ž…์—ฐ์‚ฐ์ž ์ •์˜๋ฐฉ๋ฒ•

๋Œ€์ž…์—ฐ์‚ฐ์ž(=)๋Š” ๋ณต์ œ ์ƒ์„ฑ์ž์™€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋Œ€์ž…์—ฐ์‚ฐ์ž๋ฅผ ๊ตฌํ˜„(์˜ค๋ฒ„๋กœ๋”ฉ)ํ• ๋•Œ๋Š” ์ž๊ธฐ ์ž์‹ ์„ ๋Œ€์ž…ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ๋ฐ˜๋“œ์‹œ ๊ณ ๋ คํ•ด์•ผํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ํด๋ž˜์Šค ๋‚ด์— ๋™์ ์œผ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ๊ฑฐ๋‚˜, ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋“ค์ด ์žˆ๋‹ค๋ฉด ์ž๊ธฐ ์ž์‹ ์„ ๋Œ€์ž…ํ•˜๋Š” ์ž‘์—…์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ๋Œ€์ž…์—ฐ์‚ฐ์ž ์‹œ์ž‘์‹œ ํ™•์ธํ•ด๋ณด๋Š”๊ฒŒ ๊ฐ€์žฅ ์ข‹๋‹ค.

// rhs : Right Hand Side
TestClass& TestClass::operator=(const TestClass& rhs)
{
    if (this == &rhs)
    {
        return *this;
    }
    ...
    return *this;
}

๐ŸŒ– 8.3.4 ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๋ณต์ œ ์ƒ์„ฑ์ž ๋ณต์ œ/๋Œ€์ž… ์—ฐ์‚ฐ์ž.

C++ 11๋ถ€ํ„ฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ๋“ค์„ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๐ŸŒ– 8.3.5 ๋ณต์ œ์™€ ๋Œ€์ž… ๊ตฌ๋ถ„ํ•˜๊ธฐ.

๊ธฐ๋ณธ์ ์œผ๋กœ ์„ ์–ธ์—์„œ๋Š” ๋ณต์ œ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋˜ํ•œ ์ด๋ฏธ ์ƒ์„ฑ๋œ ๊ฐ์ฒด์— ๋Œ€์ž…ํ•˜๋Š” ๋Œ€์ž…๋ฌธ์—์„œ๋Š” ๋ณต์ œ/๋Œ€์ž… ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ์•„๋ž˜์˜ ์„ ์–ธ๋ฌธ๋“ค์€ ๋ณต์ œ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Testclass tc1(10);
Testclass tc2(tc1);
Testclass tc3 = tc1;

๐ŸŒ– 8.3.5 ๋ณต์ œ์™€ ๋Œ€์ž… ๊ตฌ๋ถ„ํ•˜๊ธฐ - ๋ฆฌํ„ด๊ฐ’์ด ๊ฐ์ฒด์ธ ๊ฒฝ์šฐ.

์ฐธ๊ณ  : ๋ฆฌํ„ด๋œ ์ž„์‹œ ๊ฐ์ฒด๋Š” ๋ช…๋ น ๋ผ์ธ()์ด ๋๋‚ ๋•Œ ์‚ฌ๋ผ์ง„๋‹ค.

์ž„์‹œ๊ฐ์ฒด์— ๋Œ€์ž…์—ฐ์‚ฐ์„ ์ค„์—ฌ์„œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๋Š” ๋ฆฌํ„ด๊ฐ’ ์ตœ์ ํ™”๋ฅผ ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์ ์šฉํ•˜๊ธฐ๋„ ํ•˜๊ณ , ์ด๋™์ƒ์„ฑ์ž/์—ฐ์‚ฐ์ž๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž„์‹ฌ๊ฐ์ฒด์— ๋Œ€ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ธ๋‹ค.