Updated getting-started.md

jhonghee authored
revision b3e72c5e5a775b6ab844db0809b9383789dc5a3e
getting-started
# 2. 시작하기(Getting Started) - 2100%

이 책의 첫 번째 장을 통해 여러분은 Rust와 Rust에 관련된 도구들을 챙기게 될 거에요. 먼저 우리는 Rust를 설치할 것입니다. 그 다음은 전통적인 "안녕, 세상아_Hello, World_" 프로그램이죠. 마지막으로 Rust의 빌드 시스템이자 패키지 매니저인 Cargo에 대해서 이야기할 것입니다.

# Rust 설치하기

먼저 Rust를 사용하기 위해선 Rust를 설치해야 합니다. 우선 여러분이 이 장에서 소개된 명령어들을 실행하려면 인터넷에 연결되어 있어야 합니다.

이 책에서는 터미널에서 사용되는 몇 개의 명령어의 시작을 `$` 를 표시하여 강조할 것입니다.
하지만 `$` 는 해당 라인이 커맨드라는 사실을 나타낼 뿐이므로 실제로 입력하지 않아도 됩니다.
인터넷에 존재하는 많은 튜토리얼과 예제에서 `$` 는 보통 유저(일반적인 권한을 가진 유저)가 실행하는 커맨드들의 앞에 표시하고, `#`은 관리자(관리자 권한을 가진 유저)가 실행하는 명령어들 앞에 표시하는 관습이 있는데요, 이 책도 역시 그 관습을 따릅니다.


## 플랫폼 지원

'러스트' 는 수많은 플랫폼에서 컴파일되고 실행될 수 있습니다. 러스트가 지원하는 플랫폼들은 크게 세 가지로 나뉠 수 있습니다.


### 단계 1

1단계 플랫폼들은 쉽게 생각해서 '빌드가 가능하고 실행 가능한' 플랫폼입니다. 정확히는 아래의 요구사항을 만족하는 플랫폼입니다.

요구사항 -
- 테스트를 수행하기 위한 자동화가 되어 있음.
- `rustlang/rust` 저장소에 새로운 변경사항이 있을 때 테스트를 통과하는지 확인함.
- 플랫폼을 공식적으로 지원함.
- 해당 플랫폼에서 러스트를 빌드하고 사용하기위한 문서가 작성돼있음.


| 타겟 플랫폼 | std |rustc|cargo| 비고 |
|-------------------------------|-----|-----|-----|----------------------------|
| `x86_64-pc-windows-msvc` | ✓ | ✓ | ✓ | 64-bit MSVC (Windows 7+) |
| `i686-pc-windows-gnu` | ✓ | ✓ | ✓ | 32-bit MinGW (Windows 7+) |
| `x86_64-pc-windows-gnu` | ✓ | ✓ | ✓ | 64-bit MinGW (Windows 7+) |
| `i686-apple-darwin` | ✓ | ✓ | ✓ | 32-bit OSX (10.7+, Lion+) |
| `x86_64-apple-darwin` | ✓ | ✓ | ✓ | 64-bit OSX (10.7+, Lion+) |
| `i686-unknown-linux-gnu` | ✓ | ✓ | ✓ | 32-bit Linux (2.6.18+) |
| `x86_64-unknown-linux-gnu` | ✓ | ✓ | ✓ | 64-bit Linux (2.6.18+) |

### Tier 2

2단계 플랫폼들은 러스트 코드를 빌드할 수 있는 플랫폼입니다. 자동화된 테스트는 수행되지 않기 때문에 이 플랫폼에서 완벽한 작동은 보장할 순 없지만 꽤 잘 작동합니다. 이 플랫폼에 대한 패치는 언제나 환영합니다!

요구사항-
- 자동화된 테스트가 있지만 실행되지는 않을 수 있음.
- `rustlang/rust` 저장소의 master branch에 변경사항이 있을 때 **빌드**가 되는지 확인함. 어떤 플랫폼에서는 완벽히 작동하는 반면, 어떤 플랫폼에서는 빌드만 될 수 있음.
- 플랫폼을 공식적으로 지원함.


