Updated strings.md

ziriso authored
revision 5112152c662be0c303ddf608f0b437b790e488c1
strings
# 5.18. 문자열(Strings) - 20%

문자열은 어느 프로그래머이든 마스터가 되기위한 중요한 개념입니다. Rust의 문자열 처리 시스템은 시스템 focus 때문에 다른 언어들과 좀 다릅니다. 언제라도 여러분은 다양한 크기의 자료 구조를 가집니다. things can get tricky, 그리고 문자열은 크기 조절 가능한 자료 구조입니다. 한마디로, Rust의 문자열 또한 C와 같은 다른 시스템 언어들과는 다르게 동작한다는 것입니다.

좀 더 자세히 파봅시다. ‘문자열(string)’은 UTF-8 바이트의 스트림으로 부호화된 유니코드 스칼라 값의 나열입니다. 모든 문자열은 올바르게 부호화된 UTF-8 나열이라는 것을 보장합니다. 게다가, 몇몇 시스템 언어들과 다르게 문자열은 null로 끝나지 않고 null 바이트를 포함할 수 있습니다.

Rust에는 두가지 주요 문자열 타입이 있습니다: `&str` 과 `String` 입니다. 우선 `&str`에 대해 이야기 해볼까요? 이것들은 ‘문자열 슬라이스(string slice)’라고 부릅니다. 문자열 리터럴은 of the type `&'static str` 타입을 가집니다:

```rust
let string = "Hello there."; // string: &'static str
```

This string is statically allocated, meaning that it's saved inside our
compiled program, and exists for the entire duration it runs. The `string`
binding is a reference to this statically allocated string. String slices
have a fixed size, and cannot be mutated.

A `String`, on the other hand, is a heap-allocated string. This string
is growable, and is also guaranteed to be UTF-8. `String`s are
commonly created by converting from a string slice using the
`to_string` method
이 문자열은 정적으로 할당되며, 이것이 의미하는 바는 이것이 컴파일된 프로그램 안에 저장되어 있고, 프로그램이 실행되는 내내 존재한다는 뜻입니다. `string` 바인딩은 정적으로 할당된 문자열에 대한 참조입니다. 문자열 슬라이스는 고정된 크기를 가지며, 변경될 수 없습니다.

반면에, `String`은 힙에 할당된 문자열입니다. 이 문자열은 크기가 커질 수 있고, UTF-8 인코딩임이 보장됩니다. `String`들은 일반적으로 문자열 슬라이스를 `to_string` 메쏘드를 사용해서 변환함으로써 만들어집니다
.

```rust
let mut s = "Hello".to_string(); // mut s: String
println!("{}", s);

s.push_str(", world.");
println!("{}", s);
```

`String`s will coerce into `&str` with an `&`:을 강제적으로 `&str`로서 사용할 때는(coerce) 그 앞에 `&`을 붙입니다.

```
fn takes_slice(slice: &str) {
println!("Got: {}", slice);
}

fn main() {
let s = "Hello".to_string();
takes_slice(&s);
}
```

Viewing a `String` as a `&str` is cheap, but converting the `&str` to a
`String` involves allocating memory. No reason to do that unless you have to!

## Indexing

Because strings are valid UTF-8, strings do not support indexing:

```rust,ignore
let s = "hello";

println!("The first letter of s is {}", s[0]); // ERROR!!!
```

Usually, access to a vector with `[]` is very fast. But, because each character
in a UTF-8 encoded string can be multiple bytes, you have to walk over the
string to find the nᵗʰ letter of a string. This is a significantly more
expensive operation, and we don’t want to be misleading. Furthermore, ‘letter’
isn’t something defined in Unicode, exactly. We can choose to look at a string as
individual bytes, or as codepoints
`String`을 `&str`로서 다루는 것은 간단하지만, `&str`을 `String`로 변환하는 것은 메모리 할당을 필요로 합니다. 그럴 이유가 없다면 그렇게 하지 마시기를!

## 인덱싱

문자열들은 유효한 UTF-8로 인코딩되었기 때문에, 문자열들은 그 안의 문자들에 대해 인덱싱을 통한 접근을 지원하지 않습니다.

```rust,ignore
let s = "hello";

println!("The first letter of s is {}", s[0]); // ERROR!!!
```

일반적으로, `[]`을 통해 벡터에 접근하는 것은 아주 빠릅니다. 그러나, UTF-8로 인코딩된 문자열 안에 있는 각각의 문자들은 각각 서로 다른 길이의 바이트들로 이루어져 있기 때문에, 문자열 안의 n번째 문자를 찾기 위해서는 맨 처음부터 순서대로 탐색해 나가지 않으면 안됩니다. 이것은 상당히 비싼 동작이고, 우리는 이것이 오해를 불러 일으키기를 원치 않았습니다. 더욱이, '문자'가 정확히 무엇인지는 유니코드에서 제대로 정의되어 있지 않습니다. 우리는 문자열이 각각의 바이트들로서 보일 것인지, 혹은 codepoint로 보일 것인지 선택할 수 있습니다
:

```rust
let hachiko = "忠犬ハチ公";

for b in hachiko.as_bytes() {
print!("{}, ", b);
}

println!("");

for c in hachiko.chars() {
print!("{}, ", c);
}

println!("");
```

This prints이것은 다음을 출력합니다:

```text
229, 191, 160, 231, 138, 172, 227, 131, 143, 227, 131, 129, 229, 133, 172,
忠, 犬, ハ, チ, 公,
```

As you can see, there are more bytes than `char`s.

You can get something similar to an index like this:

```rust
# let hachiko = "忠犬ハチ公";
let dog = hachiko.chars().nth(1); // kinda like hachiko[1]
```

This emphasizes that we have to go through the whole list of `chars`.

## Concatenation

If you have a `String`, you can concatenate a `&str` to the end of it
지금 보고 있는대로, `char`의 갯수보다는 많은 바이트(byte)들이 있습니다.

인덱스를 통한 참조와 비슷한 동작을 하고 싶다면 이렇게 하십시오:

```rust
# let hachiko = "忠犬ハチ公";
let dog = hachiko.chars().nth(1); // kinda like hachiko[1]
```

이것은 `chars`들의 전체 리스트를 살펴봐야 함을 강조해 줍니다.

## 문자열 연결(Concatenation)

`String`에 대해, 그 뒤에 `&str`을 연결할 수 있습니다
:

```rust
let hello = "Hello ".to_string();
let world = "world!";

let hello_world = hello + world;
```

But if you have two `String`s, you need an `&`그러나 두개의 `String`이 있을 땐, `&`가 필요합니다:

```rust
let hello = "Hello ".to_string();
let world = "world!".to_string();

let hello_world = hello + &world;
```

This is because `&String` can automatically coerece to a `&str`. This is a
feature called ‘[`Deref` coercions][dc]’
이것은 `&String`가 자동적으로 `&str`이 되도록 강제(coerce)되기 때문입니다. 이것은 ‘[`Deref` coercions][dc]’로 불리는 특징입니다.

[dc]: deref-coercions.html