Merge changes from master into SoonBin

SoonBin authored
revision b55bf044086e35226a0f619ace98923b259b2efb
About
### Rust 문서 한글화 프로젝트

- 본 프로젝트는 Mozilla에서 개발한 Rust 언어의 문서를 한글화하는 프로젝트입니다.
- 현재 작업중인 문서는 [Book 1.2.0](http://doc.rust-lang.org/stable/book/) 이고, [Markdown](http://daringfireball.net/projects/markdown/basics) 포맷을 기본으로 합니다.
- 기본적인 문장체는 높임말로 끝나기만 하면 됩니다. 원문의 의도만 바뀌지 않는다면 재밌게 의역도 상관없습니다.
- 참여를 원하시는 분께서는 [sarojaba](mailto://sarojaba@gmail.com) 에게 연락주시기 바랍니다.
- 나중에 [rust](https://github.com/mozilla/rust) 프로젝트에 올릴 수 있을까요?
- 인터뷰: ['요즘 뜨는 4대 프로그래밍 언어, 이렇게 배워보세요.'](https://www.bloter.net/archives/230851)

- 최근 활발한 참여자
- [djKooks](https://www.penflip.com/djKooks)
- [handrake](https://www.penflip.com/handrake)
- [minujeong](https://www.penflip.com/minujeong)
- [jade.kim](https://www.penflip.com/jenix21)
- [jaeju_Kim](https://www.penflip.com/Jaeju_Kim)
- [SoonBin](https://www.penflip.com/SoonBin)

- 한글화 미완료 챕터 목록(작성중)
- [4.2. 테스팅 (Testing)](https://www.penflip.com/sarojaba/rust-doc-korean/blob/master/testing.md) - 50%
- [4.3. 조건부 컴파일 (Conditional Compilation)](https://www.penflip.com/sarojaba/rust-doc-korean/blob/master/conditional-compilation.md) - 30%
- [4.4. 문서화 (Documentation)](https://www.penflip.com/sarojaba/rust-doc-korean/blob/master/documentation.md) - 15%
- [4.6. 동시성 (Concurrency)](https://www.penflip.com/sarojaba/rust-doc-korean/blob/master/concurrency.md) - 10%
- [4.8. 외부 함수 인터페이스 (Foreign Function Interface)](https://www.penflip.com/sarojaba/rust-doc-korean/blob/master/ffi.md) - 0%
- [4.9. Borrow and AsRef](https://www.penflip.com/sarojaba/rust-doc-korean/blob/master/borrow-and-asref.md) - 0%
- [5.2. 함수 (Functions)](https://www.penflip.com/sarojaba/rust-doc-korean/blob/master/functions.md) - 50%
- [5.13. 열거형 (Enums)](https://www.penflip.com/sarojaba/rust-doc-korean/blob/master/enums.md) - 0%
- [5.15. 패턴 (Patterns)21. Drop](https://www.penflip.com/sarojaba/rust-doc-korean/blob/master/drop.md) - 0%
- [5.22. if let
](https://www.penflip.com/sarojaba/rust-doc-korean/blob/master/patternsif-let.md) - 0%
- [5.213. Drop트레잇 객체 (Trait Objects)](https://www.penflip.com/sarojaba/rust-doc-korean/blob/master/droptrait-objects.md) - 50%
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