| 타겟 플랫폼 | std |rustc|cargo| 비고 |
|-------------------------------|-----|-----|-----|----------------------------|
| `i686-pc-windows-msvc` | ✓ | ✓ | ✓ | 32-bit MSVC (Windows 7+) |

### 3단계

3단계 플랫폼들은 러스트를 지원하나, 최신 버전의 빌드와 검증 작업이 이루어지지 않은 플랫폼들을 말합니다. 이러한 플랫폼들을 개별 커뮤니티들에 의해 유지되는 경우가 많기 때문에 퀄리티가 보장되지 않을 수 있습니다. 포함 패키지들과 인스톨러가 공식적으로 제공되지 않지만 커뮤니티에 의해 지원 될 수도 있습니다.

| 타겟 플랫폼 | std |rustc|cargo| 비고 |
|-------------------------------|-----|-----|-----|----------------------------|
| `x86_64-unknown-linux-musl` | ✓ | | | 64-bit Linux with MUSL |
| `arm-linux-androideabi` | ✓ | | | ARM Android |
| `i686-linux-android` | ✓ | | | 32-bit x86 Android |
| `aarch64-linux-android` | ✓ | | | ARM64 Android |
| `arm-unknown-linux-gnueabi` | ✓ | ✓ | | ARM Linux (2.6.18+) |
| `arm-unknown-linux-gnueabihf` | ✓ | ✓ | | ARM Linux (2.6.18+) |
| `aarch64-unknown-linux-gnu` | ✓ | | | ARM64 Linux (2.6.18+) |
| `mips-unknown-linux-gnu` | ✓ | | | MIPS Linux (2.6.18+) |
| `mipsel-unknown-linux-gnu` | ✓ | | | MIPS (LE) Linux (2.6.18+) |
| `powerpc-unknown-linux-gnu` | ✓ | | | PowerPC Linux (2.6.18+) |
| `i386-apple-ios` | ✓ | | | 32-bit x86 iOS |
| `x86_64-apple-ios` | ✓ | | | 64-bit x86 iOS |
| `armv7-apple-ios` | ✓ | | | ARM iOS |
| `armv7s-apple-ios` | ✓ | | | ARM iOS |
| `aarch64-apple-ios` | ✓ | | | ARM64 iOS |
| `i686-unknown-freebsd` | ✓ | ✓ | | 32-bit FreeBSD |
| `x86_64-unknown-freebsd` | ✓ | ✓ | | 64-bit FreeBSD |
| `x86_64-unknown-openbsd` | ✓ | ✓ | | 64-bit OpenBSD |
| `x86_64-unknown-netbsd` | ✓ | ✓ | | 64-bit NetBSD |
| `x86_64-unknown-bitrig` | ✓ | ✓ | | 64-bit Bitrig |
| `x86_64-unknown-dragonfly` | ✓ | ✓ | | 64-bit DragonFlyBSD |
| `x86_64-rumprun-netbsd` | ✓ | | | 64-bit NetBSD Rump Kernel |
| `i686-pc-windows-msvc` (XP) | ✓ | | | Windows XP support |
| `x86_64-pc-windows-msvc` (XP) | ✓ | | | Windows XP support |

이 목록은 더 추가 될 수 있고, 여기 나열된 것들만 3단계 플랫폼이란 건 아닙니다!


## 리눅스와 맥에서의 러스트 설치

당신이 리눅스 또는 맥을 쓰고 있다면, 설치를 위해 할 것은 다음의 명령어를 터미널에 입력하는 것뿐입니다.

```bash
$ curl -sSf https://static.rust-lang.org/rustup.sh | sh
```

이것은 설치 스크립트를 다운로드하여 설치를 진행하게 해줄 것입니다. 그리고 이 작업이 모두 잘 진행된다면 다음의 메시지가 나타날 것입니다.

```text
Welcome to Rust.

This script will download the Rust compiler and its package manager, Cargo, and
install them to /usr/local. You may install elsewhere by running this script
with the --prefix= option.

The installer will run under ‘sudo’ and may ask you for your password. If you do
not want the script to run ‘sudo’ then pass it the --disable-sudo flag.

You may uninstall later by running /usr/local/lib/rustlib/uninstall.sh,
or by running this script again with the --uninstall flag.

Continue? (y/N)
```

