5.20. 드랍 (Drop) - 100%
지금까지 traits을 다루었으므로 Rust 표준 라이브러리가 제공하는 특별한 trait인 <code>Drop</code>에 대하여 다루어봅시다. Drop
trait은 값이 scope를 벗어났을 때 일부 코드를 실행시키는 방법을 제공합니다. 예제:
struct HasDrop;
impl Drop for HasDrop {
fn drop(&mut self) {
println!("Dropping!");
}
}
fn main() {
let x = HasDrop;
// do stuff
} // x goes out of scope here
x
가 main()
의 마지막에서 scope를 벗어났을 때, Drop
에 대한 코드가 실행됩니다. Drop
은 drop()
메서드를 하나 가지고 있습니다. 이는 &mut self
를 인자로 받습니다.
이게 전부입니다! Drop
의 작동 원리는 매우 간단합니다만, 약간의 중요한 요소가 남아있습니다. 예로 선언된 순서의 역순으로 값들은 드랍됩니다. 여기 또다른 예제가 있습니다.:
struct Firework {
strength: i32,
}
impl Drop for Firework {
fn drop(&mut self) {
println!("BOOM times {}!!!", self.strength);
}
}
fn main() {
let firecracker = Firework { strength: 1 };
let tnt = Firework { strength: 100 };
}
결과:
BOOM times 100!!!
BOOM times 1!!!
폭죽(firecracker)가 터지기 전에 TNT가 먼저 터집니다. 왜냐하면 나중에 선언되었기 때문입니다. 즉 Last in, first out: 나중에 들어온 것이, 먼저 나갑니다.
그렇다면 Drop
은 어디에 사용될까요? 일반적으로, Drop
은 struct
와 관련된 자원을 청소할 때 사용됩니다. 예로 <code>Arc<T></code> type는 참조를 헤아리는 타입입니다. Drop
이 실행될 때, <code>Arc<T></code>는 참조의 수를 감소시킵니다. 만약 참조의 수가 0에 도달한다면, <code>Arc<T></code>는 내부의 값을 청소할 것입니다.