Move ๋ฌธ๋ฒ
(๋ณ์์) ํ ๋น์ _์์ ๊ถ_์ ๋ณ์ ๊ฐ์ ์ด๋์ํต๋๋ค:
fn main() { let s1: String = String::from("Hello!"); let s2: String = s1; println!("s2: {s2}"); // println!("s1: {s1}"); }
s1
์s2
์ ํ ๋นํ์ฌ ์์ ๊ถ์ ์ด์ ์ํต๋๋ค.s1
์ ์ค์ฝํ๊ฐ ์ข ๋ฃ๋๋ฉด ์๋ฌด ์ผ๋ ์์ต๋๋ค: ์๋ํ๋ฉดs1
์ ์๋ฌด๋ฐ ์์ ๊ถ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค.s2
์ ์ค์ฝํ๊ฐ ์ข ๋ฃ๋๋ฉด ๋ฌธ์์ด ๋ฐ์ดํฐ๋ ํด์ ๋ฉ๋๋ค.
s2
๋ก ์ด๋ ์ ๋ฉ๋ชจ๋ฆฌ:
s2
๋ก ์ด๋ ํ ๋ฉ๋ชจ๋ฆฌ:
๊ฐ์ ํจ์์ ์ ๋ฌํ ๋, ๊ทธ ๊ฐ์ ๋งค๊ฐ๋ณ์์ ํ ๋น๋ฉ๋๋ค. ์ด๋ ์์ ๊ถ์ ์ด๋์ด ์ผ์ด๋ฉ๋๋ค:
fn say_hello(name: String) { println!("์๋ ํ์ธ์ {name}") } fn main() { let name = String::from("Alice"); say_hello(name); // say_hello(name); }
-
์ด๋ C++๊ณผ ์ ๋ฐ๋ ์์ ์ค๋ช ํ์ธ์. C++์์๋ ๋ณต์ฌ๊ฐ ๊ธฐ๋ณธ์ด๊ณ ,
std::move
๋ฅผ ์ด์ฉํด์ผ๋ง (๊ทธ๋ฆฌ๊ณ ์ด๋ ์์ฑ์๊ฐ ์ ์๋์ด ์์ด์ผ๋ง!) ์์ ๊ถ ์ด์ ์ด ๋ฉ๋๋ค. -
์ค์ ๋ก ์ด๋๋๋ ๊ฒ์ ์์ ๊ถ์ผ ๋ฟ์ ๋๋ค. ๋จธ์ ์ฝ๋ ๋ ๋ฒจ์์ ๋ฐ์ดํฐ ๋ณต์ฌ๊ฐ ์ผ์ด๋ ์ง ๋ง ์ง์ ๋ํ ๊ฒ์ ์ปดํ์ผ๋ฌ ๋ด๋ถ์์ ์ผ์ด๋๋ ์ต์ ํ ๋ฌธ์ ์ ๋๋ค. ์ด๋ฐ ๋ณต์ฌ๋ ์ต์ ํ ๊ณผ์ ์์ ์ ๊ฑฐ๊ฐ ๋ฉ๋๋ค.
-
์ ์์ ๊ฐ์ ๊ฐ๋จํ ๊ฐ๋ค์
Copy
(๋ค์ ์ค๋ช ํฉ๋๋ค)๋ก ๋งํน๋ ์ ์์ต๋๋ค. -
๋ฌ์คํธ์์๋ ๋ณต์ฌํ ๋์๋ ๋ช ์์ ์ผ๋ก
clone
์ ์ฌ์ฉํฉ๋๋ค.
say_hello
์:
say_hello
ํจ์์ ์ฒซ๋ฒ์งธ ํธ์ถ์main
ํจ์๋ ์์ ์ด ๊ฐ์งname
์ ๋ํ ์์ ๊ถ์ ํฌ๊ธฐํ๋ฏ๋ก, ์ดํmain
ํจ์์์๋name
์ ์ฌ์ฉํ ์ ์์ต๋๋ค.name
์ ํ ๋น๋์๋ ํ ๋ฉ๋ชจ๋ฆฌ๋say_hello
ํจ์์ ๋์์ ํด์ ๋ฉ๋๋ค.main
ํจ์์์name
์ ์ฐธ์กฐ๋ก ์ ๋ฌ(๋น๋ฆผ)ํ๊ณ (&name
),say_hello
์์ ๋งค๊ฐ๋ณ์๋ฅผ ์ฐธ์กฐํ์ผ๋ก ์์ ํ๋ค๋ฉดmain
ํจ์๋name
์ ์์ ๊ถ์ ์ ์งํ ์ ์์ต๋๋ค.- ๋๋ ์ฒซ๋ฒ์งธ ํธ์ถ ์
main
ํจ์์์name
์ ๋ณต์ ํ์ฌ ์ ๋ฌํ ์๋ ์์ต๋๋ค.(name.clone()
) - ๋ฌ์คํธ๋ ์ด๋์ ๊ธฐ๋ณธ์ผ๋ก ํ๊ณ ๋ณต์ ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ธํ๋๋ก ๋ง๋ฌ์ผ๋ก, ์๋์น ์๊ฒ ๋ณต์ฌ๋ณธ์ ๋ง๋๋ ๊ฒ์ด C++์์๋ณด๋ค ์ด๋ ต์ต๋๋ค.
๋ ์ดํด๋ณด๊ธฐ
Defensive Copies in Modern C++
Modern C++์ ์ด ๋ฌธ์ ๋ฅผ ๋ค๋ฅด๊ฒ ํด๊ฒฐํฉ๋๋ค:
std::string s1 = "Cpp";
std::string s2 = s1; // s1์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํฉ๋๋ค.
s1
์ ํ ๋ฐ์ดํฐ๋ ๋ณต์ ๋๊ณ ,s2
๋ ๋ ๋ฆฝ์ ์ธ ๋ณต์ฌ๋ณธ์ ์ป์ต๋๋ค.s1
์s2
์ ์ค์ฝํ๊ฐ ์ข ๋ฃ๋๋ฉด ๊ฐ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋ฉ๋๋ค.
๋ณต์ฌ ์ :
๋ณต์ฌ ํ:
ํค ํฌ์ธํธ:
-
C++๋ Rust์ ์ฝ๊ฐ ๋ค๋ฅธ ์ ํ์ ํ์ต๋๋ค.
=
๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๋ฏ๋ก ๋ฌธ์์ด ๋ฐ์ดํฐ๊ฐ ํด๋ก ๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฌธ์์ด ์ค ํ๋๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ double-free๊ฐ ๋ฐ์ํฉ๋๋ค. -
C++์๋ ๊ฐ์ ์ด๋ํ ์ ์๋ ์์ ์ ๋ํ๋ด๋ ๋ฐ ์ฌ์ฉ๋๋
std::move
๋ ์์ต๋๋ค. ์๊ฐs2 = std::move(s1)
์ด์๋ค๋ฉด ํ ํ ๋น์ด ๋ฐ์ํ์ง ์์ต๋๋ค. ์ด๋ ํ์๋s1
์ด ์ ํจํ์ง๋ง ์ง์ ๋์ง ์์ ์ํ๊ฐ ๋ฉ๋๋ค. Rust์ ๋ฌ๋ฆฌ ํ๋ก๊ทธ๋๋จธ๋s1
์ ๊ณ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. -
Rust์ ๋ฌ๋ฆฌ, C++์
=
๋ ๋ณต์ฌ๋๊ฑฐ๋ ์ด๋๋๋ ํ์ ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ ์์์ ์ฝ๋๋ฅผ ์คํํ ์ ์์ต๋๋ค.