여기서 `y` (예)를 입력하고 편안히 설치를 기다리시면 됩니다.

## 윈도우에서의 러스트 설치

당신이 윈도우를 사용하고 있다면, 윈도우용 인스톨러를 받아서 사용해주세요 [installer][install-page].

[install-page]: https://www.rust-lang.org/install.html

## 러스트 제거

러스트를 제거하는 방법은 굉장히 쉽습니다. 리눅스와 맥에서 단지 언인스톨러 스크립트를 실행하기만 하면 됩니다.

```bash
$ sudo /usr/local/lib/rustlib/uninstall.sh
```

만약 당신이 윈도우의 편리한 인스톨러의 노예라면, 다시 `.msi`확장자를 가진 러스트 인스톨러를 다시 실행하여 제거 버튼을 누르면 됩니다.

## 문제 해결

러스트를 인스톨한 후 터미널을 열어 다음 명령어를 실행해 보십시오.

```bash
$ rustc --version
```

러스트의 버전과, 커밋 해쉬, 커밋 날짜가 보여야 러스트가 성공적으로 인스톨 된 것입니다!

만약 당신이 윈도우즈를 사용하고 위 작업에 실패하셨다면, 시스템 %PATH% 변수 안에 러스트 설치 경로가 들어있는지 확인하세요: `$ echo %PATH%`. 설치경로가 포함돼있지 않으면, 인스톨러를 다시 실행하여, "Change, repair, or remove installation" 페이지에서 "Change"를 선택하고 "Add to PATH"가 로컬 하드 드라이브에 설치되었는지 확인하세요. 직접 경로를 추가해야 할 경우에는, 러스트의 실행파일들을 "C:\Program Files\Rust stabel GNU 1.x\bin"와 같은 디렉토리에서 발견하실 수 있을 겁니다.

러스트는 자체적으로 링킹(linking)을 하지 않아서 사용자가 링커를 설치해야합니다. 설치는 특정 시스템에 의존성이 있는 만큼 더 자세한 내용은 해당 시스템의 문서를 참고하시기 바랍니다.

