Updated variable-bindings.md

SoonBin authored
revision dc198dac60c00c411efeff203ca65cad300c07c5
variable-bindings
# 5.1. 변수 바인딩 (Variable Bindings) - 90%

사실상 모든 'Hello World’가 아닌 Rust 프로그램은 *변수 바인딩*을 사용합니다. 다음을 보세요.

```rust
fn main() {
let x = 5;
}
```

각 예제마다 `fn main() {`을 넣는것은 쫌 귀찮기 때문에 이후로는 생략할 것입니다. 특별한 언급이 없다면, `main()` 함수를 수정하시면 됩니다. 그렇지 않는다면, 에러가 날 것입니다.

이것은 많은 언어들에서, *변수(variable)*라고 합니다. 그렇지만 Rust의 변수 바인딩은 몇가지 꼼수를 가지고 있습니다. 예를 들어, 변수 이름뿐만 아니라 `let` 식이 ‘[패턴][pattern]’의 왼쪽에 올 수 있습니다. 다음과 같이 할 수 있다는 뜻입니다.

```rust
let (x, y) = (1, 2);
```

이 식이 평가되고 나면, `x`는 1이 되고, `y`는 2가 됩니다. 패턴은 진짜로 강력하고, 이 책에선 [자체 섹션][pattern]도 있습니다. 우리는 아직 이 기능이 필요하지 않기 때문에, 진도를 나아가기 위해 마음 한구석에만 잘 담아둡시다.

[pattern]: patterns.html

Rust는 정적 타입 언어입니다. 그 말은 앞에 타입을 명시해줘야 한다는 것을 의미하고, 컴파일중에 검증됩니다. 하지만 왜 첫번째 예제는 컴파일 될까요? 흠, Rust는 ‘타입 추론(type inference)’ 이라고 하는 기능을 가지고 있습니다. 무언가의 타입을 알아낼 수 있다면, Rust는 타입을 주는 것을 필요로 하지 않습니다.

우리는 원한다면 타입을 추가할 수 있습니다. 타입은 콜론(`:`) 뒤에 옵니다.

```rust
let x: i32 = 5;
```

제가 여러분께 교실의 다른 친구들에게 큰 소리로 읽어달라고 한다면, "`x`는 `i32` 타입과 `five` 값에 바인딩되었다."라고 할 것입니다.

이 경우, `x`를 32 비트 부호있는 정수로 선택했습니다. Rust는 서로 다른 많은 기본 정수 타입을 가지고 있습니다. 부호있는 정수는 `i`로, 부호없는 정수는 `u`로 시작합니다. 가능한 정수 크기는 8, 16, 32, 64 비트입니다.

이후 예제부터, 타입에 대해 주석을 달지도 모르겠네요. 이렇게요.

```rust
fn main() {
let x = 5; // x: i32
}
```

이 주석이 문법과 유사한 것은 `let`과 함께 쓰인다는 정도입니다. 이런 식의 주석을 포함하는 것은 관용적인 Rust 언어는 아니지만, 어떤 타입이 추론되었는지 이해하기 쉽게 해줍니다.

기본적으로, 바인딩은 *불변(immutable)* 입니다. 이 코드는 컴파일 안됩니다.

```rust,ignore
let x = 5;
x = 10;
```

이런 에러를 토해낼 겁니다.

```text
error: re-assignment of immutable variable `x`
x = 10;
^~~~~~~
```

변할수 있도록 바인딩하길 원한다면, `mut`를 사용하면 됩니다.

```rust
let mut x = 5; // mut x: i32
x = 10;
```

바인딩이 기본적으로 불변인 것이 하나의 이유만 있는것은 아니지만, 우리는 Rust의 기본적인 관점중 하나에 대해 생각해볼 수 있습니다. 바로 안전성이죠. 만약 `mut`라고 적는 것을 까먹었다면, 컴파일러는 알아챌 것이고, 여러분이 바꿀 의도가 없었는데 무언갈 바꾸려고 했다고 알려줍니다. 바인딩이 기본적으로 변경 허용이었다면, 컴파일러는 이를 알려줄 수가 없을 것입니다. 여러분이 _정말_ 변경을 의도한다면, 방법은 간단합니다. `mut`를 적으세요.

