볡사 νƒ€μž…

이동이 κΈ°λ³Έ μ„€μ •μ΄μ§€λ§Œ, νŠΉμ • νƒ€μž…μ€ λ³΅μ‚¬λ©λ‹ˆλ‹€:

fn main() {
    let x = 42;
    let y = x;
    println!("x: {x}"); // would not be accessible if not Copy
    println!("y: {y}");
}

μ΄λŸ¬ν•œ νƒ€μž…λ“€μ€ Copy νŠΈλ ˆμž‡μ„ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

직접 λ§Œλ“  νƒ€μž…λ“€λ„ CopyνŠΈλ ˆμž‡μ„ κ΅¬ν˜„ν•˜μ—¬ 볡사λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

#[derive(Copy, Clone, Debug)]
struct Point(i32, i32);

fn main() {
    let p1 = Point(3, 4);
    let p2 = p1;
    println!("p1: {p1:?}");
    println!("p2: {p2:?}");
}
  • ν• λ‹Ή ν›„, p1와 p2λŠ” μžμ‹ μ˜ 데이터λ₯Ό μ†Œμœ ν•©λ‹ˆλ‹€.
  • λͺ…μ‹œμ μœΌλ‘œ p1.clone()λ₯Ό μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό 볡사할 수 μžˆμŠ΅λ‹ˆλ‹€.
This slide should take about 5 minutes.

볡사(copy)와 볡제(clone)λŠ” κ°™μ§€ μ•ŠμŠ΅λ‹ˆλ‹€:

  • λ³΅μ‚¬λŠ” λ©”λͺ¨λ¦¬μ˜ λ‚΄μš©μ„ κ·ΈλŒ€λ‘œ ν•œ 벌 더 λ§Œλ“œλŠ” 것을 μ˜λ―Έν•˜λ©°, 아무 κ°μ²΄μ—μ„œλ‚˜ λ‹€ μ§€μ›ν•˜μ§€λŠ” μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ³΅μ‚¬λŠ” μ»€μŠ€ν„°λ§ˆμ΄μ¦ˆ ν•  수 μ—†μŠ΅λ‹ˆλ‹€. (C++μ—μ„œ 볡사 μƒμ„±μžλ₯Ό 톡해 볡사 λ™μž‘μ„ μž„μ˜λ‘œ κ΅¬ν˜„ν•  수 μžˆλŠ” 것과 비ꡐ가 λ©λ‹ˆλ‹€.)
  • λ³΅μ œλŠ” 보닀 일반적인 μž‘μ—…μ΄λ©°, CloneνŠΈλ ˆμž‡μ„ κ΅¬ν˜„ν•˜μ—¬ λ³΅μ œμ‹œ λ™μž‘μ„ μ»€μŠ€ν„°λ§ˆμ΄μ¦ˆ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • Drop νŠΈλ ˆμž‡μ„ κ΅¬ν˜„ν•œ νƒ€μž…μ€ λ³΅μ‚¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

μœ„μ˜ μ˜ˆμ‹œμ—μ„œ λ‹€μŒμ„ μ‹œλ„ν•΄ λ³΄μ‹œκΈ° λ°”λžλ‹ˆλ‹€:

  • Pointꡬ쑰체에 Stringν•„λ“œλ₯Ό μΆ”κ°€ν•˜μ„Έμš”. 컴파일 λ˜μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€. μ™œλƒν•˜λ©΄ String은 CopyνŠΈλ ˆμž‡μ„ κ΅¬ν˜„ν•˜κ³  μžˆμ§€ μ•ŠκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.
  • Remove Copy from the derive attribute. The compiler error is now in the println! for p1.
  • p1을 λ³΅μ œν•˜λ©΄ 잘 λ™μž‘ν•¨μ„ 확인해 λ³΄μ„Έμš”.