Drop ํŠธ๋ ˆ์ž‡

DropํŠธ๋ ˆ์ž‡์„ ๊ตฌํ˜„ํ•˜๋ฉด, ๊ทธ ๊ฐ’์ด ์Šค์ฝ”ํ”„ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐˆ ๋•Œ ์‹คํ–‰๋  ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

struct Droppable {
    name: &'static str,
}

impl Drop for Droppable {
    fn drop(&mut self) {
        println!("{} ์‚ญ์ œ ์ค‘", self.name);
    }
}

fn main() {
    let a = Droppable { name: "a" };
    {
        let b = Droppable { name: "b" };
        {
            let c = Droppable { name: "c" };
            let d = Droppable { name: "d" };
            println!("B ๋ธ”๋ก์—์„œ ๋‚˜๊ฐ€๊ธฐ");
        }
        println!("A ๋ธ”๋ก์—์„œ ๋‚˜๊ฐ€๊ธฐ");
    }
    drop(a);
    println!("main์—์„œ ๋‚˜๊ฐ€๊ธฐ");
}
This slide should take about 8 minutes.
  • std::mem::drop์€ std::ops::Drop::drop๊ณผ ๊ฐ™์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ฐ’์ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฉด ์ž๋™์œผ๋กœ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  • ๊ฐ’์ด ์‚ญ์ œ๋  ๋•Œ std::ops::Drop์„ ๊ตฌํ˜„ํ•˜๋ฉด Drop::drop ๊ตฌํ˜„์ด ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋ฉด Drop ๊ตฌํ˜„ ์—ฌ๋ถ€์™€ ๊ด€๊ณ„์—†์ด ํ•ด๋‹น ํ•„๋“œ๋„ ๋ชจ๋‘ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.
  • std::mem::drop์€ ๊ฐ’์„ ์‚ฌ์šฉํ•˜๋Š” ๋นˆ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ์ ์€ ๊ฐ’์˜ ์†Œ์œ ๊ถŒ์„ ๊ฐ€์ง€๋ฏ€๋กœ ๋ฒ”์œ„ ๋์—์„œ ์‚ญ์ œ๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚  ๋•Œ๋ณด๋‹ค ๋นจ๋ฆฌ ๊ฐ’์„ ๋ช…์‹œ์ ์œผ๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
    • ์ด๋Š” drop์—์„œ ์ž ๊ธˆ ํ•ด์ œ, ํŒŒ์ผ ๋‹ซ๊ธฐ ๋“ฑ์˜ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๊ฐ์ฒด์— ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ผ์˜์ :

  • Drop::drop์€ ์™œ self๋ฅผ ์ธ์ž๋กœ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๊นŒ?
    • ์งง์€ ๋Œ€๋‹ต: ๋งŒ์•ฝ ๊ทธ๋ ‡๊ฒŒ ๋œ๋‹ค๋ฉด std::mem::drop์ด ๋ธ”๋ก์˜ ๋์—์„œ ํ˜ธ์ถœ๋˜๊ณ , ๋‹ค์‹œ Drop::drop์„ ํ˜ธ์ถœํ•˜๊ฒŒ ๋˜์–ด, ์Šคํƒ ์˜ค๋ฒ„ํ”Œ๋กœ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค!
  • drop(a)๋ฅผ a.drop()๋กœ ๋ณ€๊ฒฝํ•ด ๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.