Merge changes from Privo into master

sarojaba authored
revision 889d696d1fd42bdf74c3e8e56db6dbf25f364618
drop
# 5.21. Drop

Now that we’ve discussed traits, let’s talk about a particular trait provided
by the Rust standard library, [`Drop`][drop]. The `Drop` trait provides a way
to run some code when a value goes out of scope. For example
드랍 (Drop) - 100%

지금까지 traits을 다루었으므로 Rust 표준 라이브러리가 제공하는 특별한 trait인 [`Drop`][drop]에 대하여 다루어봅시다. `Drop` trait은 값이 scope를 벗어났을 때 일부 코드를 실행시키는 방법을 제공합니다. 예제
:

[drop]: ../std/ops/trait.Drop.html

```rust
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
```

When `x` goes out of scope at the end of `main()`, the code for `Drop` will
run. `Drop` has one method, which is also called `drop()`. It takes a mutable
reference to `self`.

That’s it! The mechanics of `Drop` are very simple, but there are some
subtleties. For example, values are dropped in the opposite order they are
declared. Here’s another example
`x`가 `main()`의 마지막에서 scope를 벗어났을 때, `Drop`에 대한 코드가 실행됩니다. `Drop`은 `drop()` 메서드를 하나 가지고 있습니다. 이는 `&mut self`를 인자로 받습니다.

이게 전부입니다! `Drop`의 작동 원리는 매우 간단합니다만, 약간의 중요한 요소가 남아있습니다. 예로 선언된 순서의 역순으로 값들은 드랍됩니다. 여기 또다른 예제가 있습니다.
:

```rust
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 };
}
```

This will output결과:

```text
BOOM times 100!!!
BOOM times 1!!!
```

The TNT goes off before the firecracker does, because it was declared
afterwards. Last in, first out.

So what is `Drop` good for? Generally, `Drop` is used to clean up any resources
associated with a `struct`. For example, the [`Arc` type][arc] is a
reference-counted type. When `Drop` is called, it will decrement the reference
count, and if the total number of references is zero, will clean up the
underlying value
폭죽(firecracker)가 터지기 전에 TNT가 먼저 터집니다. 왜냐하면 나중에 선언되었기 때문입니다. 즉 Last in, first out: 나중에 들어온 것이, 먼저 나갑니다.

그렇다면 `Drop`은 어디에 사용될까요? 일반적으로, `Drop`은 `struct`와 관련된 자원을 청소할 때 사용됩니다. 예로 [`Arc` type][arc]는 참조를 헤아리는 타입입니다. `Drop`이 실행될 때, [`Arc`][arc]는 참조의 수를 감소시킵니다. 만약 참조의 수가 0에 도달한다면, [`Arc`][arc]는 내부의 값을 청소할 것입니다
.

[arc]: ../std/sync/struct.Arc.html