๋นŒ๋ฆผ

Rustโ€™s borrow checker puts constraints on the ways you can borrow values. For a given value, at any time:

  • You can have one or more shared references to the value, or
  • You can have exactly one exclusive reference to the value.
fn main() {
    let mut a: i32 = 10;
    let b: &i32 = &a;

    {
        let c: &mut i32 = &mut a;
        *c = 20;
    }

    println!("a: {a}");
    println!("b: {b}");
}
This slide should take about 10 minutes.
  • ์ถฉ๋Œํ•˜๋Š” ์ฐธ์กฐ๊ฐ€ ๊ฐ™์€ ์ง€์ ์— _์กด์žฌ_ํ•ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์ฐธ์กฐ๊ฐ€ ์—ญ์ฐธ์กฐ๋˜๋Š” ์œ„์น˜๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์œ„ ์ฝ”๋“œ ์ปดํŒŒ์ผ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด c๋Š” a๋ฅผ ๊ฐ€๋ณ€ ๋ณ€์ˆ˜๋กœ ๋นŒ๋ ธ๊ณ , ์ด์™€ ๋™์‹œ์— b๋Š” a๋ฅผ ๋ถˆ๋ณ€ ๋ณ€์ˆ˜๋กœ ๋นŒ๋ ธ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • b์— ๋Œ€ํ•œ println! ๊ตฌ๋ถ„์„ c๊ฐ€ ์žˆ๋Š” ์Šค์ฝ”ํ”„ ์•ž์œผ๋กœ ์ด๋™ํ•˜๋ฉด ์ปดํŒŒ์ผ์ด ๋ฉ๋‹ˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๋ฐ”๊พธ๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” c๊ฐ€ a๋ฅผ ๊ฐ€๋ณ€ ๋ณ€์ˆ˜๋กœ ๋นŒ๋ฆฌ๊ธฐ ์ „์—๋งŒ b๊ฐ€ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋ฆผ ๊ฒ€์‚ฌ๊ธฐ์˜ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ โ€œnon-lexical lifetimeโ€ ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.
  • The exclusive reference constraint is quite strong. Rust uses it to ensure that data races do not occur. Rust also relies on this constraint to optimize code. For example, a value behind a shared reference can be safely cached in a register for the lifetime of that reference.
  • ๋นŒ๋ฆผ ๊ฒ€์‚ฌ๊ธฐ๋Š” ๊ตฌ์กฐ์ฒด์˜ ์—ฌ๋Ÿฌ ํ•„๋“œ์— ๋Œ€ํ•œ ๋ฐฐํƒ€์  ์ฐธ์กฐ๋ฅผ ๋™์‹œ์— ๊ฐ€์ ธ์˜ค๋Š” ๋“ฑ ์—ฌ๋Ÿฌ ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์„ ์ˆ˜์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ๋Œ€๋กœ โ€œ์ธ์‹โ€œํ•˜์ง€ ๋ชปํ•ด โ€œ๋นŒ๋ฆผ ๊ฒ€์‚ฌ๊ธฐ์™€์˜ ์ถฉ๋Œโ€œ์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.