다른 좋은 이유는 가능한 변경되는 상태를 피할수 있다는 것이지만, 이 문서의 범위를 벗어나는 내용입니다. 일반적으로, Rust에서는 노골적인 변경을 피하는 것이 더 선호됩니다. 때때로 이 말은, 변경은 필요로 할때만, 그래서 그래서 금지하지는 않습니다.

이제 다시 바인딩으로 돌아가봅시다. Rust의 변수 바인딩은 다른 언어와는 하나 이상의 차이점을 가지고 있습니다. 바인딩은 여러분이 그것을 사용하기 전에 값과 함께 초기화되어야 합니다.

한번 해봅시다. `src/main.rs` 파일을 다음처럼 수정해 보세요.

```rust
fn main() {
let x: i32;

println!("Hello world!");
}
```

빌드하기 위해 커맨드 라인에서 `cargo build`를 할 수 있습니다. 경고가 표시되겠지만, 여전히 "Hello, world!"를 출력할 것입니다.

```text
Compiling hello_world v0.0.1 (file:///home/you/projects/hello_world)
src/main.rs:2:9: 2:10 warning: unused variable: `x`, #[warn(unused_variable)] on by default
src/main.rs:2 let x: i32;
^
```

Rust는 변수 바인딩을 하지 않았다고 경고를 합니다만, 우리는 그것을 사용하지 않기 때문에, 해롭지도, 잘못되지도 않았습니다. 그러나 `x`를 사용한다면 상황이 다릅니다. 한번 해보죠. 다음과 같이 프로그램을 수정해보세요.

```rust,ignore
fn main() {
let x: i32;

println!("The value of x is: {}", x);
}
```

그리고 빌드를 시도하면 에러가 표시될 것입니다.

```bash
$ cargo build
Compiling hello_world v0.0.1 (file:///home/you/projects/hello_world)
src/main.rs:4:39: 4:40 error: use of possibly uninitialized variable: `x`
src/main.rs:4 println!("The value of x is: {}", x);
^
note: in expansion of format_args!
:2:23: 2:77 note: expansion site
:1:1: 3:2 note: in expansion of println!
src/main.rs:4:5: 4:42 note: expansion site
error: aborting due to previous error
Could not compile `hello_world`.
```

Rust는 초기화되지 않은 값을 사용하는 것을 허용하지 않습니다. 다음으로, `println!`에서 발생한 일에 대해 다뤄봅시다.

출력할 문자열에 두 개의 중괄호(`{}`, 콧수염(moustaches)이라고 부르기도 합니다.)가 포함되어 있다면, Rust는 어떤 종류의 값을 삽입하라는 요청으로 해석할 것입니다. *문자열 삽입(String interpolation)*은 컴퓨터 과학 용어로 "문자열 중간에 붙히다(stick in the middle of a string)."라는 의미입니다. 쉼표 뒤의, `x`는, 삽입할 값을 가리킵니다. 복수개의 인자를 넘긴다면, 쉼표는 함수와 매크로에 넘기는 인자를 구분하는데 쓰입니다.

When you just use the curly braces, Rust will attempt to display the
value in a meaningful way by checking out its type. If you want to specify the
format in a more detailed manner, there are a [wide number of options
available][format]. For now, we'll just stick to the default:
integers aren't very complicated to print.
중괄호를 사용하면, 러스트는 그것의 타입을 확인해서 값을 명확히 드러내도록 해줄 것입니다. 하지만 만약 더 구체적인 정보를 명시하고 싶으면, [많은 종류의 옵션][format]이 존재합니다. 정수는 그다지 복잡하게 출력되지 않기 때문에, 지금부터는 그냥 기본값으로 가도록 하죠:

[format]: ../std/fmt/index.html