์ง์ญ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ์
์ผ๋ก ๋ฐํํ๋ฉด ์๋๋ค!
์๋ํ๋ฉด ์ง์ญ ๊ฐ์ฒด๊ฐ ์๋ฉธ๋ ํ์ ๋ณต์ฌ ๋์
์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋ฉค๋ฒ ๋ฐ์ดํฐ๋ ์ด๋ฏธ ๋ ๋ผ๊ฐ ์ํ์ด๋ค.
: ์๋ ์์ ๋ค์ด ์๋ค.
์ง์ญ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค๋ฉด, ๊ฐํ์
์ผ๋ก ํ์.
์ง์ญ ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ rvo ๋ nrvo๊ฐ ์ ์ฉ๋๊ฒ ํ์.
-> ์ต์ ํ๋ฅผ ํ๋ค. ๋์
ํ๋ ๋ถ๋ถ์์ ๋ฐ๋ก ์์ฑ์๋ฅผ ํธ์ถํ๋ค.
๊ทธ๋ฆฌ๊ณ value ๋ฐํ์ด๋ผ๊ณ ํด์ ํน์๋ ํ๋ ๋ง์(๋ณต์ฌ๋์ง ์์๊น?)์ ์ง์ญ๋ณ์๋ฅผ move์ฒ๋ฆฌ๋ก ๋ฐํํ๋ ค๊ณ ํ์ง ๋ง์. ์ด๋๋ rvo , nrvo ์ต์ ํ๊ฐ ์ด๋ฃจ์ด์ง์ง ์๋๋ค.
: ์ดํํฐ๋ธ ๋ชจ๋ c++ ํญ๋ณต 25
๋ฐํ ๋ฐ๋ ํ์
์ด ์ฐธ์กฐ์ผ ๊ฒฝ์ฐ, ๋ณต์ฌ ๋ฐ์ํ์ง ์์.
-> ์ง๊ธ์ ๊ฒฝ์ฐ๋ ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๋ฉค๋ฒ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
: ์ง์ญ๋ณ์์ธ ๊ฒฝ์ฐ์๋ ๋ณต์ฌ๊ฐ ๋ฐ์ํ๋ค.
๋ฐํ ํ์
์ด value ์ผ ๊ฒฝ์ฐ, ๋ณต์ฌ ๋ฐ์ํ๋ค.
: c++์์ ๊ฐ ๋ฐํ์ ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. (์
๋ฐ์ดํธ : 240730)
๊ทธ๊ฒ์ด ์ ์ญ๊ฐ์ฒด๋ , ์ ์ญ ๋ณ์, ์ฐธ์กฐ ๊ฐ์ฒด ๋ผ๊ณ ํ๋๋ผ๋.
-> ์ด ๋ ์์๊ฐ์ฒด๊ฐ ์์ฑ๋จ.
๊ทธ๋ฐ๋ฐ ํจ์๋ด์ ์ง์ญ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค๊ณ ํ ๋๋ ์ต์ ํ๊ฐ ์ด๋ฃจ์ด์ง๋ค.
-> 28๋ฒ ํฌ์คํธ์์ ํ์ธํ ์ ์๋ค.
์์๊ฐ์ฒด
: ์ปดํ์ผ๋ฌ๊ฐ ์์์ ์ผ๋ก ์์ฑํ๋ ๊ฐ์ฒด
- ํน์ง : rvalue์ ์ํ๋ฏ๋ก, lvalue ๋์์ธ ์ฆ ๊ฐ๋์
๋ถ๊ฐ๋ฅํจ.
์์ ๊ฐ์ฒด๋ ์ธ์ ์์ฑ์ํค๋?
- ๊ฐํ์ ์ผ๋ก ์ธ์ ์ ๋ฌํ ๋
- ๊ฐํ์ ์ผ๋ก ๋ฐํํ ๋
: ๋ณต์ฌ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ์ง ์๊ณ , ๋ฐํ๋๋ ์๋ณธ๊ฐ ์์ฒด๋ฅผ ๋ฐํํจ.
-> 240729 ์์ ๋ด์ฉ์ด 100ํผ์ผํธ๊ฐ ์๋๋ค.
: ์ฐธ์กฐ๋ฐํํ ํจ์๋ & lValue ์ด๋ฏ๋ก, ๋ฐํ ํ์ ๊ฐ์ ๋์
ํ ์ ์์.
๊ทธ๋ฆฌ๊ณ ๋ณต์ฌํ ๊ฐ์ด ์๋๋ฏ๋ก, ์๋ณธ์ ๊ฐ ๋ฐ์๋จ.
: ํจ์์์ ์ ์ธ๋, ์ง์ญ๊ฐ์ฒด๋, ์ง์ญ๋ณ์๋ฅผ ์ฐธ์กฐ ๋ฐํ์ ํ๋ฉด ์๋จ.
- ์?
: ํ๊ดด๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ธ๋ถ์ ์ฐธ์กฐ๋ก ๋ฐํํ๋ค๋ ๊ฒ์
์ด๋ฏธ ์๋ฉธ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌ ๋๋ ์ฐธ์กฐ๋ก ๋จ๊ธฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ์จ๋ค.
๋ฐ์ ์์ ์ฝ๋๊ฐ ์๋ค.
-> ์๋ Problem ์ ๋ง ์ค์ํ๋ค!
-> ๊ทธ๋ฌ๋ฉด ์ด๋ป๊ฒ?
: ๊ทธ๋ฅ rvalue๋ก ๋ฐํํ์.
๊ฐ) ์ ์ญ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ณ , ํน์ ํจ์์์ ํด๋น ์ ์ญ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฐํํด์
๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ํ์ธํ๋ผ.
๋) ์์๊ฐ์ฒด์ผ ๊ฒฝ์ฐ, lvalue์ฆ, ๊ฐ๋์
์ด ๋ถ๊ฐ๋ฅํจ. -> ๋ฐํ ํ ๋ฉค๋ฒ๋ฐ์ดํฐ์ ๊ฐ์ ๋์
ํด๋ณด์๋ผ.
๋ค) ๊ฐ๋ฐํํ๋ ๊ฒ์ ์ฐธ์กฐ ๋ฐํ์ผ๋ก ๋ณ๊ฒฝํ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ผ.
๋ผ) ์ฐธ์กฐ๋ฐํ ํจ์๋ lValue๋ผ๊ณ ํด์ ๊ฐ ๋์
์ด ๊ฐ๋ฅํ๋ค๊ณ ํ๋๋ฐ, ๋์
์ ํด๋ณด์๋ผ.
-> ๋ค์ ๋ผ ํจ๊ป ์งํํจ.
๋ง) ์ฐธ์กฐ๋ฐํ ํจ์์์ ์ง์ญ๋ณ์๋ฅผ ๋ฐํํด๋ณด์. ์ด๋ป๊ฒ ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋์ง?
:
-> ๊ฒฝ๊ณ ๋ฉ์์ง๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์.
: func ์ ์ง์ญ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ฅผ ๋ฐํํ๊ณ ์๊ธฐ ๋๋ฌธ์..
๋ฏธ์ ์ ๋์์ด ๋ฐ์ํ ์ ์์.
- ์ ๊ทธ๋ด๊น์ฉ?
->
์๋ํ๋ฉด value ํ์ ๊ฐ์ฒด = & ๊ฐ์ฒด ๊ฐ ์๋ฏธํ๋ ๊ฒ์
1.value ํ์ ๊ฐ์ฒด = ํด๋์ค๋ช (& ๊ฐ์ฒด)๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด๊ณ ,
2.์์ ํํ๋ ๋ณต์ฌ ์์ฑ์ ํธ์ถ ํจ์์ ๋์ผํจ์ ์๋ฏธํจ.
: ํด๋์ค๋ช (const& ํด๋์ค๋ช obj)
ํ์ง๋ง ์ด๋ ๊ฒ ํ ๊ฒฝ์ฐ, ํด์ง๋ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌํ๋ ๊ฒ์ด๋ฏ๋ก ์ํํ ์ํฉ์.
-> ์๋์ ์์ ์ฝ๋ ์์.
2) ์ ์ญ ๋ณ์์ธ ๊ฒฝ์ฐ.
-> 1๋ฒ๊ณผ 2๋ฒ์ ๋ณด๋ฉด, ์ถ๋ ฅ์์ ์ฐจ์ด๊ฐ ์๋ค.
1๋ฒ์ ์ง์ญ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒ์ธ๋ฐ ์๋ฉธ์ด ๋ฐ์ํ ๋ค์ ๋ณต์ฌ๊ฐ ๋ฐ์ํ๋ค.
2๋ฒ์ ์ ์ญ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒ์ธ๋ฐ, ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ง๊ณ , main ๋๋๊ณ ์ดํ์ ์๋ฉธ์ด ์ด๋ฃจ์ด์ง๋ค.
: ๋ฐํํ์
์ ํจ์์์ ์ง์ญ๊ฐ์ฒด๋ฅผ ๋ฐํํ๊ฒ ๋๋ฉด, ํด๋น ์ง์ญ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ค์ด
ํธ์ถ์ ์ฝ๋์ ์ ํ ๋ฐ์๋์ง ๋ชปํ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ณ ์จ๋ค.
๋ฐ๋ ํ์
์ด value์ธ ๊ฒฝ์ฐ.
-> ๋ฐ๋ obj๊ฐ value ํ์
์ด์ด์ ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ง๊ณ , foo ์์์ ์ง์ญ๋ณ์ aa๊ฐ ๋จผ์ ์๋ฉธ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
: ์ญ??? ๋ถ๋ช
ํ ๋ณต์ฌ ์์ฑ์ ๊น์ง ๋ง๋ค์ด์คฌ๋๋ฐ??
์๋ฉธ์๊ฐ ๋จผ์ ํธ์ถ๋๋? ๋ณต์ฌ ์์ฑ์๊ฐ ๋จผ์ ํธ์ถ๋๋? ๋ฌธ์ ์ด๋ค.
์ง์ญ ๊ฐ์ฒด๋ ํจ์ ํธ์ถ์ ์คํ์ ํ ๋น๋์๋ค๊ฐ ํจ์ ์ข ๋ฃ์ ๋์์ ์๋์ผ๋ก ์ ๊ฑฐ๋๊ธฐ ๋๋ฌธ์ ๋ณต์ฌ ์ด์ ์ ์๋ฉธ์๊ฐ ๋จผ์ ํธ์ถ๋ ๊ฒ์ด๋ค.
๊ฒฐ๋ก ์ ์์ ๊ฒฝ์ฐ, ์ง์ญ๊ฐ์ฒด๊ฐ ๋จผ์ ์๋ฉธ๋ ์ดํ์ ๋ณต์ฌ๊ฐ ์ด๋ฃจ์ด์ง๋ค.
๋๋ฒ๊น
์ ํด๋ณด๋ฉด, foo() ํจ์ ํธ์ถํ๊ณ fooํจ์ ๋ด์ ๊ฐ์ฒด aa๊ฐ ์๋ฉธ๋ ํ
๋์
์ผ๋ก ํฅํ๋ค.
: char ํ์ธ a ๊ฐ ์ฐ๋ ๊ธฐ์ธ๊ฒ์ ํ์ธํ ์ ์๊ณ , ๊ทธ ๊ฒฐ๊ณผ ๋น์ฐํ ์ฐ๋ ๊ธฐ ๊ฐ์ด ์ถ๋ ฅ๋๋ค.
1) ์ฐธ์กฐ ๋ฐํ์ ํตํด์ ๋ฉ๋ชจ๋ฆฌ๋ ์ฐ์ฅํ ์ ์์.
but, ๋ฉ๋ชจ๋ฆฌ๋ง ๋จ์ ์๋ ๊ฒ์ด๊ณ , ์ ์ ๋ฉค๋ฒ ๊ฐ๋ค์ ์ด๋ฏธ ์๋ฉธ๋ ์ํ์ด๋ค.
2) ์ฐธ์กฐ ๋ฐํ์ ํ๋๋ผ๋ ๋ฐ๋ ๊ณณ์ ํ์ ์ ๋ฐ๋ผ์ ๋ณต์ฌ๊ฐ ๋ฐ์ํ ์ ์์.
////////////////////////////////////////////////////
๋ฐ๋ ํ์ ์ด value ๋ผ๋ฉด ๋ณต์ฌ ๋ฐ์
์๋ํ๋ฉด value ํ์ ๊ฐ์ฒด = & ๊ฐ์ฒด ๊ฐ ์๋ฏธํ๋ ๊ฒ์
1.value ํ์ ๊ฐ์ฒด = ํด๋์ค๋ช (& ๊ฐ์ฒด)๋ฅผ ์๋ฏธํ๋ ๊ฒ์ด๊ณ ,
2.์์ ํํ๋ ๋ณต์ฌ ์์ฑ์ ํธ์ถ ํจ์์ ๋์ผํจ์ ์๋ฏธํจ.
๊ทธ๋ผ ๋ฐ๋ ํ์ ์ด ref ์ผ๋๋ ์ ๋ณต์ฌ ์ ์ผ์ด๋จ?
์ฐธ์กฐ๋ ํผ์ ์ ์ธ์ ํ ์ ์์ , ๋ฐ๋์ lvalue ์ ํจ๊ป ํด์ผ ํจ.
์ฐธ์กฐ๋ lvalue์ ๋ฉ๋ชจ๋ฆฌ์ ๋ค๋ฅธ ์ด๋ฆ์ ์๋ฏธํ๊ธฐ ๋๋ฌธ์.
-> ๊ทธ๋ฐ๋ฐ ๋ฌธ์ ๋ ์ด๋ ๊ฒ ํ๋๋ผ๋ ํจ์ ๋ด์ ์ง์ญ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์๋ฉธ์๊ฐ ๋ฐ๋์ ์ผ์ด๋๋ค๋ ์ ์ด๋ค.
: ํจ์๋ด์์ ์ฌ๋ผ์ง๋ ์ง์ญ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ฐ.
์ด๋ฅผ ์ฐธ์กฐ๋ก ๋ฐํํ ๊ฒฝ์ฐ, ๋ฐ๋ ํ์
์ด value ์ด๋ , ์ฐธ์กฐ ํ์
์ด๋
์ด๋ฏธ ๋ฉ๋ชจ๋ฆฌ๋ ๋ ๋ผ๊ฐ ์ํ๋ผ๋ ๊ฒ์ ์ธ์งํด์ผ ํ๋ค.
value ํ์
= &ํจ์ ์ธ ๊ฒฝ์ฐ์๋ ๋ณต์ฌ ๋ฐ์, ๊ทธ๋ฆฌ๊ณ ์ฐธ์กฐ ํจ์์ ๋ฉ๋ชจ๋ฆฌ๋ ์ด๋ฏธ ์๋ค.
์ฐธ์กฐ ํ์
= &ํจ์ ์ธ ๊ฒฝ์ฐ์๋ ๋ณต์ฌ ๋ฐ์ ์ํจ. ๊ทธ๋ฌ๋ ์ฐธ์กฐ ํจ์ ๋ฉ๋ชจ๋ฆฌ ์ด๋ฏธ ์๋ค.
์ฌ๋งํ๋ฉด ๊ทธ๋ฅ ๋ณต์ฌ๋ฅผ ์ผ์ผํค๊ฒ ํ์. ์๋๋ฉด , move ํจ์๋ฅผ ์ฌ์ฉํ์.
: ๋)์ฒ๋ผ ํ ํ์ ์๋ค.
class A
{
public :
A(const A& _obj)
{
cout << "copy" << endl;
a = new char[strlen(_obj.a) + 1];
strcpy(a, _obj.a);
}
~A() { cout << "~" << endl; delete[] a; }
A(A&& _moveObj) noexcept
{
cout << "move" << endl;
a = _moveObj.a;
_moveObj.a = 0;
}
A(const char* _c)
{
a = new char[strlen(_c) + 1];
strcpy(a, _c);
cout << "A::a Alloc" << endl;
}
char* a;
};
A foo()
{
A aa{ "hello" };
cout << "foo ํจ์ ๋ด์ ๋ฉ๋ชจ๋ฆฌ๋ " << &aa << endl;
return aa;
}
int main()
{
A obj = foo();
cout << &obj << endl; cout << obj.a << endl;
}