설치가 되지않았을 경우, 도움을 받을 수 있는 곳이 여럿있습니다. 가장 쉬운곳은 [irc.mozilla.org의 #rust-beginners IRC 채널][beginner]이고 일반적인 토론은 [irc.mozilla.org의 #rust IRC 체널][irc] 입니다. IRC 클라이언트는 [Mibbit][mibbit] 을 사용하실 수 있습니다. IRC를 통해 다른 러스테이시언(Rustaceans) (러스트 사용자를 부르는 다소 웃기는 별명)들과 대화를 통해 도움을 받을 수 있습니다. 다른 곳으론, [사용자 포럼][users]과 [(우리들의 친구) Stack Overflow][stackoverflow]가 있습니다.

[beginner]: irc://irc.mozilla.org/#rust-beginners
[irc]: irc://irc.mozilla.org/#rust
[mibbit]: http://chat.mibbit.com/?server=irc.mozilla.org&channel=%23rust
[users]: https://users.rust-lang.org/
[stackoverflow]: http://stackoverflow.com/questions/tagged/rust

러스트 인스톨러는 자동적으로 공식 문서를 로컬에 저장해줍니다. 유닉스 기반 운영체제라면 `/usr/local/share/doc/rust`에, 윈도우 기반이라면 `(러스트 인스톨 경로)/share/doc`에서 찾을 수 있습니다.

# Hello, world!

이제 러스트를 설치했으니, 간단한 첫 프로그램을 만들어 봅시다. 암묵적인 세계적 프로그래머 전통을 따라서 우리는 작고 아름다운 _(모두가 아는.)_ 'Hello, world!' 프로그램을 만들어 볼 것입니다.

이러한 작은 프로그램을 만들어보는 건 컴파일러가 잘 작동하는지 확인할 수 있습니다. 그리고 화면에 문자를 출력하는 건 가장 일반적인 것들임으로 빨리해볼수록 좋죠.

> 참고: 이 문서는 기본적으로 터미널에서 작업하는 것을 전제로 쓰여있습니다. 러스트는 러스트자체의 코딩 툴이 없습니다. 하지만 러스트를 지원하는 [SolidOak][soak]라는 IDE가 존재합니다. 그리고 커뮤니티에는 사용자들이 개발한 수많은 확장기능들이 있고, 러스트 재단에서 [수많은 에디터][various editors]들을 위한 러스트 플러그인을 제공합니다. 당신이 사용하는 IDE나 에디터들의 설정은 이제부터 진행할 튜토리얼과는 조금 다른 모양과 설정을 가지고 있을 수 있습니다. 그러니 IDE나 추가 에디터를 사용할 경우 적절히 설정을 변경해서 사용해주십시오.

[soak]: https://github.com/oakes/SolidOak
[various editors]: https://github.com/rust-lang/rust/blob/master/src/etc/CONFIGS.md

## 프로젝트 파일 생성

첫째로, 러스트 코드를 만들어 봅시다. 러스트는 당신이 어디서 코드를 만들든 볶든 우리든 상관하지 않지만, 우리들은 새로운 프로젝트 폴더를 당신의 홈디렉터리에 생성할 것을 권장합니다. 다음의 명령어들은 간단히 프로젝트 폴더를 생성하는 법을 소개합니다.

```bash
$ mkdir ~/projects
$ cd ~/projects
$ mkdir hello_world
$ cd hello_world
```

> 참고: 당신이 윈도우에서 파워셀이 아닌 명령프롬포트를 사용하고 있다면, `~`문자는 작동하지 않을 것입니다.

## 러스트 프로그램을 작성하고 실행하기

다음으로, 새로운 소스 파일을 만들고 *main.rs*로 이름을 작성해주십시오. 러스트 소스 파일은 항상 *.rs*를 확장자로 가집니다. 만약 당신의 파일 이름에 한 단어 이상 사용했다면, 스페이스 대신 밑줄문자 *_* 를 사용해주십시오. 예로, *wonderful rust language.rs* 를 *wonderful_rust_language.rs* 로 작성해주십시오.

이제 *main.rs*파일을 열어서 다음의 코드를 입력해봅시다.

```rust
fn main() {
println!("Hello, world!");
}
```

파일을 빌드하기 위해서는 터미널로 일단 돌아갑니다. 당신이 리눅스와 맥을 사용하고 있다면 다음 명령어들을 실행해주세요.

```bash
$ rustc main.rs
$ ./main
Hello, world!
```

당신의 운영체제가 윈도우라면, 위 명령어 중에서 그저 `main` 을 `main.exe`로 바꾸면 됩니다. 그리고 빌드 후에는 당신의 운영체제와 상관없이 터미널에 `Hello, world!` 가 출력될 것입니다. 이것이 성공했다면, 이 텍스트는 당신이 첫 러스트로 출력한 텍스트가 된 것입니다! 러스트의 세계로 오신 당신을 정말 환영합니다!

## 러스트 프로그램의 해부

지금부터, 방금 작성한 "Hello, world" 프로그램에 대해 자세하게 설명하도록 하겠습니다. 그럼 첫 줄부터 보시죠.

```rust
fn main() {

}
```

이 코드 라인들은 러스트에서의 *함수*를 정의하고 있습니다. 이 `main`함수는 특별합니다: 이 함수는 모든 러스트 프로그램의 시작점입니다. 코드의 첫 줄은 "난 이름이 `main`이고 아무 매개변수도 필요로 하지 않으며 아무것도 리턴하지 않는 함수를 정의하고 있어요" 라고 말하고 있습니다. 만약 매개변수가 있다면 소괄호 기호`(` 와 `)` 사이로 들어가면 됩니다. 그리고 우리는 이 함수에서 아무것도 리턴을 하지 않을 것이니까, 우리는 리턴타입을 통째로 생략할 수 있습니다.

또한 함수 본문은 중괄호 `{` 와 `}`로 쌓여있습니다. 러스트는 모든 함수의 몸체를 중괄호로 둘러싸는 것을 요구합니다. 함수 선언과 같은 줄에 한 칸의 스페이스를 두고 중괄호를 여는 것이 좋은 코드 스타일이라 여겨집니다.

`main()` 함수 안에서:

```rust
println!("Hello, world!");
```

이 줄에서 이 작은 프로그램이 하는 모든 일이 실행됩니다: 화면에 텍스트를 띄우는 일이요. 이 한 줄에는 주목할 점이 꽤 많습니다. 그 중 첫번째는, 들여쓰기가 탭이 아니라 스페이스 네 개로 되어 있다는 점입니다.

두번째 주목해야 할 것은 `println!()` 부분입니다. 이것은 러스트의 *[매크로]*라고 부르는데 이걸로 러스트에서 메타프로그래밍을 합니다. 만약 이것 대신 함수를 호출하려 했다면`println()`(!가 없습니다)라고 썼겠죠. 러스트의 매크로에 관해서는 나중에 좀더 자세히 다루겠지만, `!`가 붙으면 그건 그냥 함수가 아니라 매크로라는 점은 알아두세요.

[매크로]: macros.html

다음은 *string*인 `"Hello, world!"` 부분입니다. string은 시스템 프로그래밍 언어에서 무척이나 복잡한 부분인데, 이것은 *[정적으로 할당된]* string입니다. 이 string을 `println!`에 인자로 전달하면 `println!()`이 받은 string을 화면에 띄워줍니다. 쉽죠?

[정적으로 할당된]: the-stack-and-the-heap.html

다음 줄은 세미콜론(`;`)으로 끝납니다. 러스트는 대부분의 것들이 문(statement)보다 식(expression)인 *[표현식 지향]*적인 언어입니다. `;`는 표현식이 끝났고 다음 표현식이 시작할 준비가 되었다는 것을 가리킵니다. 러스트 코드의 대부분의 줄은 `;`로 끝납니다.

[표현식 지향]: glossary.html#expression-oriented-language

## 컴파일과 실행은 다른 단계로 이루어짐

"러스트 프로그램을 작성하고 실행하기"에서 갓 만든 프로그램을 실행해보았습니다. 이제 각각의 단계들을 하나씩 파헤쳐봅시다.

러스트 프로그램을 실행하기 전에 먼저 컴파일을 해야 합니다. 명령어 `rustc` 뒤에 소스파일의 이름을 입력하면 러스트 컴파일러를 사용할 수 있습니다. 이렇게요.

```bash
$ rustc main.rs
```

C나 C++을 배웠다면 `gcc`나 `clang`이랑 비슷하게 느껴질 것입니다. 성공적으로 컴파일을 했으면 러스트는 바이너리 실행파일을 결과물로 내놓을 것입니다. Linux나 OSX의 셸에서 `ls` 명령으로 보면 이렇게 보입니다.

```bash
$ ls
main main.rs
```

윈도우에서는 이렇게 보입니다.

```bash
$ dir
main.exe main.rs
```

두 파일이 있는데, 하나는 `.rs` 확장자를 갖는 소스코드이고, 다른 하나가 실행파일입니다(윈도우에서는 `main.exe`, 다른 데서는 `main`). 이제 `main`이나 `main.exe` 파일을 실행하기만 하면 됩니다. 이렇게요.

```bash
$ ./main # or main.exe on Windows
```

*main.rs*가 "Hello, world!" 프로그램이면 터미널에 `Hello, world`를 띄울 겁니다.

루비나 파이썬, 자바스크립트같은 동적 언어를 배웠다면 컴파일과 실행과정이 분리되어 있는 것에 익숙치 않을 지도 모릅니다. 러스트는 *AOT 컴파일* 언어입니다. 그렇기 때문에 프로그램을 컴파일해서 누군가에게 주면 그 사람은 러스트가 깔려있지 않아도 그 프로그램을 실행할 수 있습니다. 만약에 `.rb`, `.py`, `.js` 파일을 준다면 각각 루비, 파이썬, 자바스크립트가 깔려있어야 실행할 수 있겠죠. 대신 컴파일하고 실행을 동시에 한 명령어로 수행할 수 있습니다. 프로그래밍 언어 디자인에서 모든 것은 등가교환입니다.

간단한 프로그램일때는 `rustc`로 그냥 컴파일하는 것이 편하지만 프로젝트가 커지면 프로젝트의 옵션들을 관리하고 소스를 관리하는 것을 좀더 쉽게 하고싶어질 것입니다. 이제, 진짜 러스트 프로그램을 쓰는 것을 도와줄 Cargo를 소개합니다.

# Hello, Cargo!

카고는 러스트의 빌드 시스템이자 패키지 매니저입니다. 러스트인들은 그들의 러스트 프로젝트를 관리하는데 카고를 사용합니다. 카고는 다음 세가지를 관리해줍니다. 코드를 빌드하고, 의존성이 있는 라이브러리를 다운로드하고, 그 라이브러리를 빌드합니다. 코드가 호출하고 있는 라이브러리를 '의존성'이라고 합니다. 코드가 거기에 의존하고 있으니까요.

가장 간단한 러스트 프로그램은 의존성이 없기 때문에 바로 함수를 작성하면 됩니다. 좀더 정교한 러스트 프로그램을 짜기 시작하면 의존성을 더하게 될텐데 이때 카고를 사용하면 훨씬 쉬워집니다.

거의 대부분의 러스트 프로젝트는 카고를 사용하고, 아마 이 책의 나머지 부분에서도 쭉 사용할 것입니다. 러스트 공식 인스톨러를 사용했다면 러스트와 함께 카고도 깔렸을 것입니다. 러스트를 다른 방법으로 설치했다면 이렇게 터미널에 쳐서 카고가 깔려있는지 체크해야 합니다.

```bash
$ cargo --version
```

버전이 보이면, 좋습니다! '`command not found`' 따위의 에러가 보이면, 러스트가 설치된 시스템의 매뉴얼을 보고 카고가 빠져있는지 확인해야 합니다.

## Cargo로 변환하기

이제 Hello World 프로그램을 Cargo로 변환 해봅시다. Cargo 프로젝트로 만들기 위해서 필요한 것들은 다음에 나열했습니다.

1. 당신의 소스를 정확한 폴더에 집어넣어 주십시오.
2. 이전에 만든 실행 파일을 지워 주십시오. _(윈도우라면 `main.exe`을, 다른 운영체제라면 `main` 을 지워 주시면 됩니다)_
3. Cargo 설정 파일을 생성합니다.

자, 시작해봅시다!

### 새로운 실행 파일과 소스 폴더를 생성하기

앞서, 터미널로 돌아가서 당신의 *hello_world* _(프로젝트 폴더)_ 폴더로 이동합니다. 그리고 다음의 명령어들을 실행합니다.

```bash
$ mkdir src
$ mv main.rs src/main.rs
$ rm main # or 'del main.exe' on Windows
```

카고는 소스파일들이 *src* 디렉터리에 있을 것이라 전제하기 때문에 먼저 그것부터 해결해야 합니다. 프로젝트의 최상위 디렉터리에는(이 경우는 *hello_world*) README, 라이센스 정보, 기타 코드랑 관련없는 것들만 남겨둡니다. 이렇게 해서 카고는 프로젝트를 깔끔하게 유지하는걸 도와줍니다. 만물에는 제자리가 있는 법이니까요.

이제 *main.rs* 파일을 *src* 디렉터리로 복사하고, `rustc` 명령어로 컴파일된 파일을 삭제합니다. 물론 윈도우에서는 `main`이 아니라 `main.exe`입니다.

이 예제에서는 실행파일을 만들기 때문에 소스파일 이름을 `main.rs`로 그대로 두었습니다. 실행파일이 아니라 라이브러리를 만들때는 파일 이름을 `lib.rs`로 해야 합니다. 이 전통은 카고가 성공적으로 컴파일하는데 사용되지만 원한다면 바꿀 수도 있습니다.

### 설정 파일 생성하기

다음에는 *hello_world* 디렉터리에 새 파일을 만들고 이름을 이렇게 짓습니다.
`Cargo.toml`.

`Cargo.toml` 안의 `C`가 대문자임에 주의하세요. 안그러면 카고가 설정파일을 인식하지 못합니다.

이 파일은 *[TOML]* 형식을 따릅니다. TOML은 INI와 비슷하지만 몇가지 장점이 있어서 카고의 설정 파일 형식으로 사용됩니다.

[TOML]: https://github.com/toml-lang/toml

이 파일을 대신해서, 다음의 것들을 입력해주세요.

```toml
[package]

name = "hello_world"
version = "0.0.1"
authors = [ "Your name " ]
```

첫째줄에서 `[package]`는 다음 구문들이 패키지의 설정이라는 것을 알려줍니다. 이 파일에 뭔가 다른 정보를 더하면 다른 섹션을 사용하게 되겠지만 지금은 그냥 패키지 설정 뿐입니다.

나머지 세 줄은 카고가 프로그램을 컴파일하는데 필요한 정보를 알려줍니다. 이름, 버전정보, 그리고 쓴 사람을요.

이 정보들을 *Cargo.toml* 파일에 쓰고 나면 저장해서 설정을 마치세요.

## Cargo프로젝트를 빌드하고 실행하기

*Cargo.toml* 파일이 프로젝트 루트 디렉터리에 있으면 Hello World 프로그램을 빌드하고 실행할 준비가 된겁니다! 그렇게 하려면 다음 명령어를 치세요.

```bash
$ cargo build
Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world)
$ ./target/debug/hello_world
Hello, world!
```

모두 잘 작동했다면, `Hello, world!`라는 문자열이 당신의 터미널에 출력될 것입니다.

당신은 방금 `cargo build` 명령어로 프로젝트를 빌드했고,
빌드한 결과물은 `./target/debug/hello_world`에 있을 것입니다. 하지만 사실 빌드한 후 빌드한 결과물을 확인, 실행하는 것은 `cargo run` 명령어로 간단히 할 수 있습니다.

```bash
$ cargo run
Running `target/debug/hello_world`
Hello, world!
```

이 예제가 프로젝트를 다시 빌드하지 않았다는 사실을 주목해주세요. 카고는 파일이 바뀌지 않았다는 것을 알아차리고는 그냥 바이너리를 실행했습니다. 만약 소스코드를 바꿨다면 카고는 실행하기 전에 프로젝트를 리빌드할거고 다음과 같은 메시지가 뜰 것입니다.

```bash
$ cargo run
Compiling hello_world v0.0.1 (file:///home/yourname/projects/hello_world)
Running `target/debug/hello_world`
Hello, world!
```

Cargo는 자동으로 어느 프로젝트 파일이 수정되었는지 확인하고, 수정된 코드만 다시 빌드합니다.

간단한 프로젝트에서 카고는 단순히 `rustc`를 여러 번 실행할 뿐입니다. 하지만 나중에는 유용하게 쓰일겁니다. 여러 개의 크레이트가 있는 복잡한 프로젝트는 카고가 빌드를 관리하게 냅두는게 훨씬 쉽습니다. 카고가 있으면 그냥 `cargo build`만 실행시키면 제대로 작동할 것입니다.

## 프로그램 릴리즈

프로그램이 마침내 배포될 때가 오면 프로젝트를 최적화 옵션을 켜고 컴파일하기 위해 `cargo build --release` 명령어를 칩니다. 이 최적화는 러스트 코드의 속도를 향상시키지만 이것을 켜 놓으면 컴파일이 더 오래걸립니다. 그렇기 때문에 개발을 위한 컴파일과 배포를 위한 컴파일이 따로 있는 것입니다.

## `Cargo.lock`은 무엇입니까?

`cargo build` 명령어를 실행시키는 것은 또한 *Cargo.lock*이라는 새로운 파일을 만듭니다. 그 내용은 다음과 같습니다.

```toml
[root]
name = "hello_world"
version = "0.0.1"
```

카고는 *Cargo.lock* 파일을 애플리케이션의 의존성을 추적하는데 사용합니다. 이게 Hello World 프로젝트의 *Cargo.lock* 파일입니다. 이 프로젝트는 의존성이 없기 때문에 파일이 텅 비어있습니다. 현실적으로 이 파일을 직접 만질 필요는 거의 없습니다. 그냥 카고가 작성하도록 냅두세요.

이게 답니다! 잘 따라왔다면 성공적으로 `hello_world`를 카고로 빌드할 수 있을 겁니다.

이 프로젝트는 무척 간단하지만 러스트 인생에서 사용할 툴의 대부분을 사용하고 있습니다. 사실상 대부분의 러스트 프로젝트를 시작할 때는 다음 명령어를 약간씩만 바꾼다고 볼 수 있습니다.

```bash
$ git clone someurl.com/foo
$ cd foo
$ cargo build
```

## 무작정 따라하는 Cargo프로젝트 만들기

앞의 길고 긴 방법은 너무나도 번거롭습니다. _당신도 공감하리라 믿습니다._ 하지만 사실, 당신은 앞서 보여드린 번거롭디번거로운 과정을 매 새 프로젝트를 시작 할 때마다 하지 않아도 됩니다. Cargo는 쉽고 빠르게 당신이 정확하게 개발을 시작할 수 있도록 프로젝트 폴더를 구성해줍니다.

새 Cargo 프로젝트를 생성하려면, `cargo new`명령어를 실행하면 됩니다.

```bash
$ cargo new hello_world --bin
```

이 프로젝트는 라이브러리가 아니라 실행 프로그램을 만들 것이기 때문에 `--bin` 옵션을 붙였습니다. 실행파일은 *바이너리*라고도 불립니다(유닉스 시스템의 `/usr/bin` 안에 있는 것처럼).

카고는 두 개의 파일과 하나의 디렉터리를 만들었습니다. `Cargo.toml` 파일과 *src* 디렉터리, 그리고 그 안에 들어있는 *main.rs* 파일입니다. 이것들이 익숙해보인다면, 우리가 방금 전 위에서 직접 만들었으니까 당연합니다.

이 결과물이 시작할 때 필요한 전부입니다. 먼저 `Cargo.toml` 파일을 열면 이렇게 되어있을 것입니다.

```toml
[package]

name = "hello_world"
version = "0.1.0"
authors = ["Your Name "]
```

카고는 *Cargo.toml*에 주어진 조건에 맞는 디폴트들과 `git` 전역 설정을 작성했을 것입니다. 카고는 또한 `hello_world` 디렉터리를 만들 때 `git` 레포지터리를 시작합니다.

`src/main.rs`에는 다음의 코드가 작성돼 있을 것입니다:

```rust
fn main() {
println!("Hello, world!");
}
```

Cargo는 당신을 위해서 "Hello world!"를 먼저 생성해 둘 것입니다. 이제 당신이 코딩할 차례입니다!

> 참고: Cargo에 대해 더 궁금하다면, 공식 [Cargo 문서][Cargo guide]를 참고 하시면 좋습니다.

[Cargo guide]: http://doc.crates.io/guide.html

# 마치며

이 챕터는 기본적으로 당신의 러스트와 함께하는 시간이 목적입니다. 자, 이제 당신은 충분히 러스트와 함께 쉬고 대화했으니, 이젠 러스트가 말할 차례입니다.

당신은 두 가지 선택지가 있습니다. 바로 [러스트와 함께하는 새로운 프로젝트][learnrust]를 시작하거나, 처음부터 [러스트의 문법][syntax]을 배우며 입문하는 것입니다. 많은 경험자들 _(사실 거의 모든 이 문서의 독자들)_ 러스트와 함께하는 새로운 프로젝트를 선호할 것입니다. 뭐 사정 다른 사람은 다른 선택지를 선택하게 되겠죠! 뭐, 저에게 당신이 무엇을 아는지 모르는지가 중요한가요. 당신이 원하는 대로 하시면 됩니다.

[learnrust]: learn-rust.html
[syntax]: syntax-and-semantics.html