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 ๊ฐ์ฒด ์์ฑ - ์์ฑ์ ์ด๋์ ๋ผ์ด์ .
์์ฑ์ {} ๋ด๋ถ์์ ์์ฑ๋๋ ์ฝ๋๋ ์ด๋ฏธ ํด๋์ค๊ฐ ์ธ์คํด์คํ ๋ ์ดํ์ด๋ค. ์ฆ ๋ฉค๋ฒ๊ฐ ์ด๊ธฐํ ๋ ์ดํ ๋์ํ๋ ์ฝ๋์ด๋ค. ์์ฑ์ ์ด๋์ ๋ผ์ด์ ์ ์๋ ์ฝ๋๋ ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ ๋์ํ๋ ์ฝ๋์ด๋ฏ๋ก, ๋ฉค๋ฒ์ ์ด๊ธฐ๊ฐ๋ฑ์ ์ ํ ์ ์๋ ์ฝ๋์ด๋ค. ๋น์ฐํ ์ฒ์๋ถํฐ ์ด๊ธฐ๊ฐ์ผ๋ก ๋ง๋๋๊ฒ ์ด๊ธฐํ ์ํค๊ณ , ๊ทธ ๊ฐ์ ๋์ ํ๋๊ฒ ๋ณด๋ค ๋ ํจ์จ์ ์ด๋ค(์ฑํฅ์ฐจ ์ด๊ธด ํ๋ค).
์ด๋ ์์ฑ์ ์ด๋์ ๋ผ์ด์ ๋ก ์ด๊ธฐํํ๊ฑฐ๋ ์์ฑ์๋ฅผ ํธ์ถํด์ผํ๋ ๋ฉค๋ฒ๋ค์ด ์๋ค.
- const ๋ฉค๋ฒ ๋ณ์
- ์ฐธ์กฐ ๋ฉค๋ฒ ๋ณ์
- ๋ํดํธ ์์ฑ์๊ฐ ์๋, ๊ฐ์ฒด ๋งด๋ฒ ๋ณ์(ํด๋์ค ๋ด๋ถ์ ์ ์ธ๋ ๋ ๋ค๋ฅธ ํด๋์ค)
- ๋ํดํธ ์์ฑ์๊ฐ ์๋, ๋ฒ ์ดํฌ ํด๋์ค
์์ฑ์ ์ด๋์ ๋ผ์ด์ ์ ์์๋ ํด๋์ค ์ ์์ ์ ์ธ๋ ์์๋๋ก ๋ฉค๋ฒ๋ฅผ ์ด๊ธฐํํ๋ค.
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 ๋ณต์ ์ ๋์ ๊ตฌ๋ถํ๊ธฐ - ๋ฆฌํด๊ฐ์ด ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ.
์ฐธ๊ณ : ๋ฆฌํด๋ ์์ ๊ฐ์ฒด๋ ๋ช ๋ น ๋ผ์ธ()์ด ๋๋ ๋ ์ฌ๋ผ์ง๋ค.
์์๊ฐ์ฒด์ ๋์ ์ฐ์ฐ์ ์ค์ฌ์ ์ค๋ฒํค๋๋ฅผ ์ค์ด๋ ๋ฆฌํด๊ฐ ์ต์ ํ๋ฅผ ์ปดํ์ผ ๋จ๊ณ์์ ์ ์ฉํ๊ธฐ๋ ํ๊ณ , ์ด๋์์ฑ์/์ฐ์ฐ์๋ฅผ ํธ์ถํ์ฌ ์์ฌ๊ฐ์ฒด์ ๋ํ ์ค๋ฒํค๋๋ฅผ ์ค์ธ๋ค.