INTRO
int total {0};
total = 100 + 200;
์ ์ฝ๋์์ total์ ํฌ์ธํฐ๋ก ์ ๊ทผํ ์ ์๋ ๋ณ์ ๊ฐ, L-Value์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ total์ ํ ๋น๋๋ 100+200 ์์์ ํฌ์ธํฐ๋ก ์ ๊ทผํ ์ ์๋ R-Value์ ๋๋ค.
C++์์ ์ด๋ฐ ๊ฐ๋ค์ ์ด๋ฆ์๋ temp value๋ก ์ผ์์ ์ผ๋ก ์ ์ฅ๋์๋ค๊ฐ,
total๊ณผ ๊ฐ์ ๊ฐ์ ๋ณต์ฌ ์ ์ฅ๋๊ณ ๋ ๋ค ์ ๊ฑฐ๋ฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ ์ผ์ด temp value๋ฅผ temp object๋ก๋ง ๋ฐ๋์ด์ ๊ฐ์ฒด์์๋ ๋ฐ์ํฉ๋๋ค.
๋ณต์ฌ ์์ฑ์๋ฅผ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ, ๋ณต์ฌ ์์ฑ์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ํธ์ถํ๊ฒ ๋๋ฉด temporary object๊ฐ ๊ทธ๋งํผ ๋ง์ด ์์ฑ๋ฉ๋๋ค.
๋ฐ๋ฉด ๊ฐ์ฒด๋ ์๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง์ด ์๊ตฌํฉ๋๋ค.
Deep copy๋ฅผ ํํ๋ฉด ๋์ฑ ๋ง์ด ์๊ตฌ๋๊ฒ ์ฃ ?
์ด๋ฐ ์ด์ ์์ Move Semantics, Move Constructor (์ด๋ ์์ฑ์) ๊ฐ ๋ฑ์ฅํฉ๋๋ค.
์ด๋ฅผ ์ดํดํ๊ธฐ ์ํด์๋ ์ฐ์ R-Value References์ ๋ํด์ ์ดํดํด์ผํฉ๋๋ค.
L-Value References์๋ ๋ค๋ฅด๊ฒ r-value references๋ double ampersand(&&) ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ง๊ด์ ์ธ ์์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
int x{100};
int &l_ref = x; // l-value reference
l_ref = 50;
int &&r_ref = 500; // r-value reference
r_ref = 300;
int &&x_ref = x; // COMPILER ERROR
&l_ref ๋ single ampersand๋ก ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ l-value์ธ x๋ฅผ ๊ฐ์ผ๋ก ์ง๋ ์ ์์ต๋๋ค.
&&r_ref๋ double ampersand๋ก ์ ์ธ๋์๊ธฐ ๋๋ฌธ์ r-value์ธ 500์ ๊ฐ์ผ๋ก ์ง๋ ์ ์์ต๋๋ค.
&&๋ก ์ ์ธ๋ x_ref์ x๋ฅผ ์ ์ฅํ๋ ค๊ณ ํ๋ฉด l-value ์ด๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํจ์์์๋ ๋์ผํ๊ฒ ์ ์ฉ๋ฉ๋๋ค.
int x {100};
void func(int &&num);
func(200); // OK
func(x); // COMPILE ERROR
r-value reference๋ฅผ ์ธ์๋ก ๋ฐ๋ func์ ์ ์๋ฅผ ์ง์ ์ ๋ ฅํ๋ฉด ๋ฌธ์ ๊ฐ ์์ง๋ง,
l-value์ธ ๋ณ์๋ฅผ ์ ๋ ฅํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฌ๊ธฐ๊น์ง ์ดํดํ๊ณ ์ด๋ ์์ฑ์๋ฅผ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Move Constructor (์ด๋ ์์ฑ์)
์ด๋ ์์ฑ์๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ์ง ์๊ณ ์ด๋์ํต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ธ ์ธก๋ฉด์์ ๋งค์ฐ ํจ์จ์ ์ ๋๋ค.
์ด๋ ์์ฑ์์ ํ๋กํ ํ์ ๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Type::Type(Type &&source);
Player::Player(Player &&source);
Move::Move(Move &&source);
๊ธฐ์กด์ ์ฌ์ฉํ๋ ๋ณต์ฌ ์์ฑ์์ ์ ์ฌํ๊ฒ ๊ตฌ์กฐ๋์ด ์์ต๋๋ค.
์ฒซ๋ฒ์งธ ์ฐจ์ด์ ์ const ํค์๋๊ฐ ์๋ค๋ ์ ์ ๋๋ค.
์๋ณธ ๊ฐ์ฒด์ ํฌ์ธํฐ๋ฅผ null ์ผ๋ก ๋ณ๊ฒฝํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๋ฒ์งธ๋ ์ ๋ ฅ ์ธ์๋ก R-Value Reference ๋ฅผ ๋ฐ๋๋ค๋ ์ ์ ๋๋ค.
Double ampersand(&&)๋ก ํ์ธ๋ฉ๋๋ค.
์ด ์ด๋ ์์ฑ์๋ค์ ๊ตฌ์กฐ๋ ๊ฐ๋จํฉ๋๋ค.
Move::Move(Move &&source) noexcept : data(source.data) { source.data = nullptr; }
Deep copying์ผ๋ก ์ธํ ํฐ ๋ฉ๋ชจ๋ฆฌ ์๊ตฌ์์ด
๊ธฐ์กด์ source.data๊ฐ ์ง์นญํ๋ ์ฃผ์์ ์์ ๊ถ์ ์๋ก์ด ๊ฐ์ฒด์ data๊ฐ์ ์ด์ ์ํต๋๋ค.
์ฆ, ๋ณต์ฌ๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋์ ๋ถ๊ฐํผํ ๋ฉ๋ชจ๋ฆฌ ์์ ์์ด ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ผ ์ ์์ต๋๋ค.
์ค์ํ ์ ์ source.data = nullptr; ์ ํตํด์ ๊ธฐ์กด์ ๊ฐ์ null๋ก ๋ณ๊ฒฝํ๋ ๊ฒ ์ ๋๋ค.
nullptr๋ก ๋ณ๊ฒฝํด์ฃผ์ง ์๋๋ค๋ฉด shallow copying๊ณผ ๋์ผํ ํ๋์ ๋๋ค.
'C++ > ๊ฐ์ฒด์งํฅ ํ๋ก๊ทธ๋๋ฐ (OOP)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C++] ์์ ํด๋์ค | Using const with Classes (0) | 2024.01.02 |
---|---|
[C++] this keyword | this ํฌ์ธํฐ (0) | 2024.01.02 |
[C++] Shallow Copying & Deep Copying | ์์ ๋ณต์ฌ & ๊น์ ๋ณต์ฌ (1) | 2023.12.29 |
[C++] ํด๋์ค ๋ฉค๋ฒ ์ ๊ทผ ์ ํ์ | Class Member Access Modifiers (1) | 2023.12.29 |
[C++] ํจ์ ํน์ ๋ฉ์๋์์ ๊ฐ์ฒด์ ๋ถํ์ํ ๋ณต์ฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ (0) | 2023.12.29 |